两个单片机的串口通信 两个单片机之间串口通信)
1. 基于proteus的51單片機開發實例19-兩個單片機的串口通信
1.1. 實驗目的
本實例我們來了解51單片機的串行通信RS-232的基本原理、使用方法、編程實現。
1.2. 設計思路
圖1 兩個單片機的串口通信
用兩個51單片機的實現串口通信,其中一個作為串口數據發送端,另一個作為串口數據接收端,為了能夠直觀地看到串口數據的收發,電路中分別在兩個單片機上都接了8個LED,用于指示發送的數據和接收的數據,這樣便于比較發送和接收的數據是否一致。
1.3. 基礎知識
通過本實例,理解、熟悉串行通信的基礎知識、常用術語、實驗電路、編程方法。
1.3.1. 串行通信的基本概念
單片機與外設之間的數據交互通常有兩種方式:并行通信和串行通信。
所謂并行通信,是指一組數據的各個位同時進行傳輸的通信方式,如下圖所示。
圖2 并行通信
所謂串行通信,是指一組數據按照一位一位的順序傳輸的通信方式,如下圖所示。
圖3 串行通信
并行通信速度快,但是數據線多,結構復雜,成本高,一般是用于近距離傳輸、數據位數不多的情況。
串行通信速度慢,但數據線少,接線簡單,適用于遠距離傳輸。
1.3.2. 串行通信的基礎術語
串行通信有兩種基本方式:異步串行通信和同步串行通信。我們在本例中使用的是RS-232串行通信,RS-232串行通信方式是異步串行通信。所以我們這里重點了解與異步串行通信的基本術語。
1.3.2.1. 異步通信
一種基于“位(bit)”數據的通信方式,不要求通信雙發(接收方、發送方)具有同步時鐘信號,但是需要收發雙方具有相同的數據幀結構和波特率,通信過程中的數據收發不需要是連續的。
在實際應用中,異步串行通信的數據是“一幀一幀”傳送的,即一幀數據傳送完成后,才會再傳送下一幀數據。每幀數據發送完后,可以停頓,在停頓期間,數據線保持高電平。
異步通信的數據格式如下圖所示。
圖4 異步串行通信數據格式
其中數據可以是5~8位數據,奇偶校驗位可以通過設置為有或沒有校驗位。
我們可以看到,在一幀數據中,必須具備的要素是:起始位、數據、結束位。其中起始位必須是低電平,結束位必須是高電平。
1.3.2.2. 波特率
在異步串行通信中,為了確保通信雙方能夠正確的發送(接收)到數據,必須做好約定,約定哪些內容呢?一是數據幀的格式,二是每一位數據的傳送時間,也就是波特率。
波特率是指單位時間內傳送的二進制數據的位數。波特率的單位是bit/s。它是串行通信的非常重要的指標及參數。
例如波特率是9600,則表示每秒鐘能夠發送9600位數據,如果一個字節按照8位計算,就是1200字節數據(但是異步串口通信有起始位、停止位、奇偶校驗位等,所以并不能發送1200字節)。
1.3.2.3. 奇偶校驗位
奇偶校驗位的目的是為了防止通信過程中受到干擾導致某一位或多位數據出錯。
一般情況下,異步串行通信中奇偶校驗位可通過設置相應的控制寄存器自動生成、自動校驗。
1.3.3. 51單片機串行口的內部結構
下圖所示是51單片機串行口的內部結構。
51單片機串行口內部結構
從圖中可以看出,51單片機的串行口主要有如下幾部分構成
數據緩沖器SBUF
數據緩沖器SBUF有兩個,一個負責接收數據,另一個負責發送數據。
輸入移位寄存器
在接收控制器的控制下,將數據“一位一位”的放入緩沖器SBUF。
串行控制寄存器
設置并控制串行通信的工作方式
定時器T1
用作串行通信的波特率發生器。也就是說,在使用串口通信時,51單片機的定時器T1不能再用作定時或計數功能,只能作為串口的波特率發生器。
串行通信的控制
51單片機中,進行串口通信時,需要通過對相關寄存器進行配置,才能讓串口正常工作。相關的寄存器有4個。分別是SCON,PCON,IE,IP。其中IE寄存器用來控制是否允許中斷觸發。IP用來設置中斷優先級,這兩個寄存器我們之前已經了解了,在此不再贅述。(本實例中不使用串口中斷)
串口控制寄存器SCON
串口控制寄存器SCON用于設置串行口的工作方式。同時還可以監視串行口工作狀態、發送與接收的狀態控制等。
SCON各個位的含義如下圖所示。
SCON
工作方式
電源控制寄存器PCON
該控制器中與串口有關的只有第7位SMOD位,這一位為波特率選擇位,如果SMOD=0,則波特率為設置的波特率,如果SMOD=1,則波特率為設置波特率的2倍。
1.4. 電路設計
圖1是本實例的電路圖。電路中使用了兩個單片機,一個發送串口數據,一個接收串口數據,每個單片機都連了8個LED,用于指示發送的數據和接收的數據,這樣能夠直觀地查看數據正確性。
1.5. 程序設計
本實例有兩個單片機,每個單片機都有各自代碼程序,程序代碼如下:
發送程序
#include //
//發送的數據
unsigned char code LedTab[16]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff,0x00};
//串口數據發送函數,采用查詢方式
void Send(unsigned char ucData)
{
SBUF=ucData;//先把要發送的數據放到發送緩沖器
while(TI==0);//等待發送完畢,
TI=0;//發送完后,置0,便于下次發送數據
}
//延時函數
void delay(void)
{
unsigned int m,n;
for(m=0;m<800;m++)
for(n=0;n<250;n++);
}
void main(void)
{
unsigned char i;
TMOD=0x20; //定時器工作方式2
SCON=0x40; //串口工作方式1
PCON=0x00; //波特率不加倍
TH1=0xfd; //定時器賦初值
TL1=0xfd; //
TR1=1; //打開定時器,開始工作
P1=0xff;//先讓所有LED滅
while(1)
{
for(i=0;i<16;i++) //循環發送16個數據
{
P1=LedTab[i];//發送前,先讓LED指示要發送的數據
Send(LedTab[i]); //通過串口,查詢方式發送數據
delay(); // 發送完延時一會,便于觀察LED指示是否正確
}
}
}
接收程序
#include
//串口接收函數,采用查詢方式
unsigned char Receive(void)
{
unsigned char ucData;
while(RI==0) ; //等待接收中斷標志置位,置位后說明有數據過來
RI=0; //手動清除標志
ucData=SBUF; //從接收緩沖器取數據
return ucData;
}
void main(void)
{
TMOD=0x20; //定時器工作方式2
SCON=0x50; //串口工作方式1,允許接收
PCON=0x00; //波特率不加倍
TH1=0xfd; //波特率9600時的定時器初值設置
TL1=0xfd; //
TR1=1; //啟動定時器
REN=1; //允許串口數據接收
P1=0xff;
while(1)
{
P1=Receive(); //將串口接收的數據通過P1口的8個LED顯示
}
}
1.6. 實例仿真
程序編譯完成后,即可裝載到仿真電路中,其中send.hex裝到發送數據單片機中,receive.hex裝入接收數據單片機中。開始仿真,注意觀察發送單片機所連的8個LED發光情況,比較同一時間接收單片機所連的8個LED發光情況,這兩個應該一致。
視頻加載中...
1.7. 總結
通過本實例,我們學習了單片機串口數據的發送和接收。關于串口通信,在實際單片機應用系統中有著大量應用,是我們需要掌握的一個非常重要的功能。
總結
以上是生活随笔為你收集整理的两个单片机的串口通信 两个单片机之间串口通信)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Adobe Acrobat XI反色保护
- 下一篇: Healing Psoriasis Th