表1列出的是XTAL作為時(shí)鐘源時(shí)異步模式常用波特率對應(yīng)的波特率寄存器的值。 當(dāng)采用12MHz頻率時(shí),異步模式的最大波特率為750kbps,同步模式為3Mbps。
2 串行通訊的軟件設(shè)計(jì)
80C196KC串行通訊的軟件設(shè)計(jì)可以采用查詢和中斷兩種不同的方式。查詢方式通過訪問串行口控制/狀態(tài)寄存器的標(biāo)志位TI和RI,檢查發(fā)送寄存器SBUF(TR)是否空或者接收寄存器SBUF(RX)已經(jīng)接收了一幀數(shù)據(jù)。
下面的程序采用查詢方式接收和發(fā)送N個(gè)字節(jié)數(shù)據(jù),其中串行口設(shè)置為工作模式1,波特率57600,不設(shè)奇偶校驗(yàn),12MHz晶振。
初始化程序:
ldb sp .#offfoh ;設(shè)置堆棧指針
ldb r_buf, #0e000h ;設(shè)置接收數(shù)據(jù)區(qū)地址指針
ldb t _b u f #2300h ;設(shè)置發(fā)送數(shù)據(jù)區(qū)地址指針
orb ioc 1, #20h ;選通TXD引腳功能
ldb temp, #20h ;設(shè)置臨時(shí)寄存器
ldb baud _rate , #och ;設(shè)置波特率57600
ldb baud _rate, #80h
ldb sp_con,# 19h ;設(shè)置串行通訊方式1,不設(shè)奇偶校驗(yàn)
ldb count, # N ;設(shè)置通訊數(shù)據(jù)塊大小
………
接收程序:
read : ldb temp , sp _stat ;查詢狀態(tài)寄存器Ri標(biāo)志
jbs temp , 6 , read
ldb dl , sbuf ;接收并保存數(shù)據(jù)
stb dl,[ r _buf]+ ;將數(shù)據(jù)存入接收數(shù)據(jù)緩沖區(qū)
djnz count, read ;未接收完數(shù)據(jù),繼續(xù)跳轉(zhuǎn)查詢狀態(tài)寄存器RI
………
發(fā)送程序:
send : ldb temp, sp _stat ;檢查狀態(tài)寄存器TI標(biāo)志
jbc temp, 5, send
ldb dl, [ t _buf]+ ;發(fā)送寄存器空,取數(shù)據(jù)
ldb sbuf , dl ;發(fā)送數(shù)據(jù)
djnz count, read ;未發(fā)完數(shù)據(jù),繼續(xù)跳轉(zhuǎn)查詢狀態(tài)寄存器TI
………
查詢方式設(shè)計(jì)程序簡單,但由于CPU不斷查詢標(biāo)志位,不能做其它工作,因此,程序效率不高,不能用于對實(shí)時(shí)性要求高的場合,利用串行中斷設(shè)計(jì)程序可以有效克服這些缺點(diǎn)。在96系列微處理器中,8098和8096只有一種中斷方式,而80C196KB以后的產(chǎn)品又增設(shè)了發(fā)送中斷和接收中斷,分別設(shè)置了獨(dú)立的中斷向量。下面的程序采用中斷方式接收和發(fā)送N個(gè)字節(jié)數(shù)據(jù),其中串行口設(shè)置為工作模式1,波特率57600,不設(shè)奇偶校驗(yàn),1MHz晶振。
初始化程序:
1db sp ,#lfffoh ;設(shè)置堆棧指針
ld bx, #2200h ;設(shè)置接收中斷向量地址
l d ax, #2032h
st bx, [ax]
ld bx, #2250h ;設(shè)置發(fā)送中斷向量地址
ld ax, #2030h
st bx , [ax]
orb ioc1, #20h ;選通TXD引腳功能
ldb temp, #20h ;設(shè)置臨時(shí)寄存器
1db baud _rate, #0 ch ;設(shè)置串行通訊波特率56700
1db baud _rate, #80h
1db sp _con, #19h ;設(shè)置串行通訊方式1,不設(shè)奇偶校驗(yàn)
clrb int _mask ;清除中斷屏蔽寄存器和中斷懸掛寄存器
clrb int _pend
clrb int _mask 1
clrb int _pend 1
orb int _mask 1,#03h ;置中斷屏蔽寄存器1,容許發(fā)送和接收中斷
1d count, #N ;設(shè)置通訊數(shù)據(jù)塊大小
ei ;開中斷
………
1db d1, [ t_buf] +
1db sbuf, dl
………
接收中斷子程序 :org 2200h
pushf ;保護(hù)現(xiàn)場
1db d1, sbuf ;接收并保存數(shù)據(jù)
stb d1, [ r_buf]+
djnz count, exit 1 ;未接收完數(shù)據(jù),退出等待下一次接收中斷
………
exit 1: popf ;出棧
ret
發(fā)送中斷子程序:org 2250h
pushf ;保護(hù)現(xiàn)場
orb int _mask1,#01h ;置中斷屏蔽寄存器1,容許發(fā)送中斷
1db d1, [ t _buf]+ ;發(fā)送數(shù)據(jù)
1db sbuf, d1
djnz count, exit2
………
exit2: pop ;恢復(fù)現(xiàn)場出棧
ret
3 串行通訊應(yīng)注意的幾個(gè)問題
用戶在串行通訊設(shè)計(jì)時(shí)應(yīng)注意,串行口中斷不要與接收中斷、發(fā)送中斷同時(shí)打開,只能開放二者中的一個(gè),設(shè)計(jì)中通常采用接收中斷和發(fā)送中斷,實(shí)現(xiàn)全雙工串行口的功能;由于訪問狀態(tài)寄存器SP_STAT后,其中內(nèi)容即被清除,因此,必須用其它寄存器保存SP_STAT的內(nèi)容;另外,當(dāng)利用發(fā)送器的雙緩沖器特點(diǎn)發(fā)送數(shù)據(jù)時(shí),不應(yīng)把串行口中斷屏蔽掉,否則可能會漏記被發(fā)送的字節(jié)數(shù);此外,當(dāng)串行口兩端采用不同的晶振頻率或鏈路的一端是80C196KC串行口,另一端為其他系統(tǒng)時(shí),應(yīng)認(rèn)真考慮兩者的匹配問題,若發(fā)送端和接收端的波特率完全一致,則接收端對每一數(shù)據(jù)位的采樣都發(fā)生在位周期的中點(diǎn),能夠可靠通訊;若發(fā)送端和接收端的波特率不一致,則在數(shù)據(jù)的連續(xù)傳輸過程中,接收端對數(shù)據(jù)位的采樣點(diǎn)將愈來愈偏離位周期的中點(diǎn),產(chǎn)生累積誤差,最終導(dǎo)致通訊紊亂。所以,用戶在串行口設(shè)計(jì)中,必須考慮波特率誤差帶來的影響。通訊方式,通訊數(shù)據(jù)量,握手方式等通訊協(xié)議的內(nèi)容,必須通過實(shí)驗(yàn)測試加以驗(yàn)證。
4 80C196KC串行通訊的應(yīng)用
某雷達(dá)仿真平臺的控制電路中采用了80C196KC微處理器作為核心芯片,利用串行口完成目標(biāo)坐標(biāo)諸元數(shù)據(jù)和命令的交換。其中,80C196KC微處理器的串行口采用通訊模式1,波特率為57600,接收采用中斷方式,發(fā)送采用查詢方式。串行通訊內(nèi)容分為數(shù)據(jù)和命令兩類,各由HEAD和BODY兩部分組成,80C196KC每次接收到串行口上的信息時(shí),產(chǎn)生接收中斷。在中斷服務(wù)程序中,完成對接收到的信息的識別和處理,檢查標(biāo)志并提取其中的有效部分,若為指令,則執(zhí)行;若為數(shù)據(jù),則存入接收數(shù)據(jù)緩沖區(qū)。若從串口發(fā)送數(shù)據(jù)時(shí),按照通信協(xié)議的格式,將發(fā)送數(shù)據(jù)送入發(fā)送緩沖區(qū),以查詢方式將數(shù)據(jù)寫入SBUF,直至發(fā)完全部數(shù)據(jù)。 目前,該串行口運(yùn)行良好,實(shí)現(xiàn)了計(jì)算機(jī)同微處理器之間的高速(57600和115200兩種波特率)通訊,達(dá)到了系統(tǒng)的設(shè)計(jì)要求。
參考文獻(xiàn)
1 涂時(shí)亮姚志石.單片微機(jī)MCS—96/98實(shí)用子程序.上海復(fù)旦大學(xué)出版社1991年9月
2 張幽彤陳寶江.MCS8098系統(tǒng)實(shí)用大全.北京:清華大學(xué)出版社1993年9月
3 朱曉強(qiáng)姚志石 .8096/8098單片機(jī)原理及應(yīng)用.上海:復(fù)旦大學(xué)出版社 .1993年5月
4 孫涵芳 .lntel 16位單片機(jī).北京:北京航空航天大學(xué)出版社1995年11月
5 鮑可進(jìn).一種實(shí)用的單片機(jī)系統(tǒng)的RS—232接口.
實(shí)驗(yàn)室研究與探索.1997;(5):75~78
(收稿日期:1999-06-21)





