51單片機雙機通訊 UART異步通訊 帶詳細註釋版

一、總體設計
1.設計要求:
兩片單片機之間進行串行通信,發送端將0~f循環發送到接收端,並在接收端顯示。
2.設計方案:
本次設計,對於兩片89C51,採用RS232進行雙機通信。發送方的數據由串行口TXD段輸出,經過電平轉換芯片MAX232將TTL電平轉換爲RS232電平輸出,經過傳輸線將信號傳送到接收端。接收方也使用MAX232芯片進行電平轉換後,信號到達接收方串行口的接收端。接受方接收後,在數碼管上顯示接收的信息。爲提高抗干擾能力,還可以在輸入輸出端加光耦合進行光電隔離。
軟件部分,通過通信協議進行發送接收,主機先送AAH給從機,當從機接收到AAH後,向主機回答BBH。主機收到BBH後就把數碼錶TAB[16]中的10個數據送給從機,併發送檢驗和。從機收到16個數據並計算接收到數據的檢驗和,與主機發送來的檢驗和進行比較,若檢驗和相同則發送00H給主機;否則發送FFH給主機,重新接受。從機收到16個正確數據後送到一個數碼管顯示。
二、硬件設計
1.51單片機串行通信功能
在這裏插入圖片描述
計算機與外界的信息交換稱爲通信,常用的通信方式有兩種:並行通信和串行通信。51單片機用4個接口與外界進行數據輸入與數據輸出就是並行通信,並行通信的特點是傳輸信號的速度快,但所用的信號線較多,成本高,傳輸的距離較近。串行通信的特點是隻用兩條信號線(一條信號線,再加一條地線作爲信號迴路)即可完成通信,成本低,傳輸的距離較遠。
51單片機的串行接口是一個全雙工的接口,它可以作爲UART(通用異步接受和發送器)用,也可以作爲同步移位寄存器用。51單片機串行接口的結構如下:
(1)數據緩衝器(SBUF)
接受或發送的數據都要先送到SBUF緩存。有兩個,一個緩存,另一個接受,用同一直接地址99H,發送時用指令將數據送到SBUF即可啓動發送;接收時用指令將SBUF中接收到的數據取出。
(2)串行控制寄存器(PCON)
在這裏插入圖片描述
SCON用於串行通信方式的選擇,收發控制及狀態指示,各位含義如下:

SM0,SM1:串行接口工作方式選擇位,這兩位組合成00,01,10,11對應於工作方式0、1、2、3。串行接口工作方式特點見下表
在這裏插入圖片描述
SM2:多機通信控制位。
REN:接收允許控制位。軟件置1允許接收;軟件置0禁止接收。
TB8:方式2或3時,TB8爲要發送的第9位數據,根據需要由軟件置1或清0。
RB9:在方式2或3時,RB8位接收到的第9位數據,實際爲主機發送的第9位數據TB8,使從機根據這一位來判斷主機發送的時呼叫地址還是要傳送的數據。
TI:發送中斷標誌。發送完一幀數據後由硬件自動置位,並申請中斷。必須要軟件清零後才能繼續發送。
RI:接收中斷標誌。接收完一幀數據後由硬件自動置位,並申請中斷。必須要軟件清零後才能繼續接收。
(3)輸入移位寄存器
接收的數據先串行進入輸入移位寄存器,8位數據全移入後,再並行送入接收SBUF中。
(4)波特率發生器
波特率發生器用來控制串行通信的數據傳輸速率的,51系列單片機用定時器T1作爲波特率發生器,T1設置在定時方式。波特率時用來表示串行通信數據傳輸快慢程度的物理量,定義爲每秒鐘傳送的數據位數。
(5)電源控制寄存器PCON
其最高位爲SMOD。
(6)波特率計算
當定時器T1工作在定時方式的時候,定時器T1溢出率=(T1計數率)/(產生溢出所需機器週期)。由於是定時方式,T1計數率= fORC/12。產生溢出所需機器週期數=模M-計數初值X。

2.MAX232芯片
用8051串行接口通信,如果兩臺8051單片機之間的距離很近(不超過1.5m),可以採用直接將兩臺8051單片機的串行接口直接相連,利用其自身的TTL電平(0-5V)直接傳輸數據信息。如果傳輸距離較遠(超過1.5m),由於傳輸線的阻抗與分佈電容,會產生電平損耗和波形畸變,以至於檢測不出數據或數據出錯。此時可利用 RS232標準總線接口,將單片機輸出的TTL電平轉換爲RS232標準電平(邏輯1爲-15—-5V;邏輯0爲+5-—+15V)。用RS232可將傳輸距離提高到15m,如果想遠距離傳輸,可以採用RS422或者RS485。
電平轉換芯片MAX232是美信公司(MAXIM)生產,專用於進行將TTL電平轉換爲RS232電平的芯片,MAX232內部有泵電源,能將+5V電源電壓在芯片內提高到RS232電平所需的+10V或者-10V電平。
在這裏插入圖片描述
圖2.電平轉換芯片MAX232
3.整體電路設計
最終設計電路如下圖3所示,發送方的數據由串行口TXD段輸出,經過電平轉換芯片MAX232將TTL電平轉換爲RS232電平輸出,經過傳輸線將信號傳送到接收端。接收方也使用MAX232芯片進行電平轉換後,信號到達接收方串行口的接收端。接受方接收後,通過P1口在數碼管上顯示接收的信息。
在這裏插入圖片描述
圖3.串行通信電路
三、軟件設計
通過通信協議進行發送接收,主機先送AAH給從機,當從機接收到AAH後,向主機回答BBH。主機收到BBH後就把數碼錶TAB[16]中的10個數據送給從機,併發送檢驗和。從機收到16個數據並計算接收到數據的檢驗和,與主機發送來的檢驗和進行比較,若檢驗和相同則發送00H給主機;否則發送FFH給主機,重新接受。從機收到16個正確數據後送到一個數碼管顯示。
1.串行通信軟件實現
(1)串行口工作於方式1;用定時器1產生9600bit/s的波特率,工作於方式2。
(2)功能:將本機ROM中數碼錶TAB[16]中的16個數發送到從機,並保存在從機內部ROM中,從機收到這16個數據後送到一個數碼管循環顯示。
(3)通信協議:主機首先發送連絡信號(AAH),從機接收到之後返回一個連絡信號(BBH)表示從機已準備好接收。
(4)通信過程使用第九位發送奇偶校驗位。
(5)從機接收到一個數據後,立即進行奇偶校驗,若數據沒有錯誤,則返回00H,否則返回FFH。
(6)主機發送一個數據後,等待從機返回數據;若爲00H,則繼續發送下一個數據,若爲FFH,則重新發送數據。

2.程序流程圖
(1)發送端程序流程圖
在這裏插入圖片描述
(2)接收方程序流程圖

在這裏插入圖片描述
四、聯合調試
在protues上進行仿真實驗。首先使用KeilC將編寫完成的程序編譯生成HEX文件,將HEX文件燒錄到兩片單片機中,進行仿真實驗,結果如下圖所示,可以看到,接收端已將接受到的數據完整的顯示了出來。
在這裏插入圖片描述
圖4.仿真圖

五、設計小結
經過繁忙而又緊張的課程設計,終於順利的完成了設計任務。雖然在這段時間裏每天都那麼繁忙,但是在這忙碌的過程中卻得到了許多的收穫。
經過課程設計,在查閱資料的過程中,學習了基於單片機的C語言程序設計,瞭解了單片機串行通信的基本知識,對於以後的學習和工作都有很大的益處。
在學習的過程中,也遇到了一些困難,比如開始的時候,由於發送端和接收端的通信協議沒有做好,導致數據不能正確的傳輸,在解決問題的過程中,對於通信協議的實現有了深刻的認識。
通過這次課程設計,鍛鍊了自己獨立思考的能力。
1.主機發送程序
#include <reg51.h> // 51單片機預處理程序
#define uchar unsigned char // 宏定義無符號字符型變量
void init(); // 定義初始化函數
void send(); // 定義發送函數
ucharTAB[16] ={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; // 定義數組函數 0~F顯示段位值
uchar i,sum; // 定義無符字符變量 I,sum 其中i表示數據個數,sum表示校驗和
int j; // 定義整形變量 j 等待數據發送時的延時
main() // 主函數開始執行
{ init(); // 初始化
send(); // 準備發送數據
}
void init(void) 調用初始化函數(無返回值)
{ EA=1; // 打開全局中斷允許
ES=1; // 打開串口中斷允許
TMOD=0x20; // 定義工作方式寄存器的方式和功能
TH1=0xfd; // 配置定時器初值
TL1=0xfd; // 配置定時器初值
PCON=0x00; // 配置電源管理寄存器 主要SMOD位=0
SCON=0x50; // 設定串行口的工作方式,REN允許串行接收
TR1=1; // 定時器1啓動控制位
}

void send(void) // 調用發送函數(數據準備發送)
{do
{ SBUF=0xaa; // 把0xaa裝入SBUF緩存
while(!TI); // 發送中斷標誌位(如果!TI=0即TI=1時,,跳出循環)
TI=0; // 因爲TI爲硬件置1,所以要軟件清0
while(!RI); // 接收中斷標誌位(如果!RI=0即RI=1時,,跳出循環)
RI=0; // 因爲RI爲硬件置1,所以要軟件清0
}
while((SBUF^0xbb)!=0); // sbuf 的值不等0,爲0xBB就會執行下一條語句
// DO while 循環
do
{ sum=0; // 首先把0賦值給sum即清0 ,sum爲校驗和
for(i=0;i<=15;i++) // i爲數組中數據的位個數,等待有16個數據後
{ SBUF=TAB[i]; // 把數裝入緩存器發送一個數據
sum+=TAB[i]; // 即 sum=sum+ TAB[i](求校驗和,爲兩個十六進制數的和)
while(!TI); // 在TI=1的時候,跳出循環
TI=0; // TI要軟件清零
}
SBUF=sum; // 發送校驗和
while(!RI); //在RI=1的時候,跳出循環
RI=0; // RI要軟件清零
}
while(SBUF!=0); // 在SBUF爲0時跳出循環
}

從機發送程序和主機差不多,你可以自己想一下看看能不能寫出來。

附主從機的完整C程序和PROTEUS 仿真文件下載地址 400例仿真+C程序

https://pan.baidu.com/s/1utgFJmAnpg4841lxfYOAFA

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