×
单片机 > 单片机程序设计 > 详情

AVR双CPU通信程序(异步方式)UART

发布时间:2020-06-19 发布时间:
|

;****************************************  
;功能:AVR双CPU通信程序,异步方式,类似于UART  
;器件:AT90S2313  
;硬件:主从CPU的PD.2通过上拉电阻连接  
;时钟:4.0MHz   
;****************************************  

.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  


关键字:AVR  双CPU通信  异步方式  UAR

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址