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