?? 7-1.asm
字號:
; 多機(jī)通信,主機(jī)和從機(jī)通信程序
M10: MOV SCON,#0D8H ;設(shè)置串行口方式3,允許接收,TB8設(shè)置為1
M101: MOV A,R2 ;發(fā)送地址幀
MOV SBUF,A
JNB RI,$ ;等待從機(jī)應(yīng)答
CLR RI
MOV A,SBUF
XRL A,R2 ;判斷應(yīng)答地址是否符合
JZ M103
M102: SETB TB8
MOV SBUF,#0FFH ;不相符時(shí)重新通信
JNB TI,$
CLR TI
SJMP M101
M103: CLR TB8 ;地址符合時(shí),準(zhǔn)備發(fā)送命令
MOV SBUF,R3 ;發(fā)送命令
JNB RI,$ ;等待從機(jī)應(yīng)答
CLR RI
MOV A,SBUF
JNB ACC.7,M104 ;判斷命令是否出錯(cuò)
SJMP M102 ;若從機(jī)接收命令出錯(cuò),重新通信
M104: CJNE R3,#00,M105 ;判斷是否要求從機(jī)接收數(shù)據(jù)
JNB ACC.0,M102 ;從機(jī)是否已經(jīng)準(zhǔn)備接收數(shù)據(jù)
SEND: MOV SBUF,@R0 ;主機(jī)發(fā)送數(shù)據(jù)
JNB TI,$ ;發(fā)送數(shù)據(jù)
CLR TI
INC R0 ;修改地址
DJNZ R4, SEND ;判斷數(shù)據(jù)是否發(fā)送完成
RET ;返回主程序
M105: JNB ACC.1,M102 ;從機(jī)發(fā)送數(shù)據(jù)準(zhǔn)備就緒
REC: JNB RI, REC ;等待接收完畢
CLR RI
MOV A,SBUF
MOV @R1,A
INC R1
DJNZ R4, REC
RET
S10: CLR RI
PUSH A ;保護(hù)現(xiàn)場
PUSH PSW
MOV A,SBUF
XRL A,#SLAVE ;比較接收到的地址與本機(jī)地址
JZ SI01 ;判斷兩個(gè)地址是否相同
RETU: POP PSW ;恢復(fù)現(xiàn)場
POP A
RETI
SI01: CLR SM2 ;地址相同,與主機(jī)繼續(xù)通信,準(zhǔn)備接收主機(jī)發(fā)送的數(shù)據(jù)
MOV SBUF,#SLAVE ;從機(jī)地址返回給主機(jī)
JNB RI,$ ;等待接收完數(shù)據(jù)
CLR RI
JNB RB8,SI02 ;是數(shù)據(jù)幀,跳轉(zhuǎn)
SETB SM2 ;是復(fù)位信號,把SM2設(shè)置為1
SJMP RETU
SI02: MOV A,SBUF
CJNE A,#02, ERR
ERR: JC SI03
MOV SBUF,#80H ;非法命令,發(fā)送錯(cuò)誤字節(jié)。
SJMP RETU
SI03: JZ CMD0 ;A = 00H,準(zhǔn)備接收數(shù)據(jù)
CMD1: JB F0,SI04 ;發(fā)送準(zhǔn)備就緒了嗎?
MOV SBUF,#00H ;發(fā)送準(zhǔn)備未完成,回復(fù)主機(jī)
SJMP RETU
SI04: MOV SBUF,#02H ;發(fā)送準(zhǔn)備就緒,發(fā)送準(zhǔn)備字節(jié)給主機(jī)
CLR F0 ;清除準(zhǔn)備發(fā)送標(biāo)志
SSEND: MOV SBUF,@R0 ;發(fā)送數(shù)據(jù)
JNB TI,$
CLR TI
INC R0
DJNZ R2, SSEND
SETB SM2 ;發(fā)送完成,設(shè)置SM2 = 1
SJMP RETU
CMD0: JB F1,SI05 ;接收準(zhǔn)備完成了嗎?
MOV SBUF,#00H ;接收準(zhǔn)備未完成
SJMP RETU
SI05: MOV SBUF,#01H ;接收準(zhǔn)備就緒,發(fā)送準(zhǔn)備字節(jié)給主機(jī)
CLR F1
SREC: JNB RI, SREC ;接收數(shù)據(jù)
CLR RI
MOV @R1,SBUF
INC R1
DJNZ R2,LP2
SETB SM2 ;接收完數(shù)據(jù),設(shè)置SM2=1
SJMP RETU
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -