?? 實驗九(點對點串行通信2)_發(fā)送.asm
字號:
;功能:在“串入并出”芯片擴展輸出引腳基礎(chǔ)上,增加串行通信
DISPBUF DATA 48H ;筆段碼顯示緩沖區(qū):
;48H單元記錄千位,49H單元記錄百位
;4AH單元記錄十位,4BH單元記錄個位
BTIME DATA 40H ;10ms計數(shù)單元
SECOND DATA 4CH ;秒計數(shù)單元
MINUTE DATA 4DH ;分計數(shù)單元
DISPB BIT 00H ;1秒定時時間到標志
TXDBuf DATA 30H ;發(fā)送緩沖區(qū)
TXDC DATA 35H ;發(fā)送/接收字節(jié)計數(shù)器
TXDOK BIT 07H ;發(fā)送成功標志(1-成功;0-失敗)
SDI BIT P1.2 ;串行數(shù)據(jù)輸入
SCLK BIT P3.4 ;串行數(shù)據(jù)移位脈沖
PCLK BIT P3.5 ;并行鎖存脈沖
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP UART ;跳串行口中斷服務(wù)程序入口地址
ORG 002BH
LJMP CTC2 ;定時/計數(shù)器T2中斷服務(wù)程序入口地址
ORG 0050H
;-----主程序開始-----
PROC MAIN
MAIN:
MOV SP, #0DFH ;對于具有256字節(jié)內(nèi)部RAM芯片來說,
;將0E0H-0FFH,共計32字節(jié)作為堆棧區(qū)
MOV DPTR, #8000H ;關(guān)閉蜂鳴器
MOV A, #0FFH
MOVX @DPTR, A
;---復(fù)位后,將08H-0FF內(nèi)部RAM單元清0。
MOV R7, #248
MOV R0, #08H
LOOP1:
MOV @R0, #0
INC R0
DJNZ R7, LOOP1
;----初始化定時器T2
MOV TH2, #0DCH
MOV TL2, #00H ;初值0DC00送定時器T2
MOV RCAP2H, #0DCH
MOV RCAP2L, #00H ;初始化重裝初值
MOV T2CON, #00000100B ;初始化T2工作方式(自動重裝初值、定時)
;并啟動了T2
;初始化定時器T1(作串行通信波特率發(fā)生器輸入信號)
MOV TL1, #250 ;4800波特率對應(yīng)定時器初值
MOV TH1, #250
ANL TMOD, #0F0H
ORL TMOD, #00100000B ;定時器T1工作在方式2(8位自動重裝初值)
SETB TR1 ;啟動定時器T1
CLR ET1 ;禁止T1中斷
;初始化串行口
MOV SCON, #11010000B ;串行口工作在方式3,SM2=0,以便用TB8位
;作奇偶校驗位。
;SETB REN ;允許接收
;-----初始化中斷控制器
SETB PT2 ;將定時器T2中斷優(yōu)先級置為高
ORL IE, #10110000B
;SETB ET2 ;允許定時器T2中斷
;SETB ES ;允許串行口中斷
;SETB EA ;開中斷
MOV BTIME, #100 ;T2每10ms中斷一次,則BTIME回零時間為100*10ms
WAIT:
JNB DISPB, WAIT
CLR DISPB ;清除1秒時間到標志
LCALL TIMEPROC ;執(zhí)行分秒處理及顯示子程序
LCALL S_DISP ;執(zhí)行串行輸出子程序,將筆段碼送LED
LCALL TIMETXB ;時間送發(fā)送緩沖區(qū),并啟動串行發(fā)送
SJMP WAIT ;等待
END
;定時/計數(shù)器T2中斷服務(wù)程序
PROC CTC2
CTC2:
DJNZ BTIME, EXIT ;溢出次數(shù)減1,不為0跳轉(zhuǎn)
;溢出次數(shù)已經(jīng)回到0,重新初始化溢出次數(shù)
MOV BTIME, #100
SETB DISPB ;置位1秒時間到標志
EXIT:
CLR TF2 ;清除定時器T2溢出標志
RETI
END
PROC TIMEPROC ;分秒處理及顯示子程序
TIMEPROC:
;時間計數(shù)單元加+1處理
INC SECOND ;秒計數(shù)單元+1
MOV A, SECOND
CJNE A, #60, NEXT1
NEXT1:
JC NEXT2
;秒大于60,從0開始計數(shù),且分計數(shù)單元加1
MOV SECOND, #0
INC MINUTE
MOV A, MINUTE
CJNE A, #60, NEXT21
NEXT21:
JC NEXT2 ;分小于60
MOV SECOND, #0
NEXT2:
;秒單元計數(shù)器筆段碼送顯示緩沖區(qū)
MOV A, SECOND
MOV B, #10
DIV AB ;轉(zhuǎn)換為BCD碼
;十位在A中,個位在B中
MOV DPTR, #LEDTAB ;0-F字模表首地址送DPTR
MOV R0, #DISPBUF+2
MOVC A, @A+DPTR ;查表取筆段碼
MOV @R0, A ;秒高位筆段碼送顯示緩沖區(qū)
INC R0 ;指向緩沖區(qū)最低位
MOV A, B ;取個位碼
MOVC A, @A+DPTR ;查表取筆段碼
MOV @R0, A ;秒低位筆段碼送顯示緩沖區(qū)
;分單元計數(shù)器筆段碼送顯示緩沖區(qū)
MOV A, MINUTE
MOV B, #10
DIV AB ;轉(zhuǎn)換為BCD碼
;十位在A中,個位在B中
MOV DPTR, #LEDTAB ;0-F字模表首地址送DPTR
MOV R0, #DISPBUF
MOVC A, @A+DPTR ;查表取筆段碼
MOV @R0, A ;分高位筆段碼送顯示緩沖區(qū)
INC R0 ;指向緩沖區(qū)最低位
MOV A, B ;取個位碼
MOVC A, @A+DPTR ;查表取筆段碼
CLR ACC.7 ;顯示LED202數(shù)碼管的小數(shù)點dp
MOV @R0, A ;分低位筆段碼送顯示緩沖區(qū)
RET
END
PROC S_DISP ;串行輸出子程序
S_DISP:
MOV R0, #DISPBUF ;顯示緩沖區(qū)首地址送R0
MOV R7, #4
LOOP2:
MOV A, @R0
MOV R6, #8
LOOP1:
CLR SCLK
RLC A
MOV SDI, C ;串行數(shù)據(jù)送SDI引腳
SETB SCLK ;鎖存串行輸入數(shù)據(jù)
DJNZ R6, LOOP1
;取下一顯示碼
INC R0
DJNZ R7, LOOP2
;4位筆段碼已全部移到串入并出芯片中
CLR PCLK
NOP ;延遲一個機器周期
SETB PCLK
RET
END
PROC TIMETXB ;時間送發(fā)送緩沖區(qū)
TIMETXB:
MOV A, SECOND
MOV B, #10
DIV AB ;轉(zhuǎn)換為BCD碼
;十位在A中,個位在B中
MOV R0, #TXDBuf+2
MOV @R0, A
INC R0
MOV @R0, B ;秒低位送發(fā)送緩沖區(qū)緩沖區(qū)
;分單元計數(shù)器筆段碼送顯示緩沖區(qū)
MOV A, MINUTE
MOV B, #10
DIV AB ;轉(zhuǎn)換為BCD碼
;十位在A中,個位在B中
MOV R0, #TXDBuf
MOV @R0, A
INC R0
MOV @R0, B ;分低位送發(fā)送緩沖區(qū)緩沖區(qū)
;計算校驗和
MOV R0, #TXDBuf
MOV R7, #4
CLR A ;清累加器
LOOP1:
ADD A, @R0 ;累加求和!
INC R0
DJNZ R7, LOOP1
ANL A, #7FH ;保留和的低7位,避免與幀首標志相同
MOV @R0, A ;校驗和存入發(fā)送緩沖區(qū)
MOV A, #0AAH ;先發(fā)送幀首標志
MOV C, P ;奇偶標志P送C
MOV TB8, C ;奇偶標志P送TB8,即b8位
MOV SBUF, A ;寫串行口緩沖寄存器,啟動發(fā)送
MOV TXDC, #0 ;初始化發(fā)送字節(jié)數(shù)
RET
END
PROC UART ;串行中斷服務(wù)子程序
UART:
PUSH ACC
PUSH PSW
SETB RS0 ;切換工作寄存器區(qū)
SETB RS1
JNB TI, NEXT2
;串行發(fā)送結(jié)束中斷
CLR TI ;清除發(fā)送結(jié)束中斷
;檢查發(fā)送字節(jié)計數(shù)器,確定是否已發(fā)送了所有數(shù)據(jù)
MOV A, TXDC
CJNE A, #5, NEXT1
NEXT1:
JNC NEXT2
;小于5,說明尚未完成發(fā)送
ADD A, #TXDBuf ;加上發(fā)送緩沖區(qū)首地址
MOV R0, A
MOV A, @R0 ;取發(fā)送數(shù)據(jù)
MOV C, P ;奇偶標志P送C
MOV TB8, C ;奇偶標志P送TB8,即b8位
MOV SBUF, A ;寫串行口緩沖寄存器,啟動發(fā)送
INC TXDC ;發(fā)送字節(jié)計數(shù)器加1
NEXT2:
JNB RI, EXIT ;退出
CLR RI ;清除發(fā)送結(jié)束中斷
;串行接收有效
MOV A, SBUF
;執(zhí)行奇偶校驗,P標志與RB8位應(yīng)該相同,否則就錯
MOV C, P
ANL C, /RB8 ;計算P. /RB8
MOV F0, C ;暫時保存F0標志中
MOV C, RB8
ANL C, /P ;計算RB8. /P
ORL C, F0 ;完成了P與RB8的異或運算!
JC EXIT ;奇偶校驗錯!
;奇偶校驗正確!
CJNE A, #0A5H, NEXT3
;等于0A5H,說明接收方已經(jīng)準確接收,成功標志置1
SETB TXDOK
SJMP EXIT
NEXT3:
CJNE A, #0A6H, EXIT
;重新發(fā)送
CLR TXDOK ;清除發(fā)送成功標志
MOV TXDC, #0 ;初始化發(fā)送字節(jié)計數(shù)器
MOV A, #0AAH ;發(fā)送幀首標志
MOV C, P ;奇偶標志P送C
MOV TB8, C ;奇偶標志P送TB8,即b8位
MOV SBUF, A ;寫串行口緩沖寄存器,啟動發(fā)送
EXIT:
POP PSW
POP ACC
RETI
END
LEDTAB: ;八段LED共陽數(shù)碼管字模
;數(shù)碼 0 1 2 3 4 5 6 7
DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H
;數(shù)碼 8 9 A B C D E F
DB 80H, 90H, 88H, 83H, 0C6H, 0A1H, 86H, 8EH
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -