|
|
- ;主機(jī)和多臺從機(jī)之間通信。通信協(xié)議如下:
- ;(1)系統(tǒng)中255臺從機(jī)地址分別為00~FEH;
- ;(2)地址FFH是對所有從機(jī)都起作用的一條控制命令,命令各從機(jī)恢復(fù)SM2=2的狀態(tài);
- ;(3)主機(jī)發(fā)送的控制命令代碼為:00—要求從機(jī)接收數(shù)據(jù)塊,01—要求從機(jī)發(fā)送數(shù)據(jù)塊;
- ;(4)數(shù)據(jù)塊長度:16字節(jié)。
- ;(5)從機(jī)狀態(tài)字格式為:
- ;D7 D6 D5 D4 D3 D2 D1 D0
- ;ERR 0 0 0 0 0 TRDY RRDY
- ;其中:若ERR=1,表示從機(jī)接收到非法命令;若TRDY=1,表示從機(jī)發(fā)送準(zhǔn)備就緒;
- ;若RRDY=1,表示從機(jī)接收準(zhǔn)備就緒。
- ;編程方法:主機(jī)的串口通信以調(diào)用子程序方式進(jìn)行;從機(jī)以串口中斷的方式進(jìn)行,
- ;若從機(jī)未做好接收或發(fā)送數(shù)據(jù)的準(zhǔn)備,就從中斷程序中返回,在主程序中做好準(zhǔn)備。
- ;以下為主機(jī)串行通信程序
- ;入口參數(shù):R0—主機(jī)發(fā)送的數(shù)據(jù)塊首址;R1—主機(jī)接收的數(shù)據(jù)塊首址;R2—被尋址從機(jī)地址;
- ;R3—主機(jī)命令;R4—數(shù)據(jù)塊長度;
- BITE EQU 9 ;串口發(fā)送9位數(shù)據(jù)
- FSSZ EQU 40H ;主機(jī)發(fā)送的數(shù)據(jù)塊首址
- JSSZ EQU 50H ;主機(jī)接收的數(shù)據(jù)塊首址
- ORG 0000H ;程序執(zhí)行開始地址
- LJMP KS ;跳至KS
- ORG 0003H ;外中斷0中斷程序入口
- RETI ;中斷返回
- ORG 000BH ;定時(shí)器T0中斷程序入口
- RETI ;中斷返回
- ORG 0013H ;外中斷1中斷入口
- RETI ;中斷返回
- ORG 001BH ;定時(shí)器T1中斷程序入口
- RETI ;跳至INTT1中斷服務(wù)程序
- ORG 0023H ;串口中斷入口地址
- RETI ;中斷返回
- ORG 0100H
- KS: MOV SP,#1FH ;設(shè)置堆棧指針
- ;此處可以插入其他程序
- COM: MOV TMOD,#20H ;設(shè)置T1工作方式為方式2
- MOV SCON,#0D8H ;置串行模式3,SM2=1,允許接收
- MOV TH1,#0FDH ;11.0592MHz 晶振,波特率=9600,時(shí)長0.6695 FD
- SETB TR1 ;啟動(dòng)T1
- ;若主機(jī)向10號從機(jī)發(fā)送數(shù)據(jù)塊,數(shù)據(jù)塊放置在內(nèi)部RAM區(qū)的40~4F單元中,
- ;則主程序調(diào)用子程序的入口條件如下:
- MOV FSSZ,#0
- MOV FSSZ+1,#1
- MOV FSSZ+2,#2
- MOV FSSZ+3,#3
- MOV FSSZ+4,#4
- MOV FSSZ+5,#5
- MOV FSSZ+6,#6
- MOV FSSZ+7,#7
- MOV FSSZ+8,#8
- ;串口通信
- MOV R2,#0AH ;與10號從機(jī)通信
- ;MOV R3,#00H ;主機(jī)要求從機(jī)接收數(shù)據(jù)塊
- MOV R3,#01H ;主機(jī)要求從機(jī)發(fā)送數(shù)據(jù)塊
- ;占用資源:R0~R4,A、40H、50H
- COM1: LCALL MS101 ;調(diào)用串口通信子程序
- CJNE R4,#00H,COM1 ;查看是否發(fā)送接收數(shù)據(jù)完成
- SJMP KS ;實(shí)際中加入其他程序
- ;以下為主機(jī)串行通信子程序
- MS101: MOV A,R2 ;發(fā)送地址幀
- MOV SBUF,A
- JNB TI,$
- CLR TI
- JNB RI,[ DISCUZ_CODE_1 ]nbsp; ;等待從機(jī)應(yīng)答
- CLR RI
- MOV A,SBUF
- XRL A,R2
- JZ MS103 ;判應(yīng)答地址是否相符
- RET
- MS102: SETB TB8
- MOV SBUF,#0FFH ;不相符重新聯(lián)絡(luò)
- JNB TI,$
- CLR TI
- SJMP MS101 ;轉(zhuǎn)重發(fā)地址
- MS103: CLR TB8 ;地址符合,準(zhǔn)備發(fā)送命令
- MOV SBUF,R3 ;發(fā)送命令
- JNB TI,$
- CLR TI
- JNB RI,[ DISCUZ_CODE_1 ]nbsp; ;等待從機(jī)應(yīng)答
- CLR RI
- MOV A,SBUF ;取應(yīng)答信息
- JNB ACC.7,MS104 ;判斷是否出錯(cuò)
- SJMP MS102 ;若從機(jī)接收命令出錯(cuò),重新聯(lián)絡(luò)
- MS104: CJNE R3,#00H,MS105 ;判是否要求從機(jī)接收數(shù)據(jù)
- JNB ACC.0,MS102 ;從機(jī)接收數(shù)據(jù)準(zhǔn)備就緒否?
- MOV R0,#FSSZ ;主機(jī)發(fā)送的數(shù)據(jù)塊首址
- MOV R4,#BITE ;設(shè)數(shù)據(jù)塊長度(9字節(jié))
- LPTX: MOV SBUF,@R0 ;主機(jī)發(fā)送數(shù)據(jù)塊
- JNB TI,[ DISCUZ_CODE_1 ]nbsp; ;等待發(fā)送完1幀
- CLR TI
- INC R0 ;修改地址指針
- DJNZ R4,LPTX ;判數(shù)據(jù)塊是否傳完
- RET ;返回主程序
- MS105: JNB ACC.1,MS102 ;從機(jī)發(fā)送數(shù)據(jù)準(zhǔn)備就緒否?
- MOV R1,#JSSZ ;主機(jī)接收的數(shù)據(jù)塊首址
- MOV R4,#BITE ;設(shè)數(shù)據(jù)塊長度(9字節(jié))
- LPRX: JNB RI,LPRX ;等待接收完1幀
- CLR RI
- MOV A,SBUF ;取出接收到的字符
- MOV @R1,A
- INC R1
- DJNZ R4,LPRX ;未接收完則繼續(xù)
- RET
- END
-
- ;以下為從機(jī)串行通信程序
- ;從機(jī)的的串行通信采用中斷控制啟動(dòng)方式,串行口中斷服務(wù)程序利用1區(qū)工作寄存器。在串口通信啟動(dòng)后,
- ;仍采用查詢方式來接收或發(fā)送數(shù)據(jù)塊。從機(jī)的初始化程序中應(yīng)包括定時(shí)器1和串口初始化以及開中斷程序。
- ;程序中利用F0(PSW.5)作發(fā)送準(zhǔn)備就緒標(biāo)志,F(xiàn)1(PSW.1)作接收準(zhǔn)備就緒標(biāo)志。
- SLAVE EQU 0AH ;設(shè)定從機(jī)地址
- BITE EQU 9 ;串口發(fā)送9位數(shù)據(jù)
- FSSZ EQU 40H ;主機(jī)發(fā)送的數(shù)據(jù)塊首址
- JSSZ EQU 50H ;主機(jī)接收的數(shù)據(jù)塊首址
- ORG 0000H ;程序執(zhí)行開始地址
- LJMP KS ;跳至KS
- ORG 0003H ;外中斷0中斷程序入口
- RETI ;中斷返回
- ORG 000BH ;定時(shí)器T0中斷程序入口
- RETI ;中斷返回
- ORG 0013H ;外中斷1中斷入口
- RETI ;中斷返回
- ORG 001BH ;定時(shí)器T1中斷程序入口
- RETI ;跳至INTT1中斷服務(wù)程序
- ORG 0023H ;中斷返回
- LJMP SS10 ;跳至串口中斷服務(wù)程序
- KS: MOV SP,#1FH ;設(shè)置堆棧指針
- MOV TMOD,#20H ;設(shè)置T1工作方式為方式2
- MOV SCON,#0F0H ;置串行模式3,SM2=1,允許接收
- MOV TH1,#0FDH ;11.0592MHz 晶振,波特率=9600,時(shí)長0.6695
- SETB TR1 ;啟動(dòng)T1
- SETB EA ;開總中斷
- MOV FSSZ,#0
- MOV FSSZ+1,#1
- MOV FSSZ+2,#2
- MOV FSSZ+3,#3
- MOV FSSZ+4,#4
- MOV FSSZ+5,#5
- MOV FSSZ+6,#6
- MOV FSSZ+7,#7
- MOV FSSZ+8,#8
- SETB F0 ;作發(fā)送準(zhǔn)備就緒標(biāo)志
- SETB F1 ;作接收準(zhǔn)備就緒標(biāo)志
- SETB ES ;允許串口通信
- SJMP [ DISCUZ_CODE_1 ]nbsp; ;可以插入其他程序
- ;串行口中斷服務(wù)程序(由0023轉(zhuǎn)來)
- ;占用資源:1區(qū)R0~R2,A、40H、50H、C
- SS10: CLR RI
- PUSH A ;保護(hù)現(xiàn)場
- PUSH PSW
- SETB RS0 ;選1區(qū)工作寄存器
- CLR RS1
- MOV A,SBUF
- XRL A,#SLAVE ;SLAVE為本從機(jī)地址
- JZ SSI01 ;判地址是否符合
- RETU: POP PSW ;恢復(fù)現(xiàn)場
- POP A
- RETI
- SSI01: CLR SM2 ;地址符合,準(zhǔn)備接收數(shù)據(jù)
- MOV SBUF,#SLAVE ;從機(jī)地址送主機(jī),準(zhǔn)備核對
- JNB TI,[ DISCUZ_CODE_1 ]nbsp; ;等待發(fā)送完1幀
- CLR TI
- JNB RI,[ DISCUZ_CODE_1 ]nbsp; ;等待接收完1幀
- CLR RI
- JNB RB8,SSI02 ;是數(shù)據(jù)幀跳轉(zhuǎn)
- SETB SM2 ;復(fù)位信號,把SM2置“1”
- SJMP RETU
- SSI02: MOV A,SBUF ;取命令
- CLR C
- CJNE A,#02H,SS1 ;檢查命令是否合法,如果A<2,則C=1,否則C=0
- SS1: JC SSI03 ;A<02H則繼續(xù)
- MOV SBUF,#08H ;非法命令,置ERR=1
- JNB TI,[ DISCUZ_CODE_1 ]nbsp; ;等待發(fā)送完1幀
- CLR TI
- SJMP RETU ;返回
- SSI03: JZ CMD0 ;A=00H,準(zhǔn)備接收數(shù)據(jù)塊
- JB F0,SSI04 ;發(fā)送準(zhǔn)備就緒否
- MOV SBUF,#00H ;回答未準(zhǔn)備就緒
- JNB TI,[ DISCUZ_CODE_1 ]nbsp; ;等待發(fā)送完1幀
- SJMP RETU
- SSI04: MOV SBUF,#02H ;發(fā)送準(zhǔn)備就緒,置TRDY=1
- JNB TI,$
- CLR TI
- CLR F0 ;清發(fā)送準(zhǔn)備標(biāo)志
- MOV R0,#FSSZ
- MOV R2,#BITE ;發(fā)送或接收字節(jié)數(shù)送1區(qū)工作寄存器R2,現(xiàn)設(shè)定為9字節(jié)
- LP1: MOV SBUF,@R0 ;發(fā)送數(shù)據(jù)塊
- JNB TI,$
- CLR TI
- INC R0 ;修改數(shù)據(jù)指針
- DJNZ R2,LP1
- SETB SM2 ;發(fā)送完,置SM2=1
- SJMP RETU
- CMD0: JB F1,SSI05 ;判接收準(zhǔn)備就緒否?
- MOV SBUF,#00H ;回答未準(zhǔn)備就緒
- JNB TI,$
- CLR TI
- SJMP RETU
- SSI05: MOV SBUF,#01H ;接收準(zhǔn)備就緒,置RRDY=1
- JNB TI,$
- CLR TI
- CLR F1
- MOV R1,#JSSZ ;接收緩沖區(qū)首址送1區(qū)工作寄存器R1,現(xiàn)設(shè)定為50~5FH
- MOV R2,#BITE
- LP2: JNB RI,LP2 ;等待1幀接收完
- CLR RI
- MOV @R1,SBUF
- INC R1
- DJNZ R2,LP2
- SETB SM2 ;接收完,置SM2=1
- SJMP RETU
- END
復(fù)制代碼
|
|