單片機(jī)與IBM-PC機(jī)的串行通信分析
51單片機(jī)和IBM - PC機(jī)是目前我國應(yīng)用最廣的兩種微型計算機(jī)。作為單片機(jī),51單片機(jī)不但功能強(qiáng),體積小,價格低,而且使用方便,特別市場上提供的多種51單片機(jī)開發(fā)系統(tǒng),為開發(fā)應(yīng)用51單片機(jī)提供了非常方便的手段。因此,51單片機(jī)在許多領(lǐng)域,特別是工業(yè)控制和智能儀器領(lǐng)域已得到廣泛的應(yīng)用。事實(shí)已證明,51單片機(jī)已成為8位微機(jī)之首。作為系統(tǒng)機(jī),IBM - PC的優(yōu)點(diǎn)已眾所周知,可以說,IBM - PC微機(jī)的出現(xiàn)為微機(jī)領(lǐng)域帶來了一場革命。在我國,由于漢字操作系統(tǒng)(CCDOS)的引入,使得IBM - PC在各個領(lǐng)域得到迅速的推廣使用。
串行通信是計算機(jī)進(jìn)行數(shù)據(jù)通信的主要方式之一。由于其連線少,成本低,再加上有調(diào)制/解調(diào)功能,因而特別適合于距離較遠(yuǎn),且通信點(diǎn)較多的場合,如各種計算機(jī)網(wǎng)絡(luò)和分布式系統(tǒng)等。RS - 232C是最常用的一種串行通信標(biāo)準(zhǔn)。在IBM - PC微機(jī)中,一般都有1~2個標(biāo)準(zhǔn)RS - 232C串行口,簡稱COM1和COM2。利用這兩個串行口,IBM - PC可以與其他數(shù)字設(shè)備(計算機(jī))進(jìn)行一般的數(shù)據(jù)傳送,或構(gòu)成局部網(wǎng)絡(luò)、多用戶系統(tǒng)和分布式控制系統(tǒng)等。
51單片機(jī)片內(nèi)即含有一個全雙工的串行口,并具有多機(jī)通信功能,可以方便地構(gòu)成多機(jī)控制系統(tǒng)。但是,由于51單片機(jī)的串行口并非標(biāo)準(zhǔn)的RS -232C,加上其波特率是采用系統(tǒng)時鐘由內(nèi)部通用定時器產(chǎn)生的,誤差大;而其數(shù)據(jù)處理速度也比系統(tǒng)機(jī)低得多。因此當(dāng)其與IBM - PC微機(jī)進(jìn)行串行數(shù)據(jù)通信,特別是構(gòu)成分布式多機(jī)控制系統(tǒng)時,將會遇到許多意想不到的技術(shù)問題,諸如硬件連接、波特率選擇、數(shù)據(jù)同步以及多機(jī)通信控制等。我們根據(jù)多年的實(shí)踐經(jīng)驗(yàn),對這些問題提出了一些具體解決辦法,供廣大同行參考。
一、硬件連接
RS - 232C采用負(fù)邏輯。其電平范圍通常為:邏輯1=-3~-15 V;邏輯0=+3~+15 V。由于51單片機(jī)的串行口是TTL電平,故必須進(jìn)行電平轉(zhuǎn)換,一般都采用MC1488(輸出)和MC1489(輸入)來完成。其連接方法如圖1- 32所示。圖中,MC1488采用土12 V電源,MC1489采用+5 V電源。IBM - PC串行口中的第4腳RTS(請求發(fā)送,輸出)與第5腳CTS(清除發(fā)送,輸入),以及第6腳DSR(數(shù)據(jù)裝置準(zhǔn)備好,輸入)與第20腳DTR(數(shù)據(jù)終端準(zhǔn)備好,輸出)分別連接在一起,主要是因?yàn)镻C機(jī)BIOS中的INT14H(串行通信程序)在接收和發(fā)送數(shù)據(jù)時,均要判別CTS和DSR是否有效。如果用戶自己編制通信程序,采用判斷收/發(fā)緩沖區(qū)是否滿/空的辦法來完成數(shù)據(jù)輸入/輸出,則可不必短接。
順便指出,IBM - PC及其兼容機(jī)串行口中的電平轉(zhuǎn)換器通常有兩種:老式原裝機(jī)和長城0520機(jī),采用7515075154。而一般的兼容機(jī)均用75188( MC1488)/75189 (MC1489)。1489中的每個接收門均有一個閾值電平控制端。當(dāng)該腳開路或接一電容C至地時,其閾值電平VT =1. 1~1. 25 V,即當(dāng)Vi≤1.1 V時,V。=1;V1≥1. 25 V時,V0=0。不難看出,這種電平與TTL電平具有兼容性。因此,圖1- 32中1488和1489均可用普通TTL反相器代換,從而省去了土12 V電源。但要注意的是,替換1488的反相器最好用OC門,以便擴(kuò)大電平范圍和增加驅(qū)動電流;而替換1489的反相器輸入端應(yīng)加雙向二極管電平箝位。此外,這種接法傳送距離不宜太長,一般應(yīng)在3m以內(nèi)(標(biāo)準(zhǔn)RS - 232C電平傳送距離可達(dá)15 m以上),距離過長,因兩端地電位不一致以及噪聲干擾會導(dǎo)致電平范圍出錯。
上述做法雖然省去了士12 V電源,但只適合于使用MC1488/1489的PC機(jī),且傳送距離近。為了與標(biāo)準(zhǔn)RS - 232C電平兼容,又不用±12 V電源,可采用圖1- 33所示的準(zhǔn)RS -232C電平轉(zhuǎn)換電路。圖中虛線框內(nèi)電路產(chǎn)生-7.0~-9.0 V的負(fù)電壓。其工作原理是,由CMOS反相器F1和F2構(gòu)成的多諧振蕩器產(chǎn)生f=0.7 MHz的方波,經(jīng)F3和F4雙門驅(qū)動后,高電平時對Cl充電,低電平時,Cl反過來又對C2充電,從而在C2上產(chǎn)生一定的負(fù)電壓。這里采用CMOS反相器,主要是為了降低其自身的功耗以及提高高電平電壓。值得一提的是,如果8031的ALE腳負(fù)載不重,亦可直接利用它作為時鐘源(1 MHz),這時由Fi和F2構(gòu)成的多諧振蕩器就可省去了;不過C1和C2要適當(dāng)加大些。
產(chǎn)生負(fù)電源還有一種既簡單,又實(shí)用的方法,如圖1- 34所示。如果將RTS引出,亦可產(chǎn)生正電壓而代替圖1- 33中的+5 V,這樣可進(jìn)一步擴(kuò)大電平范
圍。但要注意的是,圖1- 34中正負(fù)電壓是從信號中提取的,其驅(qū)動能力差,因此不宜帶過重的負(fù)載。
從圖1- 33中可以看出,這種電平轉(zhuǎn)換電路省去了±12 V電源,而且僅用2只廉價的三極管取代了較貴的1488/1489,因而大大降低了接口電路的成本,是一種非常實(shí)用的方法,特別是對于像前端控制機(jī)、單片機(jī)開發(fā)系統(tǒng)等提供土12 V電源有困難的系統(tǒng)。
二、波特率的選擇
波特率是串行通信中的一個關(guān)鍵參數(shù)。通信雙方波特率的一致性直接影響數(shù)據(jù)傳輸?shù)恼_性。當(dāng)誤差太大時,甚至無法進(jìn)行正常的傳輸。通常對于11位的串行幀(1位起始位+8位數(shù)據(jù)位+1位標(biāo)志位+1位停止位),所允許的最大波特率誤差應(yīng)不超過4.5%。
RS - 232C通信標(biāo)準(zhǔn)中,標(biāo)稱波特率有:50,110,150,300,600,1 200,2 400,4 800,9 600及19 200等。其中以1 200~9 600最為常用。IBM - PC的串行通信控制器采用的是In-te18250.其波特率是采用1.843 2 MHz專用時鐘,由16位的除法器產(chǎn)生的,可以精確地定出各種標(biāo)稱波特率。而51單片機(jī)的波特率是采用系統(tǒng)時鐘由定時器T,產(chǎn)生的。由于系統(tǒng)時鐘一般為6.0 MHz或12.O MHz,有效位數(shù)少,而T.又是用的8位自動裝入定時方式,因此,很難精確地定出各種標(biāo)稱波特率。當(dāng)兩臺51單片機(jī)進(jìn)行串行通信時,只要兩機(jī)的系統(tǒng)時鐘和定 時常數(shù)一致,就能保證數(shù)據(jù)正確傳輸。這時的波特率只是反映傳送的快慢,而不是非要達(dá)到多少精度。因?yàn)閮蓹C(jī)的波特率即使有誤差,也只是系統(tǒng)時鐘(晶體)上的誤差。這種誤差通常是很小的,可忽略不計;但當(dāng)51單片機(jī)與IBM - PC進(jìn)行串行通信時,這種誤差就大了。以4800波特為例:
對于PC機(jī),除法器控制常數(shù)為:
無誤差。式中,B為波特率。
對于51單片機(jī),當(dāng)系統(tǒng)時鐘fosc=6 MHz時,定時常數(shù)為:
因n必須為整數(shù),四舍五入后n=253(FDH);反過來,因取整得出的實(shí)際波特率為:
波特率誤差:
比所允許的誤差大,當(dāng)然數(shù)據(jù)也就無法正確傳輸了。同理,不難證明,在1200-9600的標(biāo)稱波特率范圍內(nèi),只有1 200是唯一可用的,其n=243(F3H),x-96(0060H)。顯然,對于那些想用高波特率傳送數(shù)據(jù)的用戶來說,這無形之中提出了一個難題。那么是否有辦法解決這一難題呢?辦法是有的,只是不能局限于幾個標(biāo)稱波特率上。其算法如下:
?、偌俣?1單片機(jī)上的一個定時常數(shù)n,一般n取值為F4H~FEH(波特率為1200~9600);
大n值重復(fù)上述①~④步求出下一個可用波特率。
根據(jù)上述算法,不難求出1 200~9 600的所有可用波特率(假定fosc=6.0 MHz),如表1- 16所列。注意,如果使用表1- 16中的非標(biāo)稱波特率來進(jìn)行通信,那么PC機(jī)程序就不能調(diào)用INT14H的功能0來初始化串行口波特率了,而只能采用下述子程序(以COMi為例),即直接往除法器送控制常數(shù)。
三、數(shù)據(jù)同步
串行通信分同步和異步兩種方式。盡管51單片機(jī)的串行口既可進(jìn)行同步通信(方式0),又可進(jìn)行異步通信(方式1~3),但I(xiàn)BM - PC機(jī)的串行口只有異步方式。在異步串行通信中,波特率的一致性是數(shù)據(jù)位同步的保證,而幀同步只能靠DSR/DTR和RTS/CTS等異步通信控制信號了。遺憾的是,51單片機(jī)串行口沒有這些控制信號。因此,當(dāng)51單片機(jī)與IBM - PC進(jìn)行串行通信時,雖然波特率選擇一致,能保證單個字節(jié)傳輸正確,但無法保證大塊數(shù)據(jù)傳輸正確。例如,當(dāng)PC機(jī)往單片機(jī)每次單獨(dú)傳送一字節(jié)時,51單片機(jī)都能正確接收,但連續(xù)傳送一批數(shù)據(jù)時,由于單片機(jī)比PC機(jī)的指令處理速度低,PC機(jī)發(fā)送一字節(jié)后,單片機(jī)可能還沒取走,PC機(jī)就發(fā)出下一字節(jié)了。這樣就會導(dǎo)致大量數(shù)據(jù)被丟失。由此可見,在PC機(jī)與51單片機(jī)的串行通信中,數(shù)據(jù)幀(1幀-10或11位)同步也是一關(guān)鍵問題,下面介紹兩種同步方法。
1.硬件方法
在圖1- 32的基礎(chǔ)上,借助于8031 P??诘钠渌粊砟M各異步通信控制信號。其連接方法如圖1- 35所示。這樣利用RTS/CTS和DSR/DTR就可方便地完成異步雙向串行數(shù)據(jù)傳輸了。如果PC機(jī)程序不是通過調(diào)用INT14H,而是通過自己設(shè)計的一個子程序來完成收/發(fā)數(shù)據(jù)的,那么只要使用兩組信號中任意一組,即可完成異步傳輸,這樣又可省去兩根連線。
通過8031外部擴(kuò)展一個異步通信控制器8251,也是一種行之有效的方法,只是那樣做以后,硬件成本提高,軟件控制也變得復(fù)雜了。
2.軟件方法
一種很容易想到的軟件方法就是“延時法”。例如,當(dāng)PC機(jī)要往單片機(jī)發(fā)送一批數(shù)據(jù)時,每發(fā)一個字節(jié),就延時一段時間,以便單片機(jī)能及時將剛收到的字節(jié)取走并處理完。這種做法的困難在于延時常數(shù)不好確定。一種改進(jìn)方法就是,一方面發(fā)送方采取一定的延時,另一方面在發(fā)送一組(可以是一字節(jié),也以可是若干字節(jié))數(shù)據(jù)后,接收方應(yīng)回答一個數(shù)據(jù)信號(不是控制信號!)。該信號既可表示接收到的數(shù)據(jù)正確與否,又可起同步作用。