<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/LearnHardware" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
前言
之所以寫這一節博文,主要是說一下關於485的自動收發問題!
不過還是從485怎么來的開始說起,然后到各種具體使用細節.
冒昧問一句:485是什么?
485是什么呢? 答:485是一種傳輸邏輯0和1電信號的方式!
講一下歷史
1.要想知道為啥有485,那要從實際應用中出發,
咱當前使用的這些已經規定好的通信方式,是人們在長期的摸索中最終總結出來的比較好的方式.
最簡單的就像下面這樣子,發送端是5V,接收端接收到5V
發送端是0V,接收端是0V.
但是呢長久以來人們要解決的問題是:如何讓傳輸的電壓更小,傳輸距離更遠,抗干擾性更強!

2.如何讓傳輸距離更遠?
大家都知道導線都是有電阻的,你在這邊電壓是5V,經過導線以后肯定會衰減到5V以下
導線越長,衰減的越厲害!
好多人就在考慮了怎么解決呢??
其實人們就想,直接增加輸出端的電壓,然后RS232傳輸方式就出來了
同時人們規定:
如果要發送高電平信號就把導電的電壓設置為-3V到-15V之間
實現RS232通信方式的芯片有很多(MAX232,SP3232)
假設我要讓對方接收高電平信號,那么其實是這樣子

假設我要讓對方接收低電平信號,那么其實是這樣子

3.但是這樣子還是不能滿足,畢竟無限的提高電壓不是長久之計
后來呢有人發現了用差分的方式傳輸數據
什么是差分呢!
就是用兩根電線作為一個數據線做數據傳輸
咱把其中一根電線叫 A,另一根電線叫B
然后規定:
如果A線電壓比B線電壓高200mV以上,就認為傳輸是高電平信號!
如果B線電壓比A線電壓高200mV以上,就認為傳輸是低電平信號!
4.看圖說明
假設我要讓對方接收高電平信號,那么其實是這樣子(A>B)

假設我要讓對方接收低電平信號,那么其實是這樣子(B>A)

5.不過一開始興起來的是RS422通信方式(發送是發送的線,接收是接收的線,分開了)
在這里引入一個名詞:全雙工
發送數據的同時也能夠接收數據,兩者可以同步進行 美名曰:全雙工通信
422通信方式發送是發送的線,接收是接收的線,分開了,所以RS422通信方式是支持全雙工通信的

6.后來呢,人們感覺4根線太多就去掉其中兩根(RS485)
不過這樣就出現了另一個名詞: 半雙工
通信的時候在一個時間點,只能單方向的傳輸
左邊發送數據給右邊的時候,右邊不能同時發送數據給左邊.反之亦然.

關於串口通信
咱們做單片機的經常會說串口通信
其實當RS232方式通信出來的時候,當時用RS232方式通信叫串口通信
就是老式的台式電腦后面的這個口(RS232出來的時候還沒有出現差分通信方式,所以電腦是沒有USB的)

但是隨着時間的推移,漸漸地把單片機上面的UART通信叫做了串口通信
注意哈,如果你和老工程師聊天,說到串口通信.
你一定要說電腦RS232通信,單片機TTL通信!
說一個我朋友經歷過的故事:
一個老工程師問我朋友,單片機上有串口通信,
是不是直接可以接到電腦上(RS232接口)實現通信??
其實這個老工程師那心里面串口通信就是RS232通信
他把單片機的串口通信也認為了是RS232電平的通信了!
關於UART通信協議
1.基本上所有的單片機都有UART通信的引腳.現在用的最多的通信協議還是UART.
我就直接舉例子說了.
假設通信的波特率是9600
那么意思就是說每隔 1/9600 秒傳輸1位數據(約104us)
假設傳輸8位數據 0x55(0101 0101) ,然后沒有奇偶校驗,停止位1位
根據UART協議,真實的信號是這樣子的


注意1:上面之所以是1010 1010 是因為先傳輸的低位后傳輸高位
注意2:因為是9600HZ所以每隔約104us傳輸一位數據,上面測得的是103.97us
注意3:UART協議規定在傳輸開始的時候是先有一個低電平
(低電平時間就是傳輸每一位的時間,當前為約104us)
注意4:最后有一個停止位,停止位就是有一個高電平
(高電平時間就是傳輸每一位的時間,當前為約104us)
當然如果停止位是1.5位,停止時間對於現在來講就是104*1.5 = 156us
如果停止位是2位,停止時間對於現在來講就是104*2 = 208us
2.奇偶校驗位
奇校驗:
如果發送的一個字節數據中的數據位中的1(高電平)是偶數個,那么最后的奇偶校驗位需要是高電平
保證整個數據位里面的1(高電平)個數是奇數個.
如果發送的一個字節數據中的數據位中的1(高電平)是奇數個,那么最后的奇偶校驗位需要是低電平
保證整個數據位里面的1(高電平)個數是奇數個.
發送的0x55,有4個1,所以奇偶校驗位需要是高電平,讓1的個數為奇數個

偶校驗:
如果發送的一個字節數據中的數據位中的1(高電平)是奇數個,那么最后的奇偶校驗位需要是高電平
保證整個數據位里面的1(高電平)個數是偶數個
如果發送的一個字節數據中的數據位中的1(高電平)是偶數個,那么最后的奇偶校驗位需要是低電平
保證整個數據位里面的1(高電平)個數是偶數個
關於485通信芯片的使用
1.一般哈用MAX485,SP485EE MAX13487
如果是用在工業控制建議用戶使用6LB184等工業級的芯片
當然還有TVS,磁珠,自恢復保險絲,如果不計成本還需要加上DC-DC隔離(BC0505)還有ADUM1201.
BC0505是5V轉5V的電源隔離芯片,5元左右,用來給485芯片單獨供電
ADUM1201是不讓485的輸入輸出引腳直接接到單片機上,再次隔離一下.
當然,如果防雷擊,記得加上放電管
反正是大家自己去取舍.

2.現在說一下我要說的主題:485的自動收發電路
大家可能說,網上不是很多嗎?
答:網上的做的不夠嚴謹,都有問題!
先看一個

注意:單片機的TX默認是高電平,所以485_TX是高電平,三極管導通,RE/DE為低電平.
我現在說一下原理:
首先大家都知道RE/DE處於低電平,芯片處於接收數據狀態
RE/DE處於高電平,芯片處於發送數據狀態.
現在咱看上面的電路,假設咱發送:0x55
加上起始位 ,先發送高位后發低位 ,1位停止位
發送的電平為:(0 10101010 1)
發送0:
485_TX為0 ,三極管截止 ,RE/DE為高電平 ,處於發送狀態 ,DI連接的低電平
所以把0發送了出去.
然后發送1:
485_TX為1 ,三極管導通 ,RE/DE為低電平 ,處於接收狀態
由於外面的A上拉,B下拉,所以當前信號為1 ,所以可以看做把1發送了出去
然后發送0:(后面的就不說了,和上面一樣)
3.為了保證信號更加的好,很多工業上都用斯密特觸發器做.
一般都使用74HC14 或者 74LS14

如果要問我斯密特觸發器有啥作用,我就直接給你一張圖

如果是使用的74HC14芯片,因為是反向的,
所以上面的信號經過74HC14處理后的信號應該是相反的.
如果想得到正的,可以再經過一路反向器
4.和485配合使用,典型電路如下:
(畫的有點不好看,看箭頭方向吧.....)

注:發送數據有兩路信號,一路送給了485的DI,另一路送給了RE/DE
假設發送0(第一路信號):(0信號經過兩路反相器最終還是0,然后送給了485的DI引腳)

假設發送0(第二路信號):(0信號經過三路反相器最終是1,然后送給了485的DI引腳)
然后用485把0發送了出去.

不過中間經過了一個電路(電容 ,電阻,二極管):電路的作用是延遲一下控制方向的這個引腳
讓數據電平先到達,然后控制方向的后到達.
和大家分析一下吧:
默認 UAER1_TX是高電平,經過兩路反相器以后,74HC14的4引腳輸出高電平
此時給電容充電.
然后開始發送數據
發送0的時候74HC14的6和4引腳以相同的時間輸出低電平,
低電平信號已經給了485.
但是4引腳此時先給電容放電.等到74HC14認為1引腳是低電平以后
經過2輸出高電平,把芯片置為輸出狀態,把0發送出去
發送1的時候74HC14的6和4引腳以相同的時間輸出高電平,
高電平信號已經給了485.
但是4引腳此時先經過電阻給電容充電電.等到74HC14認為1引腳是高電平以后
經過2輸出低電平,把芯片置為輸入狀態,所以可以看做把1發送了出去.
