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