GMS972051是韓國LG公司生產(chǎn)的MW內部帶2K E2PROM的與MCS-51兼容的單片機,。GMS97C2051省去了MCS-51的P0和P3口,但是多了一個內部硬件比較器,。由于單片機的通信信號為TTL電平,如果不采取其它的措施,其在通信速率為9600bps時通信距離不超過5米,。一般為了延長單片機的通信距離,采用RS-232/RS-485轉換器,、RS-232/RS-422轉換器或光隔遠程收發(fā)器,。本文介紹的方法可將GMS97C2051單片機之間通信距離延長到1200米以上,而且不需要添加任何硬件措施,,完全用軟件來實現(xiàn),。
要用純軟件方法實現(xiàn)GMS97C2051單片機之間的遠程通信,首先必須將單片機的TTL電平的軟件方法轉換為差分電平,,其次要用普通I/O口線來構成軟件串行口,,并且在軟件上進行正確的配合。
TTL電平轉換成差分電平的純軟件方法
GMS97C2051單片機的信號均為TTL電平,。TTL電平信號傳輸距離非常有限,,一般在9600bps傳輸率時傳輸距離不超過5米。而差分電平信號則是取決于兩種信號線之間的電平差值,,如果某條信號線的電平高于另一條,,則信號為1,否則為0,。由于差分電平信號可以避免長距離傳輸導線上的電荷積累,,并且具有更寬的電平范圍,所以傳輸距離遠得多,。RS485差分電平信號在9600bps傳輸率時傳輸距離可達1200米,。
為了用純軟件實現(xiàn)差分電平傳輸就不能使用GMS97C2051本身的硬件串行口,而是用普通I/O線來實現(xiàn)串行通信,。差分電平要用兩條I/O口線來實現(xiàn),,比如P1.2和P1.3兩條線(見圖1)。當傳輸信號為1時,,P1.2為+5V,,而P1.3為0V。當傳輸信號為0時,,P1.2為0V為0V,,而P1.3為+5V,。注意P1.2和P1.3不得同時置+5V或同時置0V。
GMS97C2051單片機的P1.0和P1.1可以分別作為片內精密模擬電壓比較器的正輸入端(AIN0)和負輸入端(AINI),,所以正好可以用于接收差分電平信號,。內部電平比較器的輸出已經(jīng)在芯片內部連到P3.6口,所以可以通過讀取P3.6口的值來得到差分電平信號,。
軟件串行口的實現(xiàn)方法
由普通I/O口線來實現(xiàn)串行通信,,習慣上稱為軟件串行口。采用差分電平通信的軟件串行口的硬件接線圖如圖2.A,、B兩機均為GMS97C2051單片機,。P1.2和P1.3用于發(fā)送,P1.0和P1.1口用于接收,,P1.0同時接本機中INI0,。軟件串行口一般全用標準的10位異步通信格式:1位起始位(信號0),8位數(shù)據(jù)位,,1位停止位(信號1),。接收時均是低位數(shù)據(jù)在前,高位數(shù)據(jù)在后,。
軟件串行口接收和發(fā)關的工作原理和過程如下:單片機復位后,,執(zhí)行初始化程序時,定義P1口為位控方式,,其中P1.0和P1.1定義為輸入,P1.2和P1.3定義為輸出,。P1.2初始化為"1",,P1.3初始化為"0",這樣發(fā)送信號處于停止位(差分電平"1"),。定義INT0為負沿觸發(fā),。允許中斷且定義成高優(yōu)先級,然后開中斷,,兩機進入隨時可開始串行通信的等待狀態(tài),。A、B不通信時,,兩機的收發(fā)均為"1",,一旦某機(假設為A)需要與對方通信,A機以約定的波特率(假定為9600bps),,通過P1.2和P1.3發(fā)送,。發(fā)關和接收一個字節(jié)的過程如下:
A機發(fā)送端首先發(fā)送起始位("0"電平),B機INT0引腳產(chǎn)生下跳沿后,,產(chǎn)生中斷申請,。B機CPU響應此中斷后,,執(zhí)行INT0中斷服務子程序。在中斷服務子程序開始,,用位輸入指令讀入P3.6狀態(tài),,如果是"1"電平,則表明此次中斷是受干擾所致,,因而取消此次接收過程,,中斷返回;如果P3.6狀態(tài)讀入電產(chǎn)是"0",,則表明本次中斷確系A機發(fā)送超始位所引起,,經(jīng)精確延時,在A機發(fā)送各數(shù)據(jù)位中間處進行采樣,,獲得各數(shù)據(jù)位的狀態(tài),,最后生成一個字節(jié),送有關單元之后中斷返回,。雖然送往INT0的信號為TTL電平,,但是由于它的傳輸速率非常之低,加上軟件抗干擾措施,,所以仍然可以有效地傳輸1200米,。
軟件串行中遠程通信的關鍵是如何以較高的波特率可靠地實現(xiàn)數(shù)據(jù)的發(fā)送和接收。下面介紹一組以9600bps波特率設計,,用MCS-51匯編語言編寫的具有很強抗干擾能力和很高可靠性的收發(fā)一個字節(jié)的子等等程序,。
軟件串行通信的編程
串行通信要實現(xiàn)成功接收必須解決以下關鍵技術:(1)要準確、快速檢測出對方發(fā)出的超始位以及起始位負跳變的時刻,;(2)保證在每個數(shù)據(jù)位中間采樣,;(3)具有有效的校驗和查錯手段。
我們針對性地采取以下措施:用定義成高級中斷的外中斷引腳下接收線相連,,來及時捕捉起始位信息,,并在確定采樣時刻的計算中扣除中斷響應滯后的延時時間;精心設計,、編寫程序,,逐條計算指令實際執(zhí)行時間,排除其他中斷干擾(關中斷),,從而保證在每個數(shù)據(jù)位中間處進行采樣,;每位重復采樣多次,確定各數(shù)據(jù)位的狀態(tài),,從而可大大減少遠程通信常見的瞬態(tài)干擾(其特點是幅度大,、作用時間短、隨機性強)對通信的不良影響,。綜合采用上述技術措施以中斷方式工作的接收(1幀)的中斷服務源程序見程序清單):
以上指令共46個機器周期(T),,加上中斷響應平均延時5個機器周期,,所以程序執(zhí)行到此,即A機發(fā)送起始位(開始變低)到此已經(jīng)歷51T,。由于MCS-51指令的1個機器周期(T)相當于12個時鐘周期,,所以當用12MHz的晶振時,1個機器周期(1T)相當于是1μs,。51T相當于51μs,。
從A機發(fā)出超始位到此共延時51T+4T+88T=143T,相當于143μs,。
傳輸率為9600bps時,,每位費時104μs(即1s/9600)。從起始位開始到D0位中間1.5位,,費時1.5×104μs=156μs,。下面程序在156μs及其前后各11μs處對D0位進行共3次采樣,記錄D0采樣結果為0次數(shù),。如果3次采樣結果為0的次數(shù)小于等于1,,則判斷D0=1。如果3次采樣結果為0的次數(shù)大于等于2,,則判斷D0=0,。這樣極大地增強了串行通信的可靠性。然后再經(jīng)過延時后對其他各位數(shù)據(jù)進行同樣的三次采樣,,直到D0~D7共8位數(shù)據(jù)全部采樣結束,。
以上程序執(zhí)行用去40T,加上前面的143T,,共花去183μs,。每次返回NEXT3循環(huán)一次,讀入一位數(shù)據(jù),。在程序輸入NEXT3前,給R0賦值02H,,就能保證以后各位數(shù)據(jù)位3次采樣的準確時刻,。此中斷服務子程序段不僅能實現(xiàn)在每位數(shù)據(jù)采樣,而且還在中間時刻前后11μs各采樣1次,。以3次數(shù)據(jù)的多數(shù)結果確定該位的值,,可大大降低因干擾出錯的概率,因此在干擾嚴重的遠程通信中有很強的適應性,。
結語
本文介紹的GMS97C2051單片機遠程通信的純軟件方法和程序也適合于ATMEL公司的AT89C2051單片機,,對其他單片機的遠程通信也具有一定的參考價值。文中提供的軟件接口方法和源程序經(jīng)實際應用表明,,該方法可延長通信距離至1200米(9600bps時),。本方法的不足之處在于軟件編程要求比較高,,如果要實現(xiàn)即軟件編程簡單、又通用性好的單片機遠程通信,,還是要使用RS-232/RS-485/RS-422轉換器或光隔遠程收發(fā)器,。