<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 51單片機之寄存器-3.3單片機串口通信之發(fā)送與接收

51單片機之寄存器-3.3單片機串口通信之發(fā)送與接收

作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò ) 收藏
本節主要講解單片機的通信。通信主要是指單片機與外界設備交流,也就是通過(guò)導線(xiàn)傳送或者接收信息。舉個(gè)例子來(lái)說(shuō)明,你想把倉庫A中的貨物通過(guò)貨車(chē)配送到倉庫B,一共有8個(gè)箱子,每輛貨車(chē)一次只能運送1個(gè)箱子。顯然,如果只用一輛貨車(chē),那么需要8次運送完畢,如果使用8輛貨車(chē),那么一次就運送完了。同樣,在單片機通信中也是如此。這個(gè)貨車(chē)就是信息傳輸通道。貨車(chē)數量越多,傳輸越快。如果只有一輛貨車(chē)那么就是串行通信,如果是八輛貨車(chē)就是并行通信。很明顯,貨車(chē)數量越多,運送的速度越快,但是成本越高。因此根據CPU與外設之間連線(xiàn)結構和數據傳送方式的不同,可將通信分為并行通信和串行通信兩種基本方式。很容易可以看出并行通信的特點(diǎn)是數據同時(shí)傳送,速度快,效率高,但成本也高。串行通信的特點(diǎn)是傳輸線(xiàn)少,成本低,但傳送速度慢?,F在很多電腦沒(méi)有并口接口了,這里我們只講串行通行。
圖1 串行通信示意圖?

由于現在很多筆記本已經(jīng)沒(méi)有串口,我們通常采用USB轉串口。先來(lái)看圖1中的一個(gè)例子,現在想讓P1把在A(yíng)地點(diǎn)的D3,D5,D8,D9,D11組球通過(guò)P2的幫忙一個(gè)一個(gè)傳遞到B點(diǎn),要求按順序傳遞,而且傳遞完成后不能打亂順序。如果不做任何處理,只要P1在某一組中如D3組,有一個(gè)球傳錯或者漏傳,那么將導致后面的傳遞全部錯位。改進(jìn)的方法就是在傳每組第一個(gè)球時(shí),先傳個(gè)紅色的標簽,告訴P2接下來(lái)要傳的是這一組的第一個(gè)球。當這一組傳遞完成后,再給一個(gè)綠色的標簽,告訴P2,這一組的球傳遞完畢。這樣即使某一組傳錯了,也不會(huì )影響下一組的傳遞?,F在我們詳細看看這個(gè)過(guò)程。(1) P1需要選擇傳哪一組的球。(2) 準備好標記 (3) 通知P2現在要開(kāi)始工作. 同時(shí)在傳遞過(guò)程要保證P1和P2的速度一致,否則傳遞也會(huì )出問(wèn)題。知道了這個(gè)例子,現在我們詳細的來(lái)討論一下串口異步通信。

本文引用地址:http://dyxdggzs.com/article/201611/319548.htm
圖2 單片機串行通信示意圖?

如圖所示,兩個(gè)單片機的串行通信,傳送一根線(xiàn)TXD,接收一根線(xiàn)RXD,現在我們只討論傳送這部分。設定單片機1為我們開(kāi)發(fā)板上的型號STC89C52RC. 既然是傳送,那么傳送什么內容?,F在假設我要傳送0111000B(38H)這個(gè)數據。那么怎么讓單片機知道我要傳這個(gè)數據呢?如上圖所示,只需要使用圖中SBUF=dataTXD(即SBUF=0x38)這個(gè)語(yǔ)句。當單片機看到這條指令后,把0x38寫(xiě)入SBUF,就啟動(dòng)串行通信的發(fā)送。也就是說(shuō),這條語(yǔ)句告訴了單片機兩個(gè)信息,1.發(fā)送什么內容,2.現在就開(kāi)始發(fā)送。單片機就開(kāi)始以0和1的方式開(kāi)始發(fā)送了。那么這樣又出現問(wèn)題了,單片機2怎么知道單片機1要給我傳數據了?最簡(jiǎn)單的方法的就是給需要傳送的數據前后加個(gè)標簽,這樣兩個(gè)標簽之間的內容就是單片機1要傳送的信息了。當然也可以在8位數據后添加其他標簽,這個(gè)就是串口的傳送方式了。這個(gè)由SCON串行控制器來(lái)設置:

這里我們選擇工作方式1,SM0/SM1設置為0/1。8位數據位加起始位和停止位,一共10位,也稱(chēng)為一幀。那么這個(gè)起始位和停止位什么加入呢?當單片機TXD發(fā)送信息時(shí),單片機就自動(dòng)加入了。因此,這里我們總結一下,SBUF=dataTXD當執行到這條指令時(shí),告訴了單片機三個(gè)重要信息,1. 要傳送什么信息,2. 什么時(shí)候開(kāi)始傳, 3. 自動(dòng)在這個(gè)數據前添加開(kāi)始位和停止位。但是又有個(gè)問(wèn)題,傳多快呢?這里需要引入一個(gè)概念,波特率。波特率定義為每秒傳輸的碼元個(gè)數,單位是波特(Baud),簡(jiǎn)寫(xiě)為B。而每秒鐘傳送的二進(jìn)制數碼的位數則定義為比特率,單位是比特每秒,b/s或bps。在串行通信系統中,傳送的信號可能是二進(jìn)制,八進(jìn)制,十進(jìn)制等,只有在二進(jìn)制通信系統中波特率和比特率在數值上才是相等。本教程所描述的串行通信傳輸信號都是采用二進(jìn)制信號傳送的,故比特率和波特率相等。例如,通信雙方每秒所傳送的信息量是480字節,每一字節包含10位(1個(gè)起始位,8個(gè)數據位,1個(gè)停止位),則波特率為:

480×10=4800b/s=4800B

這里需要注意相互通信的甲乙雙方必須具有相同的波特率,否則無(wú)法成功完成串行數據通信。如上圖所示,給出了串行通信工作方式1的波特率。

現在來(lái)總結一下,串口通信的發(fā)送步驟

(1)選擇工作方式

(2)設置速度

(3)發(fā)送什么信息,打上標記,開(kāi)始傳送

以上3個(gè)步驟中,第三步中三個(gè)任務(wù)通過(guò)SBUF=0x38(假設我要傳這個(gè)數據)這句代碼就全部完成了。因此在此之前我們要先設置好工作方式和傳送速度(波特率).

這些步驟不需要記憶,只需要打開(kāi)串口助手就一目了然了,

參考代碼如下:

#include "reg52.h"

void delayUs(unsigned char t);

void delayMs(unsigned char t);

void main(void)

{

SM0=0;

SM1=1;//串口工作模式

TMOD=0X20;

TH1=TL1=253; //波特率9600

TR1=1;

while(1)

{

SBUF=0x38;

delayMs(250);

delayMs(250);

}

}

void delayUs(unsigned char t)

{

while(--t);

}

void delayMs(unsigned char t)

{

while(--t)

{

delayUs(245);

delayUs(245);

}

}

既然知道如何操作串口通信如何發(fā)送,我們按照同樣的思路看看如何操作串口接收。首先接收到的信息在哪里?將SBUF=dataTXD替換為dataRXD=SBUF. 前者表示把數據寫(xiě)進(jìn)SBUF,發(fā)送;后者表示把SBUF中的數據讀出了,接收。注意接收緩沖器SBUF和發(fā)送緩沖器SBUF名字一樣,地址也一樣,但是是兩個(gè)獨立的物理空間。工作方式的選擇與速度設置與前面一樣。那么,怎么讓單片機知道開(kāi)始接收呢?需要滿(mǎn)足兩個(gè)條件,TI=0和REN=1. REN表示串口接收允許。另外,當接收完成一幀數據(8位)后,控制信號復位,中斷標志RI被置"1",呈中斷申請狀態(tài)。在工作方式1下,同時(shí)滿(mǎn)足SM2=0,RI=0接收數據有效。我們可以整理一下串口接收的過(guò)程如下,

(1)選擇工作方式(工作方式1)

(2)設置速度

(3)開(kāi)始接收(TI=0,REN=1)

(4)接收的信息在哪里。(dataRXD=SBUF)

(5)接收的數據有效(SM2=0,RI=0)

串行通信接收的參考代碼如下:

#include "reg52.h"

#define uchar unsigned char

void delayUs(unsigned char t);

void delayMs(unsigned char t);

void main(void)

{

uchar MyRevData;

SM0=0;

SM1=1;//串口工作模式1

REN=1;

TMOD=0X20;

TH1=TL1=253; //波特率9600

TR1=1;

while(1)

{

MyRevData=SBUF;

delayMs(250);

P1=MyRevData;

delayMs(250);

RI=0; //當接收完成一幀數據(8位)后,控制信號復位,中斷標志RI被置"1",呈中斷申請狀態(tài)。在工作方式1下,SM2=0,RI=0數據有效

}

}

void delayUs(unsigned char t)

{

while(--t);

}

void delayMs(unsigned char t)

{

while(--t)

{

delayUs(245);

delayUs(245);

}

}

將代碼編譯燒寫(xiě)后進(jìn)行測試,打開(kāi)STC-ISP燒寫(xiě)軟件,選中串口助手,設置COM端口,波特率等參數,打開(kāi)串口,然后輸入要傳送的內容,如下圖所示。

在發(fā)送區內輸入FF后點(diǎn)擊"發(fā)送字符/數據",LED全部熄滅,輸入00,點(diǎn)擊發(fā)送,LED全部點(diǎn)亮



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>