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