?? 新建 文本文檔.txt
字號:
雙機通訊(8032與8032)
第一題:
發送程序
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV TMOD,#20H
MOV TH1,#0F3H
MOV TL1,#0F3H
MOV SCON,#0C0H
MOV PCON,#80H
SETB TR1
MOV R0,#50H
LOOP1: MOV A,@R0
MOV SBUF,A
WAIT: JBC TI,LOOP2
SJMP WAIT
LOOP2: INC R0
CJNE R0,#60H,LOOP1
SJMP $
END
接收程序
ORG 0000H
AJMP MAIN
ORG 0040H
MAIN: MOV TMOD,#20H
MOV TH1,#0E6H
MOV TL1,#0E6H
MOV SCON,#0D0H
MOV PCON,#80H
SETB TR1
MOV R0,#50H
WAIT: JBC RI,LOOP
SJMP WAIT
LOOP: MOV A,SBUF
MOV @R0,A
INC R0
CJNE R0,#60H,WAIT
SJMP $
END
第二題: 甲機發送程序
ORG 0000H
LJMP MAINT ;跳至主程序入口
ORG 0023H
LJMP INTSE1 ;轉至串行中斷服務程序
MAINT: MOV SCON,#01000000B ;置串行口工作方式1
MOV TMOD,#20H ;定時器1為工作方式2
MOV TH1,#0D9H ;產生400波特率的時間常數
MOV TL1,#0D9H
SETB TCON.6 ;啟動定時器1
SETB EA ;開中斷
SETB ES ;串口開中斷
MOV DPTR,#ADDRT ;首址送DPTR
MOV R0,#00H ;傳送字節數初值
MOVX A,@DPTR ;取第一個發送字節
MOV SBUF,A ;啟動串行口發送
SJMP $ ;等待中斷
;中斷服務子程序
INTSE1: CLR SCON.1 ;清中斷標志
CJNE R0,#7FH,LOOP ;判別128個字節都發送完否,若沒有完,則轉LOOP繼續取下一個發送數據
CLR ES ;全部發送完畢,禁止串行口中斷
SJMP ENDT ;轉中斷返回
LOOP: INC R0 ;修改字節數指針
INC DPTR ;修改地址指針
MOVX A,@DPTR ;取發送數據
MOV SBUF,A ;啟動串行口
ENDT: RETI ;中斷返回
乙機接收程序:
ORG 0000H
LJMP MAINR ;跳至主程序入口
ORG 0023H
LJMP INTSE2 ;轉至串行中斷服務程序
MAINR: MOV SCON,#01010000B ;置串行為接收口,工作方式1
MOV TMOD,#20H ;定時器1為工作方式2
MOV TH1,#0D9H ;產生400波特率的時間常數
MOV TL1,#0D9H
SETB TCON.6 ;啟動定時器1
SETB EA ;開中斷
SETB ES ;串口開中斷
MOV DPTR,#ADDRR ;首址送DPTR
MOV R0,#00H ;傳送字節數初值
SJMP $ ;等待中斷
;中斷服務子程序
INTSE2: CPL SCON.0 ;清中斷標志
MOV A,SBUF ;取接收的斷據
MOVX @DPTR,A ;接書的數據送緩沖區
CJNE R0,#7FH,LOOP ;判128個字節接收完否。若沒有,轉LOOP繼續
CLR ET1 ;接收下面的數據。全部接收完畢則關定時器1及關串口中斷
CLR ES
SJMP SEND
LOOP: INC R0 ;修改計數指針
INC DPTR ;修改地址指針
SEND: RETI ;中斷返回
第三題:
;甲機發送程序
;主程序:
ORG 0000H
LJMP MAINT
ORG 0023H
LJMP INTSE1
MAINT: MOV PCON,#80H
MOV SCON,#10010000B
MOV DPTR,#0200H
MOV R0,#00H
SETB EA
SETB ES
MOVX A,@DPTR
ADD A,#00H
MOV C,P
MOV TB8,C
MOV SBUF,A
SJMP $
;中斷服務子程序
INTSE1: JB SCON.0,LOOP
CLR SCON.1
SJMP ENDT
LOOP: CLR SCON.0
MOV A,SBUF
SUBB A,#01H
JC LOOP3
MOVX A,@DPTR
ADD A,#00H
MOV C,P
MOV TR8,C
MOV SBUF,A
SJMP ENDT
LOOP3: INC DPTR
INC R0
MOVX A,@DPTR
ADD A,#00H
MOV C,P
MOV TR8,C
MOV SBUF,A
CJNE R0,#80H,ENDT
CLR ES
ENDT: RETI
;乙機接收程序
;主程序
ORG 0000H
LJMP MAINR
ORG 0023H
LJMP INTSE2
ORG 0100H
MAINR: MOV PCON,#80H ;波特率加倍
MOV SCON,#10010000B ;工作方式2,允許接收
MOV DPTR,#0100H ;數據指針首址
MOV R0,#00H ;接收數據字節數初值
SETB EA ;CPU開中斷
SETB ES ;串口開中斷
SJMP $ ;等待中斷
;串行口中斷服務程序
INTSE2:JB SCON.0,LOOP ;檢測是否是本機的接收口中斷,若SCON.0=1,轉入接收程序
CLR SCON.1 ;若SCON.0=0,必若SCON.1=1是本機的發送中斷,故應清零
SJMP ENDT ;跳至中斷返回程序
LOOP: CLR SCON.0 ;清本機的接收中斷標志
MOV A,SBUF ;取接收的數據
ADD A,#00H ;奇偶校驗
MOV C,P
JC LOOP1 ;若8位數為奇,則轉LOOP1再檢測RB8位 ORL C,RB8 ;8位數為偶,再檢測RB8位,RB8=1則
JC LOOP2 9位數為奇,補偶錯轉LOOP2
SJMP LOOP3 ;補偶正確,轉LOOP3
LOOP1: ANL C,RB8 ;8位數為奇,再檢測RB8位,RB8=1,補偶正確,轉LOOP3
JC LOOP3
LOOP2: MOV A,#0FFH ;本機發應答信息(FFH)給甲機,表明數據傳送不正確
MOV SBUF,A
SJMP ENDT ;跳至中斷返回程序
LOOP3: MOVX @DPTR,A ;將接收的正確數據送數據緩沖區
MOV A,#00H ;本機發應答信息(00H)給甲機,表明數據傳送正確,甲機發下一個數據
MOV SBUF,A
INC R0 ;修改指針
INC DPTR
CJNE R0,#80H,ENDT ;判128個字節接收完否
CLR ES ;接收完畢,關串行口中斷
ENDT: RETI ;中斷返回
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -