cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 1704|回复: 0

一个双(多)机通信程序

[复制链接]
发表于 2004-11-6 03:19:06 | 显示全部楼层 |阅读模式
;****************************************
;文件:Transmission.asm
;功能:AVR双CPU通信程序,异步方式,类似于UART
;器件:AT90S2313
;硬件:主从CPU的PD.2通过上拉电阻连接
;时钟:4.0MHz
;设计:Lindong
;日期:2003年8月8日
;****************************************
.include"2313def.inc"

.equ port =PORTD
.equ pin =PIND
.equ ddr =DDRD
.equ bit =2
;*****************************************
;中断向量表
;*****************************************
.org 0x000
rjmp main
rjmp INT0_isr
reti
reti
reti
reti
reti
reti
reti
reti
;*****************************************
;程序入口
;*****************************************
.org 0x000B
main: ldi R16,0xDF ;设置堆栈指针
out spl,R16

cbi port,bit ;设置端口方向
cbi ddr,bit

ldi R16,0x02 ;INT0 下降沿有效
out MCUCR,R16
ldi R16,0x40 ;INT0 中断使能
out GIMSK,R16

sei ;全局中断使能

ldi R28,0x60
ldi R29,0x00
ldi R22,0x10

here: ldi R30,0x55 ;测试
rcall sendbyte
rjmp here
;*****************************************
;过程名:Delay
;功能:us级别精确延时
;入口参数:R16 延时时间微秒数-2
;出口参数:无
;影响资源:
;*****************************************
delay: dec R16
nop
brne delay
nop
ret
;*****************************************
;外部中断INTI0中断服务程序(读数)
;*****************************************
INT0_isr:
ldi R16,0x49 ;延时 75us
rcall delay
sbic pin,bit
rjmp skip
clr R30
rcall readbit ;Clock 1
rcall readbit ;Clock 2
mov R31,R30

ldi R20,0x08
RNext: rcall readbit ;读数
dec R20
brne RNext

deal: nop ;数据处理,数据存放在R30中,两个时钟信号存在R31
的高两位

skip: reti ;非起始信号,跳过
;*****************************************
;过程名:readbit
;功能:从总线上读取一位数据
;入口参数:无
;出口参数:R30
;影响资源:R16
;*****************************************
readbit:
ldi R16,0x08 ;延时10us
rcall delay

waitu1: sbis pin,bit ;Wait for "1"
rjmp waitu1
waitu2: sbis pin,bit ;Wait for "1"
rjmp waitu2
waitu3: sbis pin,bit ;Wait for "1"
rjmp waitu3
waitu4: sbis pin,bit ;Wait for "1"
rjmp waitu4

waitf1: sbic pin,bit ;Wait for the falling edge
rjmp waitf1
waitf2: sbic pin,bit ;Wait for the falling edge
rjmp waitf2
waitf3: sbic pin,bit ;Wait for the falling edge
rjmp waitf3
waitf4: sbic pin,bit ;Wait for the falling edge
rjmp waitf4

ldi R16,0x2B ;延时 45us
rcall delay

clc ;清 C
sbis pin,bit
sec

ror R30 ;存数

ret
;*****************************************
;过程名:sendbit
;功能:传出一位数据
;入口参数:R30
;出口参数:无
;影响资源:
;*****************************************
sendbit:
sbrs R30,0
rjmp send0
send1: sbi ddr,bit ;Send a "1"
ldi R16,0x3A
rcall delay
cbi ddr,bit
ldi R16,0x1C
rcall delay
ret
send0: sbi ddr,bit ;Send a "0"
ldi R16,0x1C
rcall delay
cbi ddr,bit
ldi R16,0x3A
rcall delay
ret
;*****************************************
;过程名:sendbyte
;功能:传出一个字节数据
;入口参数:R30
;出口参数:无
;影响资源:R24
;*****************************************
sendbyte: ;测试总线是否忙
sbis pin,bit
rjmp sendbyte
ldi R16,0x76 ;延时 120us
rcall delay
sbis pin,bit ;测试
rjmp sendbyte

cli ;关中断

sbi ddr,bit ;总线初始化
ldi R16,0x58 ;延时 90us
rcall delay
cbi ddr,bit
ldi R16,0x1C ;延时 30us
rcall delay

sbi ddr,bit ;Clock 1
ldi R16,0x3A ;延时 60us
rcall delay
cbi ddr,bit
ldi R16,0x1C ;延时 30us
rcall delay

sbi ddr,bit ;Clock 2
ldi R16,0x1C
rcall delay ;延时 30us
cbi ddr,bit
ldi R16,0x3A ;延时 60us
rcall delay

ldi R24,0x08 ;设置计数器
nextbit:
rcall sendbit ;输出数据
ror R30
dec R24
brne nextbit

ldi R16,0xFF ;清中断标志
out GIFR,R16
sei ;开中断

ret
;*****************************************
;This is the end

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-4-4 20:05 , Processed in 0.766434 second(s), 7 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表