單片機間通信的方式通常有并行通信和串行通信兩種。并行通信優(yōu)點是傳送的速度快,缺點是占用的數(shù)據(jù)傳輸線多,長距離傳輸成本高。單片機間通信通常采用串行通信方式。本例實現(xiàn)在單片機甲與單片機乙之間傳送數(shù)據(jù)。
通信雙方約定發(fā)送方為甲機,接收方為乙機。首先甲機向乙機發(fā)送一聯(lián)絡(luò)數(shù)據(jù)(0xAA),乙機接收到后響應(yīng)應(yīng)答信號(0xDD),然后接收甲機發(fā)送的數(shù)據(jù)。如果乙機接收到的數(shù)據(jù)不正確,就向甲機發(fā)送0xFF,甲收方收到OxFF后重傳數(shù)據(jù)。
在串行通信中,如果兩單片機系統(tǒng)之間的距離很短(lm以內(nèi)),可利用單片機的串口直接相連的方法實現(xiàn)雙機通信,連接時注意一方的TXD與另一方的RXD引腳相連接。如下圖所示。
如果通信距離較遠(yuǎn)(30m以內(nèi)),可利用RS-232C接口延長通信距離,此時必須將單片機的TTL電平與RS-232C標(biāo)準(zhǔn)電平進行轉(zhuǎn)換。這就需要在雙方的單片機接口部分增加RS-232C電平轉(zhuǎn)換芯片,常用的此類芯片有MAX232等,系統(tǒng)框圖如下圖所示。
單片機間雙機通信的結(jié)構(gòu)框圖如下圖所示,系統(tǒng)的硬件主要包括單片機和電平轉(zhuǎn)換芯片。單片機選用89C51,由于單片機的信號為TTL電平(0V~5V),如果利用RS-232標(biāo)準(zhǔn)總線接口進行較遠(yuǎn)距離的通信,必須把單片機輸出的TTL電平轉(zhuǎn)換為RS-232標(biāo)準(zhǔn)電平。運用電平轉(zhuǎn)換芯片MAX232進行單片機雙機串行通信的電路如圖所示,圖中只畫出了通信一方的單片機接口電路。
整個系統(tǒng)包括單片機最小系統(tǒng)和MAX232電平轉(zhuǎn)換電路。MAX232具有兩路收發(fā)器,這里只使用了其中的一路。注意另一方的單片機RXD、TXD的連接方式與本圖不同,通信雙方MAX232的TOUT、RIN應(yīng)分別與對方的RJN、TOUT相連,注意通信的雙方地線也要連接起來。
下面的程序中,單片機的晶振選用頻率為11.0592MHz,串口工作在方式1,通信的波特率為9 600bit/s,發(fā)送和接收數(shù)據(jù)均采用的是查詢方式。程序流程圖如下圖所示。
主要由以下子程序構(gòu)成。
·voidinit():完成串口初始化功能。
·voidsend0:完成甲機發(fā)送數(shù)據(jù)功能。
·voidrecv():乙機根據(jù)制定的聯(lián)絡(luò)信號接收數(shù)據(jù)的功能。
具體程序如下:
1.串口初始化子程序voidinit()
串口初始化子程序init()設(shè)定串行口工作在方式1,波特率為9600bit/s,程序代碼如下:
2.甲機發(fā)送子程序voidsend()
甲機發(fā)送子程序send()完成甲機發(fā)送數(shù)據(jù)功能。首先發(fā)送聯(lián)絡(luò)信號,然后等待乙機響應(yīng)。
乙機準(zhǔn)備好后響應(yīng)甲機的聯(lián)絡(luò),然后計算校驗和并發(fā)送數(shù)據(jù),等待乙機響應(yīng),若乙機響應(yīng)正確則從子程序中返回,否則再次發(fā)送數(shù)據(jù)并等待乙機響應(yīng),程序代碼如下:
3.乙機接收程序voidrecv()
乙機接收程序根據(jù)制定的聯(lián)絡(luò)信號接收數(shù)據(jù)。接收到數(shù)據(jù)后,如果收到的數(shù)據(jù)不是0×AA,則發(fā)送0×FF數(shù)據(jù)表明未收到聯(lián)絡(luò)信號并繼續(xù)等待。收到聯(lián)絡(luò)信號后,接收數(shù)據(jù)并計算校驗和,若校驗正確則發(fā)送0×00表明數(shù)據(jù)正確,否則發(fā)送0×FF說明數(shù)據(jù)接收錯誤。程序代碼如下:
單片機利用串行口發(fā)送數(shù)據(jù),可以用查詢方式發(fā)送數(shù)據(jù),也可以采用中斷方式。而接收數(shù)據(jù)時一般采用串行口中斷的方式接收數(shù)據(jù)。本例程中發(fā)送和接收均采用查詢方式。
為保證通信的正常進行,發(fā)送方和接收方的數(shù)據(jù)幀格式、波特率要設(shè)置一致,通信雙方單片機系統(tǒng)的晶振頻率盡量選用一樣的。
只知道對方的波特率時,要合理選用晶振,使兩個通信設(shè)備間的波特率誤差小于2.5%。
如我們?yōu)榈玫浇?jīng)常使用的l200bit/s、9600bit/s波特率而采用11.0592MHz的晶振。例如晶振選用11.0592MHz時,若要求通信波特率為9600bit/s,SMOD=0,則根據(jù)公式計算得定時器Tl的初值TH1正好等于253;若采用12MHz的晶振,則得到THl=252.74,經(jīng)取整(253)后計算得到的波特率為10416bit/s,波特率存在著較大的誤差。
另外通信的雙方還必須遵守一定的通信協(xié)議,通信協(xié)議是通信的雙方的一種預(yù)先約定,包括對數(shù)據(jù)格式、同步方式、傳送速度、傳送方法、糾錯方式等做出的統(tǒng)一規(guī)定,通信的雙方必須嚴(yán)格遵守通信協(xié)議。