8031單片微機(jī)串行口的應(yīng)用
8031單片微機(jī)因具有體積小,資源豐富,性能價(jià)格比優(yōu)等特點(diǎn),近十年來(lái)在我國(guó)獲得了極其廣泛的應(yīng)用。它內(nèi)部的可編程全雙工串行通訊口具有軟件編程方便,使用可靠的特點(diǎn)。
在數(shù)據(jù)傳送和數(shù)據(jù)通訊中受到用戶的親睞。本文就8031串行口的應(yīng)用作一介紹。
一、利用8031串行口控制鍵盤(pán)和顯示器
8031串行口的方式0(移位寄存器輸入/輸出方式)可用于鍵盤(pán)和顯示器控制,其硬件結(jié)構(gòu)如圖1所示。
圖中外接8片8位串入/并出移位寄存器74LS164作為8位LED顯示器的靜態(tài)控制端口。由于顯示器工作是靜態(tài)的,因而主程序可不必掃描顯示器,從而使CPU有更多的時(shí)間處理其它事務(wù)。這類(lèi)應(yīng)用常見(jiàn)于小型測(cè)量?jī)x表的顯示中。
下面給出更新顯示器顯示的子程序和鍵盤(pán)掃描子程序的清單及其簡(jiǎn)單說(shuō)明。
顯示子程序:
DIR: SETB P3.3 l開(kāi)放顯示器傳送控制
MOV R7,# 08H
MOV RO.#5FH ;5FH~58H為顯示緩沖器
DLO: MOVA,@RO ;取出要顯示的數(shù)據(jù)
ADD A,#ODH ;加上偏移量
MOVC A,@A+PC ;取出字形
MOV SBUF,A ;送出顯示
DLI: JNB TI,DL1 ;輸出完否?
CLR TI ;完,清中斷標(biāo)志
DEC RO ;再取下一個(gè)數(shù)
DJNZ R7,DLO ;8位顯示數(shù)據(jù)輸出完否?
CLR P3.3 ;輸出完,關(guān)閉顯示器傳送
RET ;返回
SEGTAB;co“O” ;字形代碼表
F9 “1"
A4“2”
BD “3”
99“4”
92“5”
82 “6”
F8 “7”
80 “8”
90 “9”
88 “A”
83 “B”
C6“C”
Al“D”
86 “E”
8F “F”
BF“一”
8C “P”
9l “Y”
鍵盤(pán)掃描子程序
KEY: MOV A.#OOH ;向164輸出OOH,對(duì)鍵盤(pán)掃描
MOV SBUF,A
KLO:JNB T1,KLO ;輸出完否?
CLRTI ;清0中斷標(biāo)志
KL1: JNB P3.4,PK1 ;第一捧鍵中有鍵閉合否?
JB P3.5,KLI ;第二排鍵中有鍵閉合否?
PKl: ACALLDI0 ;有鍵按下
JNB P3.4,PK2 ;是否抖動(dòng)引起
JB P3.5.KL1 ;不是抖動(dòng)引起
PK2: MOV R7,#08H ;判斷那一個(gè)健被按下
MOV R6,# OFEH
MOV R3,# ODH
KL5: MOV A,R6
MOV SBUF,A ;對(duì)列線逐個(gè)掃描
KL2: JNB TI,KL2
CLR TI
LNBP3.4.PKONE ;是第一捧某鍵杏?
JB P3.5,NEXT ;是第二排某鍵否?
MOV R4,#08H ;是第二排中有鍵被接下
AJMP PK3
PKONE: MOV R4,#OOH ;是第一排中有鍵被按下
PK3: MOV A,#OOH ;等待鍵釋放
MOV SUBF,A
KL3: JNB TI,KL3
CLR TI
KL4: JNBP3.4,KL4JNBP3.5,KL4
MOV A,R4 ;鍵釋放,取出鍵碼
ADD A,R3
RET ;返回
NEXT: MOV A,R6 ;判下一列是否按下
RLA
MOV R6,A
INC R3
DJNZ R7,KL5 ;八列鍵都檢查完否?
AJMP KEY ;完了,開(kāi)始下一個(gè)掃描周期
Dl0: MOV R7,#OAH ;延時(shí)10ms子程序
DL: MOV R6,# OFFH
DL6: DJNZ R6,DL6
DJNZ R7,DL
RET
二、利用8031串行口實(shí)現(xiàn)主從機(jī)通訊
8031串行口工作方式3(或方式2)可用于實(shí)現(xiàn)單片機(jī)之
間的主從機(jī)通訊,具體電路結(jié)構(gòu)如圖2。方式2和方式3都是
被定義為9位異步通訊接口,只是波特率選取有所不同。
利用串行口方式3實(shí)現(xiàn)多機(jī)通訊的軟件“協(xié)議”如下:
1.主機(jī)
設(shè)置為串行口工作方式3,允許接收,第一次發(fā)送時(shí)設(shè)置
TB8=1,以后發(fā)送時(shí)設(shè)置TB8=0。TB8=1(圭機(jī)發(fā)送的第九
位數(shù)據(jù))表示這組數(shù)是地址,TB8-o表示這組數(shù)是數(shù)據(jù)。
2.從機(jī)
設(shè)置為串行口工作方式3,允許接收。第一次接收設(shè)置
SM2-1,只有當(dāng)接收到的第九位數(shù)據(jù)RB8=1時(shí)才產(chǎn)生接收
中斷,這時(shí)接收到的這組數(shù)是地址。在程序中置位PSW. 1=1
表示接收的是地址,PSW. 1=0表示接收的是數(shù)據(jù)。
下面給出主從機(jī)之間通信的程序和說(shuō)明。主機(jī)要發(fā)送的
數(shù)據(jù)或控制命令放在片內(nèi)RAM中,數(shù)據(jù)塊首址為31H, 30H
中的內(nèi)容為數(shù)據(jù)塊長(zhǎng)度。
ORG OOOOH
LJMP MAIN
ORG 0023H ;串行口中斷程序入口
SJMP SERVE
ORG 0040H ;發(fā)送子程序人口
TRANSFER: MOV TMOD,#20H ;設(shè)置T1為定時(shí)方式2
MOV TH1,#0F3H ;Tl置初值,產(chǎn)生1200波特率
MOV TLl,# 0F3H
MOV SCON,#OD8H ;設(shè)置串行日工作方式3允許接收,TB8=1
SETB TR1 ;啟動(dòng)Tl
'SET EA ;開(kāi)中斷
CLR ES ;禁止串行口中斷
START: MOV SBUF,#OOH .發(fā)0#從機(jī)地址
WAIT1: JNB TI,WAITI ;等待發(fā)送完畢
CIR TI ;完畢清發(fā)送中斷標(biāo)志T1
WAIT2': JNB R1,WAlTZ ;等待0#從機(jī)應(yīng)答
CLRRl
MOV A,SBUF ;判斷是否為O#從機(jī)的應(yīng)答信號(hào)
JNZ START
CIR TB8 ;是應(yīng)答信號(hào),清TB8表示以后是效據(jù)
SETB ES ;允許串行口中斷
MOV 2FH,# 31H
MOV SBUF,30H .發(fā)送數(shù)據(jù)塊長(zhǎng)度
RET ;子程序返回
SERVE: CLR TI ;清發(fā)迭中斷標(biāo)志T1
PUSH A ;現(xiàn)場(chǎng)保護(hù)
MOV A,RO
PUSH A
DJNZ 30H.TRAN; ;數(shù)據(jù)發(fā)送完否?
CLR ES ;完畢,關(guān)串行口中斷
CLR TR1 ;關(guān)T1
SJMP RETUNE
TRAN: MOV RO,2FH ;取數(shù)據(jù)地址
MOV SBUF.@RO ;發(fā)送數(shù)據(jù)
INC 2FH ;數(shù)據(jù)地址加1
RETUNE:POP A ;恢復(fù)現(xiàn)場(chǎng)
MOV RO,A
POP A
RETI ;中斷返回
MAIN, NOP 注程序(未給出)
0#從機(jī)首先接收主機(jī)發(fā)來(lái)的數(shù)據(jù)塊長(zhǎng)度,并將它存入片
內(nèi)RAM30H單元中,然后接收數(shù)據(jù)或控制命令,并將它們存
放到片內(nèi)RAM中,起始地址為30H。0#從機(jī)接收程序清單如
下;
ORG 0023H ;串行口中斷程序入口
SJMP SERVE.
ORG 0040H ;初始化程序入日
RECEIVE:MOV TMOD.#20H ;設(shè)置T1為定時(shí)方式2
MOV TH1,# OF3H ;T1置初值,產(chǎn)生1200波特率
MOV SCON,#OFOH ;設(shè)置串行口工作方式3,允許接收且SM2=1
SETB TR1 ;啟動(dòng)T1
SETB EA ;開(kāi)中斷
SETB ES ;允許串行口中斷
SETB PSW.1 ;PSW.1=1是地址
LJMP MAIN ;轉(zhuǎn)主程序(未給出)等待串行口中斷
SERVE: CLR RI ;清串行口發(fā)送標(biāo)志Rl
PUSH A ;現(xiàn)場(chǎng)保護(hù)
MOV A,RO
PUSH A
HOV A,R0
PUSHA
JBPSW.1,HELLO ;是地址否?
DATA: MOV R0,2FH ;是數(shù)據(jù),建立數(shù)據(jù)地址指針
MOV A,SBUF ;取接收到的數(shù)據(jù)
MOV @RO,A ;轉(zhuǎn)存到存貯器中
INC 2FH ;數(shù)據(jù)地址加1
DJNZ 30H,RETUNE ;躺數(shù)據(jù)接收完否?
SETB PSW.1 ;置位PSW.1,表示接收
SJMP RETUNE ;數(shù)據(jù)完畢
HELLO: MOV A,SBUF ;是地址,判斷與本機(jī)地址是否相等
JNZ RETUNE ;不相等返回
MOV SBUF,# OOH .相符,發(fā)本機(jī)地址作為應(yīng)答
CLR PSW.1 ;清PSW.1表示以后為數(shù)據(jù) ’
CLR SM2 ;清SM2準(zhǔn)備接收數(shù)據(jù).
MOV 2FH,#30H
WAIT: JNBTI,WAIT ;等待應(yīng)答信號(hào)發(fā)送完畢
CLR T1
RETUNE, POP A ;恢復(fù)現(xiàn)場(chǎng)
MOV RO,A
POP A
RETI ;中斷返回
三、8031串行口與IBM-PC機(jī)組成二級(jí)通訊系統(tǒng) IBM-PC機(jī)的串行通訊適配器是采用可編程通訊用異步收發(fā)器UART8250芯片。我們可以使用宏匯編語(yǔ)言設(shè)計(jì)程序直接操作UART各寄存器,以中斷方式與8031串行口進(jìn)行通訊。
1.硬件結(jié)構(gòu)
IBM-PC機(jī)的串行通訊適配器與8031的串行口組成的兩級(jí)系統(tǒng)如圖3所示。由于串行輸出芯片1488無(wú)高阻態(tài),必須經(jīng)二極管隔離后再并聯(lián)。
2.通訊協(xié)議
a.?dāng)?shù)據(jù)代碼程和功能代碼
數(shù)據(jù)代碼是通訊過(guò)程必須傳送的目的代碼,功能代碼是通訊過(guò)程中的應(yīng)答信號(hào),以及表征數(shù)據(jù)特征和數(shù)量的代碼。
每組數(shù)據(jù)的結(jié)構(gòu)見(jiàn)表l,協(xié)議規(guī)定數(shù)據(jù)的數(shù)量和特征代碼放在數(shù)據(jù)代碼的前端,代碼和字節(jié)提供給對(duì)方檢驗(yàn)通訊過(guò)程是否有誤碼。
b.具體規(guī)定;
我們規(guī)定通訊過(guò)程為PC機(jī)發(fā)出“向8031發(fā)數(shù)”的發(fā)數(shù)令牌(該令牌中包含某- 8031的地址)。收到應(yīng)答碼后開(kāi)始發(fā)送過(guò)程,并由8031機(jī)回送“是否誤碼”的代碼。PC機(jī)發(fā)出“允許8031機(jī)發(fā)效的收數(shù)令牌(該令牌包含某- 8031的地址),收數(shù)令牌按機(jī)號(hào)順序定時(shí)發(fā)出,使每臺(tái)8031有平等的發(fā)數(shù)機(jī)會(huì)。令牌中的地址和機(jī)號(hào)相同的8031機(jī)取得通訊權(quán)。為使發(fā)數(shù)比收數(shù)有更高的優(yōu)先權(quán),只在無(wú)數(shù)據(jù)發(fā)送時(shí)才發(fā)“收數(shù)令牌”。
3.軟件設(shè)計(jì)
a.對(duì)lBM-PC通訊程序的要求
為使IBM-PC機(jī)和多臺(tái)8031機(jī)的通訊有條不紊的進(jìn)行,IBM-PC機(jī)應(yīng)有完善的調(diào)度能力,我們可以編制一段調(diào)度程序,它的功能是;①處理數(shù)據(jù)輸入和輸出緩沖區(qū);②進(jìn)行串行口資源調(diào)度,確定是收數(shù)還是發(fā)數(shù);③能使串行中斷服務(wù)程序執(zhí)行發(fā)數(shù)任務(wù)和收數(shù)任務(wù)。發(fā)數(shù)任務(wù)和收數(shù)任務(wù)分別由各自的中斷服務(wù)程序來(lái)完成;④調(diào)度程序以令牌方式分配通訊權(quán)。只有取得通訊權(quán)的某臺(tái)8031才能接收和發(fā)送數(shù)據(jù)(程序從略)。
b.8031機(jī)通訊程序
8031機(jī)系統(tǒng)主程序完成串行口初始化,準(zhǔn)備輸出數(shù)據(jù)和處理輸入數(shù)據(jù)等與通訊有關(guān)的工作。它定義串行口為工作方式3,允許串行中斷,允許接收,置位多機(jī)通訊位及設(shè)置與PC機(jī)UART(異步通訊收發(fā)器)相同的波特率等。
8031機(jī)與PC機(jī)的數(shù)據(jù)通訊串行中斷服務(wù)程序框圖見(jiàn)圖d。該中斷服務(wù)程序由“令牌激活”,在一次中斷服務(wù)過(guò)程中完成整組數(shù)據(jù)的接