一个51单片机做的双击通讯汇编程序 调试通过 proteus仿真+源代码 给51黑电子论坛的朋友们分享下.
所有资料下载:
单片机与单片机之间的串口通信.zip
(39.38 KB, 下载次数: 30)
发送程序:
- ;本程序收发数据采用查询方式
- ORG 0000H
- AJMP START
- ORG 0030H
- START:MOV 30H,#0C0H ;传送的16个数据(0~F)
- MOV 31H,#0F9H
- MOV 32H,#0A4H
- MOV 33H,#0B0H
- MOV 34H,#99H
- MOV 35H,#92H
- MOV 36H,#82H
- MOV 37H,#0F8H
- MOV 38H,#80H
- MOV 39H,#90H
- MOV 3AH,#88H
- MOV 3BH,#83H
- MOV 3CH,#0C6H
- MOV 3DH,#0A1H
- MOV 3EH,#086H
- MOV 3FH,#08EH
- MOV TMOD,#20H ;定时器1置为方式2
- MOV TH1,#0F4H ;装载定时器初值,波特率2400
- MOV TL1,#0F4H
- CLR EA
- SETB TR1 ;启动定时器
- MOV PCON,#00H
- MOV SCON,#50H ;设定串口方式1,且准备接收应答信号
- LOOP1:MOV SBUF,#0E1H ;发联络信号
- JNB TI,[ DISCUZ_CODE_4 ]nbsp; ;等待一帧发送完毕
- CLR TI ;允许再发送
- JNB RI,[ DISCUZ_CODE_4 ]nbsp; ;等待2号机的应答信号
- CLR RI ;允许再接收
- MOV A,SBUF ;2号机应答后,渎至A
- XRL A,#0E2H ;判断2号机是否准备完毕
- JNZ LOOP1 ;2号机未准备好,继续联络
- LOOP2:MOV R0,#30H ;2号机准备好,设数据块指针初值
- MOV R7,#10H ;设定数据块长度初值
- MOV R6,#00H ;清校验和单元
- LOOP3:MOV SBUF,@R0 ;发送一个数据字节
- MOV A,R6
- ADD A,@R0 ;求校验和
- MOV R6,A ;保存校验和
- INC R0
- JNB TI,$
- CLR TI
- DJNZ R7,LOOP3 ;整个数据块是否发送完毕
- MOV SBUF,R6 ;发送校验和
- JNB TI,$
- CLR TI
- JNB RI,[ DISCUZ_CODE_4 ]nbsp; ;等待2号机的应答信号
- CLR RI
- MOV A,SBUF ;2号机应答,读至A
- JNZ LOOP2 ;2号机应答”错误“,转重新发送
- RET ;2号机应答”正确“,返回
复制代码
接受程序:
- ;本程序收发数据采用查询方式
- ORG 0000H
- AJMP START
- ORG 0030H
- START:MOV TMOD,#20H ;定时器1置为方式2
- MOV TH1,#0F4H ;装载定时器初值,波特率2400
- MOV TL1,#0F4H
- CLR EA
- SETB TR1 ;启动定时器
- MOV PCON,#00H
- MOV SCON,#50H ;设定串口方式1,且准备接收
- LOOP1:JNB RI,[ DISCUZ_CODE_5 ]nbsp; ;等待1号机的联络信号
- CLR RI
- MOV A,SBUF ;收到1号机信号
- XRL A,#0E1H ;判是否为1号机联络信号
- JNZ LOOP1 ;不是一号机联络信号,再等待
- MOV SBUF,#0E2H ;是1号机联络信号,发应答信号
- JNB TI,$
- CLR TI
- MOV R0,#30H ;设定数据快地址指针初值
- MOV R7,#10H ;设定数据块长度初值
- MOV R6,#00H ;清校验和单元
- LOOP2:JNB RI,$
- CLR RI
- MOV A,SBUF
- MOV @R0,A ;接收数据转储
- INC R0
- ADD A,R6 ;求校验和
- MOV R6,A
- DJNZ R7,LOOP2 ;判断数据块是否接收完毕
- JNB RI,[ DISCUZ_CODE_5 ]nbsp; ;完毕,接收1号机发来的校验和
- CLR RI
- MOV A,SBUF
- XRL A,R6 ;比较校验和
- JZ END1 ;校验和相等,跳至发正确标志
- MOV SBUF,#0FFH ;校验和不相等,发错误标志
- JNB TI,[ DISCUZ_CODE_5 ]nbsp; ;转重新接收
- CLR TI
- SJMP LOOP2
- END1: MOV SBUF,#00H
- JS1: MOV R0,#30H ;显示接到的数据
- JS3: MOV A,@R0
- MOV P0,A
- ACALL DELAY
- INC R0
- MOV A,R0
- CJNE A,#40H,JS2
- AJMP JS1
- JS2: AJMP JS3
- DELAY: MOV R4,#04H
- D1: MOV R7,#0FFH
- D2: MOV R6,#0FFH
- DJNZ R6,$
- DJNZ R7,D2
- DJNZ R4,D1
- RET
- END
复制代码
|