📄 7-1.asm
字号:
; 多机通信,主机和从机通信程序
M10: MOV SCON,#0D8H ;设置串行口方式3,允许接收,TB8设置为1
M101: MOV A,R2 ;发送地址帧
MOV SBUF,A
JNB RI,$ ;等待从机应答
CLR RI
MOV A,SBUF
XRL A,R2 ;判断应答地址是否符合
JZ M103
M102: SETB TB8
MOV SBUF,#0FFH ;不相符时重新通信
JNB TI,$
CLR TI
SJMP M101
M103: CLR TB8 ;地址符合时,准备发送命令
MOV SBUF,R3 ;发送命令
JNB RI,$ ;等待从机应答
CLR RI
MOV A,SBUF
JNB ACC.7,M104 ;判断命令是否出错
SJMP M102 ;若从机接收命令出错,重新通信
M104: CJNE R3,#00,M105 ;判断是否要求从机接收数据
JNB ACC.0,M102 ;从机是否已经准备接收数据
SEND: MOV SBUF,@R0 ;主机发送数据
JNB TI,$ ;发送数据
CLR TI
INC R0 ;修改地址
DJNZ R4, SEND ;判断数据是否发送完成
RET ;返回主程序
M105: JNB ACC.1,M102 ;从机发送数据准备就绪
REC: JNB RI, REC ;等待接收完毕
CLR RI
MOV A,SBUF
MOV @R1,A
INC R1
DJNZ R4, REC
RET
S10: CLR RI
PUSH A ;保护现场
PUSH PSW
MOV A,SBUF
XRL A,#SLAVE ;比较接收到的地址与本机地址
JZ SI01 ;判断两个地址是否相同
RETU: POP PSW ;恢复现场
POP A
RETI
SI01: CLR SM2 ;地址相同,与主机继续通信,准备接收主机发送的数据
MOV SBUF,#SLAVE ;从机地址返回给主机
JNB RI,$ ;等待接收完数据
CLR RI
JNB RB8,SI02 ;是数据帧,跳转
SETB SM2 ;是复位信号,把SM2设置为1
SJMP RETU
SI02: MOV A,SBUF
CJNE A,#02, ERR
ERR: JC SI03
MOV SBUF,#80H ;非法命令,发送错误字节。
SJMP RETU
SI03: JZ CMD0 ;A = 00H,准备接收数据
CMD1: JB F0,SI04 ;发送准备就绪了吗?
MOV SBUF,#00H ;发送准备未完成,回复主机
SJMP RETU
SI04: MOV SBUF,#02H ;发送准备就绪,发送准备字节给主机
CLR F0 ;清除准备发送标志
SSEND: MOV SBUF,@R0 ;发送数据
JNB TI,$
CLR TI
INC R0
DJNZ R2, SSEND
SETB SM2 ;发送完成,设置SM2 = 1
SJMP RETU
CMD0: JB F1,SI05 ;接收准备完成了吗?
MOV SBUF,#00H ;接收准备未完成
SJMP RETU
SI05: MOV SBUF,#01H ;接收准备就绪,发送准备字节给主机
CLR F1
SREC: JNB RI, SREC ;接收数据
CLR RI
MOV @R1,SBUF
INC R1
DJNZ R2,LP2
SETB SM2 ;接收完数据,设置SM2=1
SJMP RETU
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -