怎樣實現MCU之間的UART串口通信
通信按照基本類型可以分為并行通信和串行通信。并行通信時數據的各個位同時傳送,可以實現字節為單位通信,但是通信線多占用資源多,成本高。比如我們前邊用到的 P0 = 0xFE;一次給P0的8個IO口分別賦值,同時進行信號輸出,類似于有 8 個車道同時可以過去 8 輛車一樣,這種形式就是并行的,我們習慣上還稱P0、P1、P2和P3為51單片機的4組并行總線。
而串行通信,就如同一條車道,一次只能一輛車過去,如果一個 0xFE 這樣一個字節的數據要傳輸過去的話,假如低位在前高位在后的話,那發送方式就是 0-1-1-1-1-1-1-1-1,一位一位的發送出去的,要發送 8 次才能發送完一個字節。
STC89C52有兩個引腳是專門用來做UART串行通信的,一個是 P3.0 一個是 P3.1,它們還分別有另外的名字叫做 RXD 和 TXD,由它們組成的通信接口就叫做串行接口,簡稱串口。用兩個單片機進行 UART 串口通信,基本的演示圖如圖 11-1 所示。
圖中,GND 表示單片機系統電源的參考地,TXD 是串行發送引腳,RXD 是串行接收引腳。兩個單片機之間要通信,首先電源基準得一樣,所以我們要把兩個單片機的 GND 相互連接起來,然后單片機 1 的 TXD 引腳接到單片機 2 的 RXD 引腳上,即此路為單片機 1 發送而單片機 2 接收的通道,單片機 1 的 RXD 引腳接到單片機 2 的 TXD 引腳上,即此路為單片機 2 發送而單片機 1 接收的通道。這個示意圖就體現了兩個單片機相互收發信息的過程。
當單片機 1 想給單片機 2 發送數據時,比如發送一個 0xE4 這個數據,用二進制形式表示就是 0b11100100,在 UART 通信過程中,是低位先發,高位后發的原則,那么就讓 TXD首先拉低電平,持續一段時間,發送一位 0,然后繼續拉低,再持續一段時間,又發送了一位 0,然后拉高電平,持續一段時間,發了一位 1??一直到把 8 位二進制數字 0b11100100全部發送完畢。這里就涉及到了一個問題,就是持續的這“一段時間”到底是多久?由此便引入了通信中的一個重要概念——波特率,也叫做比特率。
波特率就是發送二進制數據位的速率,習慣上用 baud 表示,即我們發送一位二進制數據的持續時間=1/baud。在通信之前,單片機 1 和單片機 2 首先都要明確的約定好它們之間的通信波特率,必須保持一致,收發雙方才能正常實現通信,這一點大家一定要記清楚。
約定好速度后,我們還要考慮第二個問題,數據什么時候是起始,什么時候是結束呢?
不管是提前接收還是延遲接收,數據都會接收錯誤。在 UART 通信的時候,一個字節是 8 位,規定當沒有通信信號發生時,通信線路保持高電平,當要發送數據之前,先發一位 0 表示起始位,然后發送 8 位數據位,數據位是先低后高的順序,數據位發完后再發一位 1 表示停止位。這樣本來要發送一個字節的 8 位數據,而實際上我們一共發送了 10 位,多出來的兩位其中一位起始位,一位停止位。而接收方呢,原本一直保持的高電平,一旦檢測到了一位低電平,那就知道了要開始準備接收數據了,接收到 8 位數據位后,然后檢測到停止位,再準備下一個數據的接收。我們圖示看一下,如圖 11-2 所示。
圖 11-2 串口數據發送示意圖
圖 11-2 串口數據發送示意圖,實際上是一個時域示意圖,就是信號隨著時間變化的對應關系。比如在單片機的發送引腳上,左邊的是先發生的,右邊的是后發生的,數據位的切換時間就是波特率分之一秒,如果能夠理解時域的概念,后邊很多通信的時序圖就很容易理解了。
我司是士蘭微代理商,可以提供方案開發與選型推薦。
- 上一篇:最強悍的移動電源解決方案被曝光了 2019/12/20
- 下一篇:MCU將會進入怎樣的新時代? 2019/12/17