基於RS485的雙機通訊,(非紙上談兵)基於PIC18F452、51單片機實踐+Proteus仿真,串口異步通信。

歷經大概半個月的修修改改,期間出現了不少事情,比如電腦進水報廢,考試周等影響,今天總算有了點進展。

給出下我實現的複雜的雙機通訊任務需求吧,課設的任務。

這裏先給出成功實現之後的圖片吧。

仿真:

再給出實際的電路(這裏加上了RS485,否則杜邦線直連也是可以的,只不過這樣單片機得挨着,杜邦線短,另外兩個單片機還得共地)搭建:

 

這裏的門道好長,目前爲止我也還只是一知半解。

一點需要明白的就是兩個單片機的通訊,找到的TXD、RXD引腳與RXD、TXD杜邦線連接即可,(兩個單片機緊挨着,沒那麼長的杜邦線)即能進行雙機通訊。

另一點,有關於RS485的通訊,我現在的理解不過是爲了滿足工業上的需求,長距離傳輸(重點!),TXD、RXD的引腳加一個TTL電平轉RS485模塊,然後模塊間用銅線相連。並且RS485是半雙工通信的,所以程序需要保證主機和從機不要同時發送或者接受數據即可,其餘不需要進行任何改動,就跟普通的串口異步通信一樣,代碼都沒什麼高大上的區別的

(工業上用雙絞屏蔽線,價格昂貴,只是學習用用RS485便沒必要,所以隨便剪了家裏沒用的網線,裏面有兩根銅線那種,或者有三根也是可以的,因爲這個模塊有A+、B-、接大地)

這個電路模塊是成對的,雙機通訊,需要兩個,每個單片機配備一個。

以後還要做做多機通訊,得交給軟件敲代碼實現了,那麼就還需要去淘寶上買一個。

在淘寶上遇到的坑挺多的,首先買到的只是個半成品,當初還不知道有個叫接線端子的東西,誤以爲要將銅線直接焊接到焊盤上,或者說接排針,焊盤孔徑又比普通的排針孔大一圈,當時就很糾結,也是自己看到買來的單片機開發板有這麼一個東西,螺絲刀擰開發現能將線固定在裏面,才發覺這個好玩意,心酸。

網頁淘寶打開發現有些店家直接賣了有賣成品,省去焊接的步驟)。

以下爲半成品。

(淘寶上的圖片看着大,實際拿到手特別小的東西)

綜上實際裏用到的RS485搭建就是這樣,後續得加入主機對兩臺從機的多機通訊。

放張使用485模塊的連接圖:

至於說實際中用到的各種CRC校驗,ModBus協議在這裏派不上用場,

另外網上的介紹也有點照本宣科,紙上談兵的意味,看不明白,還得靠自己積累理解。

至於爲什麼我的硬件連接,LCD屏的位置和矩陣鍵盤都外接,是由於從老師那裏拿來的開發板過於古老,矩陣鍵盤按鍵老化,個別按鍵不靈敏,並且加入矩陣鍵盤,原來開發板上的引腳已經通過PCB固定和LCD接口相連,只能挪出去方便給外接的矩陣鍵盤讓路,自己再接LCD顯示屏(這裏的顯示屏電路承接之前的博客,還是有所方便的。)

實際調試過程中,還可以用TTL轉USB接口,用於單個單片機與電腦的串口通信。從老師那裏拿到CP2102的USB轉TTL進行調試,還是挺方便的。同時引腳上的5V和GND可以給單片機供電,只有一個外接的電源接口,另外一個單片機只能用它進行供電了。

同時串口異步通信最重要的是大局觀吧,首先得知道TXD、RXD引腳很方便地可以給發送寄存器賦值TXREG=‘a(or 1)’等其他ASCII碼(51單片機後續可以考慮加入多機通訊來做,TXD、RXD都相同,只是寄存器名字不同),然後TXD引腳可以發送,而不需要人爲八位輸出高低電平來攜帶信息,也就是說發送和接受已經有專門的硬件替你做了,省事,這點得知道。當然輸出高低電平模擬信息發送更爲底層也需要去做,這樣也就更深刻,所以待探索,學這些更多的只是追求深度,而不是看看書,實際裏的門道多了去,我想進一步研究有關各種ModBus協議,並加以應用,這纔是將來從事電子這一行業必備的素養。

學習這回事你得知道,其實用用芯片,搭建電路這些靠經驗積累,到一定階段你會發現這些會用就可以了,難的更難,複雜的諸如芯片製造,硬件接口這些都是前人做好的,還是很方便的,不要怕難,不要怕沒資源,總能自己摸索出一條道路的,畢竟還只是停留在應用層的上端,而不是底層。同時硬件跟仿真不一樣的時候,95%是程序問題,而不應該責怪硬件出問題,成熟的芯片一定是經過千錘百煉的,所以態度,大局觀得奠定,是最爲重要的。

 

綜上這麼一堆廢話,其實是對成果的一個總結,實際的代碼,後續再更,如果有需要的話,可以留言我發你呀

講下未來的規劃,首先得對串口助手裏的校驗各種方式要有所瞭解,然後進行多機通訊。

必要的話,還可以學會看看USB轉TTL電平芯片手冊和RS485的芯片手冊,以及研究RS485模塊。

 

2019.1.26:

更新一波關於PIC18F452與stc89c52單片機的通訊,其實也就是將之前PIC單片機作爲從機的部分依葫蘆畫瓢移植到51裏面即可,但是區別有所不同。

對於51而言,串口中斷UART,發送完一個字節和接受完一個字節(在打開ES串口中斷的情況下)都會進入中斷,而不是能像PIC單個控制,PIC裏我只打開了接受的中斷,故這裏面有點講究。

與此同時區別於PIC的TXREG、RCREG的發送和接受寄存器,

51在邏輯上只有SBUF寄存器,雖然在物理上區別開了發送和接受,

但是程序裏只有一個SBUF來做發送和接受。

和PIC類似的是,SBUF如果當接收寄存器用的話,並不能在程序裏將SBUF裏的內容清零,例如SBUF = 0;是不可取的,這相當於給發送寄存器賦值0x00而不是將接收寄存器裏的內容清零。

PIC: RCREG = 0;這條語句讓接收寄存器(ReCeive REGister)裏的內容清零同樣不可取

我採用覆蓋的方法,即如果要只發送一個字節例如‘*’給從機,從機接受到並在while(1)判斷的話,

if(RCREG == '*'){};如果沒有覆蓋的話,這條if語句裏的內容將不斷被執行,如果一次性發送兩個字節,比如‘*’‘ #’那麼在while(1)的循環裏,if語句成立就只執行一次,下一次RCREG裏爲‘#“,就不會一直執行if成立后里的內容了。

區別PIC,51裏的SBUF接收,我沒開啓中斷的話,要想能在接收寄存器裏裝載內容,看了手冊,發現每次需要讓RI = 0;

 

再賦個實際圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章