兩機(jī)串行通訊單片機(jī)匯編語(yǔ)言編程舉例
A、B兩機(jī)之間串行通訊(方式1),用‘檢驗(yàn)和’校驗(yàn)波特率為2400,發(fā)送緩沖區(qū)和接收緩沖區(qū)都為片內(nèi)30H開(kāi)始的16個(gè)字節(jié)單元。已知:fosc=11.0592MHz。
設(shè)計(jì)A發(fā)送,B接收的雙方協(xié)議如下:
1、首先A發(fā)送‘AA’信號(hào),B接收到后發(fā)送‘BB’應(yīng)答;
2、A方最多只發(fā)送20次‘AA’,若無(wú)應(yīng)答,置錯(cuò)誤標(biāo)志,退出。
3、A收到‘BB’后,開(kāi)始發(fā)送緩沖區(qū)的數(shù)據(jù),同時(shí)求檢驗(yàn)和,共16個(gè)字節(jié)。
4、B接收數(shù)據(jù),存入緩沖區(qū),并同時(shí)求檢驗(yàn)和。
5、當(dāng)一個(gè)數(shù)據(jù)塊發(fā)送完后,A再發(fā)送檢驗(yàn)和(一個(gè)字節(jié))。
6、B接收到A的檢驗(yàn)和后,再與本身的檢驗(yàn)和比較。
7、若接收正確,B方發(fā)送‘00’,否則發(fā)送‘EE‘,請(qǐng)求重發(fā)。
8、若A方接收到‘00’,結(jié)束發(fā)送,接收到‘EE’則重發(fā)。
A機(jī)的通訊程序:
ASTA: MOV TMOD,#20H ;設(shè)T1方式2
MOV TH1,#0F4H ;計(jì)數(shù)初值,波特率=2400
MOV PCON,#0 ;SMOD=0
SETB TR1 ;啟動(dòng)T1
MOV SCON,#50H ;串口方式1,REN=1
ATT0: MOV R6,#200
MOV R7,#20
CLR F0 ;線路故障標(biāo)志=0
ATT1:MOV SBUF,#0AAH ;發(fā)‘AA’聯(lián)絡(luò)
AWA1:JBC TI,ARR1 ;查詢發(fā)送中斷標(biāo)志位
SJMP AWA1
ARR1:JBC RI,ARR2 ;等待接收
DJNZ R6,ARR1
DJNZ R7,ATT1 ;
SETB F0 ;線路故障
QUIT: AJMP EXIT ;退出
ARR2:MOV A,SBUF ;接收對(duì)方回應(yīng)‘BB’
XRL A,#0BBH ;比較應(yīng)答信號(hào)是否正確?
JNZ QUIT ;不正確,退出
ATT2:MOV R0,#30H ;準(zhǔn)備發(fā)送數(shù)據(jù)
MOV R7,#16
MOV R6,#0 ;檢驗(yàn)和單元
ATT3:MOV SBUF,@R0 ;發(fā)送一個(gè)字節(jié)
MOV A,R6
ADD A,@R0 ;求檢驗(yàn)和
MOV R6,A
INC R0
AWA2:JBC TI,ATT4
SJMP AWA2 ;查詢發(fā)送中斷標(biāo)志
ATT4:DJNZ R7,ATT3 ;計(jì)數(shù)循環(huán)
MOV SBUF,R6 ;數(shù)據(jù)塊發(fā)送完,發(fā)送檢驗(yàn)和
AWA3:JBC TI,ARR3
SJMP AWA3
ARR3:JBC RI,ARR4 ;等待接收對(duì)方回應(yīng)
SJMP ARR3
ARR4:MOV A,SBUF ;接收到對(duì)方回應(yīng)
JNZ ATT2 ;若是‘00’則成功,否則重發(fā)。
EXIT: RET
B機(jī)通訊程序:(用中斷方式開(kāi)始)
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP BRR1 ;串行中斷入口
ORG 0030H
MAIN: 。。。。。 ;主程序
BSTA: MOV TMOD,#20H ;設(shè)T2方式2
MOV TH1,#0F4H ;計(jì)數(shù)初值,波特率=2400
MOV PCON,#0 ;SMOD=0
SETB TR1 ;啟動(dòng)T1
MOV SCON,#50H ;串口方式1,REN=1
SETB ES
SETB EA ;允許中斷
。。。。。。。。
BRR1: CLR ES ;串行口中斷服務(wù)程序
JBC RI,BRR2 ;
SJMP BRR1
BRR2: MOV A,SBUF ;接收A機(jī)聯(lián)絡(luò)信號(hào)
XRL A,#0AAH
JZ BTT1 ;正確
AJMP EXIT ;錯(cuò)誤,退出
BTT1: MOV SBUF,#0BBH ;發(fā)送應(yīng)答
BWA1:JBC TI,BRR3
SJMP BWA1
BRR3: MOV R0,#30H ;準(zhǔn)備接收數(shù)據(jù)
MOV R7,#10H
MOV R6,#0
BRR4:JBC RI,BRR5
SJMP BRR4
BRR5:MOV A,SBUF ;接收一個(gè)字節(jié)
MOV @R0,A ;存入緩沖區(qū)
INC R0
ADD A,R6 ;
MOV R6,A ;求檢驗(yàn)和
DJNZ R7,BRR4 ;數(shù)據(jù)塊計(jì)數(shù)
BWA2:JBC RI,BRR6
SJMP BWA2
BRR6:MOV A,SBUF ;接收對(duì)方檢驗(yàn)和
XRL A,R6 ;與本機(jī)的比較
JZ BTT2
MOV SBUF,#0FFH ;不同,發(fā)送‘FF’
BWA3:JBC TI,BRR3 ;準(zhǔn)備接收重發(fā)
SJMP BWA3
BTT2:MOV SBUF,#0 ;正確,發(fā)送‘00’
EXIT: SETB ES
RETI
例3、 兩機(jī)通訊在方式2或3,用第9位作奇偶校驗(yàn)。
發(fā)送方:
,,,,,,
TTT: MOV SCON,#80H ;方式2
MOV A,#data ;data為一字節(jié)數(shù)據(jù)
MOV C,PSW.0 ;取奇偶位
MOV TB8,C ;奇偶位送到TB8位
MOV SBUF,A ;發(fā)送一個(gè)字節(jié)
LOOP:JBC TI,NEXT內(nèi)容來(lái)自單片機(jī)之家www.dpj100.com
SJMP LOOP
NEXT: ,,,,
接收方:
,,,,,,
RRR: MOV SCON,#90H ;方式2,允許接收
LOOP: JBC RI,RECE
SJMP LOOP
RECE: MOV A,SBUF ;取出接收到的字節(jié)
JB PSW。0,ONE ;判斷接收方的奇偶值
JB RB8,ERR ;判斷發(fā)送方的奇偶值
SJMP RIGHT
ONE : JNB RB8,ERR
RIGHT: ,,,,,, ;接收正確
ERR: ,,,,,,, ;接收有錯(cuò)