鍍金池/ 教程/ 數據庫/ 11.1 單片機串行通信介紹
8.3 C 語言函數的形參和實參
12.2 C 語言指針變量的聲明
12.5 ?C 語言字符數組和字符指針
7.3 單片機 LED 點陣的介紹
11.5 UART 串口通信的基本應用
9.9 單片機蜂鳴器控制程序和驅動電路
10. 單片機實例練習與經驗積累
10.3 單片機交通燈控制程序和設計原理
9.8 實用的 28BYJ-48 步進電機控制程序
8.2 C 語言函數的調用
12.4 C 語言指向數組元素的指針
7.1 C 語言變量的作用域
11.2 RS232 通信接口
12.7 1602 液晶的讀寫時序介紹
7.2 C 語言變量的存儲類別
8. C 語言函數進階與單片機按鍵
10.4 51單片機 RAM 區(qū)域的劃分
12.1 C 語言變量的地址
11. UART 串口通信
7. 變量進階與點陣 LED
8.4 單片機按鍵介紹
9.3 電機的分類
9.1 單片機 IO 口的結構
單片機通信實例與 ASCII 碼
8.1 單片機最小系統(tǒng)解析(電源、晶振和復位電路)
9.2 單片機上下拉電阻
11.4 單片機 IO 口模擬 UART 串口通信
9.5 讓 28BYJ-48 步進電機轉起來
9.7 28BYJ-48 步進電機控制程序基礎
12.8 1602 液晶指令介紹
12.3 C 語言指針的簡單示例
8.7 單片機矩陣按鍵的掃描
7.4 單片機 LED 點陣的圖形顯示
8.6 單片機按鍵消抖程序
10.2 單片機中 PWM 的原理與控制程序
7.6 單片機 LED 點陣的橫向移動(動態(tài)顯示)
11.3 USB 轉串口通信
12.9 1602 液晶簡單顯示程序
9.4 28BYJ-48 步進電機原理
8.5 ?單片機獨立按鍵掃描程序
12. C 語言指針基礎與1602液晶的初步認識
9. 單片機中的步進電機與蜂鳴器
10.1 單片機數字秒表程序
7.5 單片機 LED 點陣的縱向移動(動態(tài)顯示)
8.8 單片機簡易加法計算器程序
11.1 單片機串行通信介紹
10.5 單片機長短按鍵的應用
12.6 1602 液晶介紹(電路和引腳圖)
9.6 28BYJ-48 步進電機轉動精度與深入分析

11.1 單片機串行通信介紹

通信按照基本類型可以分為并行通信和串行通信。并行通信時數據的各個位同時傳送,可以實現字節(jié)為單位通信,但是通信線多占用資源多,成本高。比如我們前邊用到的 P0 = 0xFE;一次給 P0 的8個 IO 口分別賦值,同時進行信號輸出,類似于有8個車道同時可以過去8輛車一樣,這種形式就是并行的,我們習慣上還稱 P0、P1、P2 和 P3 為51單片機的4組并行總線。

而串行通信,就如同一條車道,一次只能一輛車過去,如果一個 0xFE 這樣一個字節(jié)的數據要傳輸過去的話,假如低位在前高位在后的話,那發(fā)送方式就是0-1-1-1-1-1-1-1-1,一位一位的發(fā)送出去的,要發(fā)送8次才能發(fā)送完一個字節(jié)。

STC89C52 有兩個引腳是專門用來做 UART 串行通信的,一個是 P3.0 一個是 P3.1,它們還分別有另外的名字叫做 RXD 和 TXD,由它們組成的通信接口就叫做串行接口,簡稱串口。用兩個單片機進行 UART 串口通信,基本的演示圖如圖11-1所示。

http://wiki.jikexueyuan.com/project/mcu-tutorial-two/images/34.png" alt="" />

圖11-1 單片機之間 UART 通信示意圖

圖中,GND 表示單片機系統(tǒng)電源的參考地,TXD 是串行發(fā)送引腳,RXD 是串行接收引腳。兩個單片機之間要通信,首先電源基準得一樣,所以我們要把兩個單片機的 GND 相互連接起來,然后單片機1的 TXD 引腳接到單片機2的 RXD 引腳上,即此路為單片機1發(fā)送而單片機2接收的通道,單片機1的 RXD 引腳接到單片機2的 TXD 引腳上,即此路為單片機2發(fā)送而單片機1接收的通道。這個示意圖就體現了兩個單片機相互收發(fā)信息的過程。

當單片機1想給單片機2發(fā)送數據時,比如發(fā)送一個 0xE4 這個數據,用二進制形式表示就是 0b11100100,在 UART 通信過程中,是低位先發(fā),高位后發(fā)的原則,那么就讓 TXD 首先拉低電平,持續(xù)一段時間,發(fā)送一位0,然后繼續(xù)拉低,再持續(xù)一段時間,又發(fā)送了一位0,然后拉高電平,持續(xù)一段時間,發(fā)了一位1??一直到把8位二進制數字 0b11100100 全部發(fā)送完畢。這里就涉及到了一個問題,就是持續(xù)的這“一段時間”到底是多久?由此便引入了通信中的一個重要概念——波特率,也叫做比特率。

波特率就是發(fā)送二進制數據位的速率,習慣上用 baud 表示,即我們發(fā)送一位二進制數據的持續(xù)時間=1/baud。在通信之前,單片機1和單片機2首先都要明確的約定好它們之間的通信波特率,必須保持一致,收發(fā)雙方才能正常實現通信,這一點大家一定要記清楚。

約定好速度后,我們還要考慮第二個問題,數據什么時候是起始,什么時候是結束呢?

不管是提前接收還是延遲接收,數據都會接收錯誤。在 UART 通信的時候,一個字節(jié)是8位,規(guī)定當沒有通信信號發(fā)生時,通信線路保持高電平,當要發(fā)送數據之前,先發(fā)一位0表示起始位,然后發(fā)送8位數據位,數據位是先低后高的順序,數據位發(fā)完后再發(fā)一位1表示停止位。這樣本來要發(fā)送一個字節(jié)的8位數據,而實際上我們一共發(fā)送了10位,多出來的兩位其中一位起始位,一位停止位。而接收方呢,原本一直保持的高電平,一旦檢測到了一位低電平,那就知道了要開始準備接收數據了,接收到8位數據位后,然后檢測到停止位,再準備下一個數據的接收。我們圖示看一下,如圖11-2所示。

http://wiki.jikexueyuan.com/project/mcu-tutorial-two/images/35.png" alt="" />

圖11-2 串口數據發(fā)送示意圖

圖11-2串口數據發(fā)送示意圖,實際上是一個時域示意圖,就是信號隨著時間變化的對應關系。比如在單片機的發(fā)送引腳上,左邊的是先發(fā)生的,右邊的是后發(fā)生的,數據位的切換時間就是波特率分之一秒,如果能夠理解時域的概念,后邊很多通信的時序圖就很容易理解了。