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