串行口通信是單片機與各個模塊之間的數(shù)據(jù)傳遞的重要橋梁带斑,不得不說要想能夠?qū)崿F(xiàn)模塊間的數(shù)據(jù)傳輸,這是一個非常必要的基礎(chǔ)性的東西勋拟。所以今天我們來說一下單片機的串口通信勋磕。 大神別噴
串行口通信分為并行通信方式和串行通信方式,其中串行通信又分異步串行通信和同步串行通信敢靡。這次主要講解一下串行通信方式挂滓,其他方式和一些概念可以去了解一下,我們直接進入正題說話啸胧。<
</br>
先講一個波特率赶站,單片機與計算機在串口通信時的速率用波特率表示幔虏,它定義為每秒傳輸二進制代碼的位數(shù),關(guān)于單片機四種波特率計算方式在這里就不好列出了贝椿,可以去網(wǎng)上搜一下想括。
下面是電源管理寄存器PCON的位解析:
各位的定義: SMOD:該位與 串口通信有關(guān)。
SMOD=0; 串口方式1烙博,2瑟蜈,3時, 波特率正常渣窜。
SMOD=1; 串口方式1铺根,2,3時乔宿, 波特率加倍位迂。
GF1,GF0:兩個通用工作標志位,用戶可以自由使用详瑞。
PD:掉電模式設(shè)定位掂林。
PD=0 單片機處于正常工作狀態(tài)。
PD=1 單片機進入掉電(Power Down)模式 坝橡,可由 外部中斷或硬件復(fù)位模式喚醒党饮,進入掉電模式后,外部晶振停振驳庭,CPU刑顺、定時器、 串行口全部停止工作饲常,只有外部中斷工作蹲堂。
IDL:空閑模式設(shè)定位。
IDL=0 單片機處于正常工作狀態(tài)贝淤。
IDL=1 單片機進入空閑(Idle)模式柒竞,除CPU不工作外,其余仍繼續(xù)工作播聪,在空閑模式下可由任一個中斷或硬件復(fù)位喚醒朽基。
</br>
再介紹一個串行口控制寄存器SCON
SM0、SM1:串行口工作方式選擇位
SM2:多機通信控制位
REN:允許/禁止串行口接收的控制位
TB8:在方式2和方式3中离陶,是被發(fā)送的第9位數(shù)據(jù)稼虎,可根據(jù)需要由軟件置1或清零,也可以作為奇偶校驗位招刨,在方式1中是停止位霎俩。
RB8:在方式2和方式3中,是被接收的第9位數(shù)據(jù)(來自第TB8位);在方式1中打却,RB8收到的是停止位杉适,在方式0中不用。
TI——串行口發(fā)送中斷請求標志位: 當(dāng)發(fā)送完一幀串行數(shù)據(jù)后柳击,由硬件置1猿推;在轉(zhuǎn)向中斷服務(wù)程序后,用軟件清0捌肴。
RI——串行口接收中斷請求標志位: 當(dāng)接收完一幀串行數(shù)據(jù)后蹬叭,由硬件置1;在轉(zhuǎn)向中斷服務(wù)程序后哭靖,用軟件清0。
51單片機的簡介——串行口侈离、SCON
串行口方式1
通過代碼來說明原理
`
#include<reg52.h>
sbit led=P1^0;
unsigned char flag,a,i;
unsigned char table[]="I get a test";
void main()
{
led=1;
TMOD=0x20;//設(shè)置定時器1為工作方式2 定時器用來設(shè)置波特率
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1; //允許串行口接收位
SM0=0; //串行口的工作方式為方式1
SM1=1;
EA=1; //全局中斷允許
ES=1; //串口中斷允許
while(1)
{
if(flag==1)
{
ES=0;
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
SBUF=a; //只接受字符或字符串形式
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
led=~led;
}
當(dāng)程序運行時试幽,我們用定時器來設(shè)定波特率,打開串行口寄存器的相應(yīng)位控制卦碾,我們用串行口助手來測試铺坞,把程序下載到單片機上,打開串行口助手洲胖,通過助手發(fā)送一個字符济榨,注意是字符,因為我們在定義a為字符型绿映,當(dāng)發(fā)送完一個字符后擒滑,單片機的SBUF接收寄存器就會收到這個字符,此時硬件會把RI置1叉弦,會觸發(fā)中斷丐一,進入中斷函數(shù),我們要用軟件將RI置0 淹冰,a=SBUF為單片機自動將接收寄存器中的數(shù)取走給a库车,此時a 便會受到數(shù)據(jù),結(jié)束中斷樱拴,便會在while中繼續(xù)執(zhí)行柠衍,當(dāng)執(zhí)行完if判斷后,我們要把全局中斷關(guān)閉晶乔,即ES=0珍坊,因為我們要把數(shù)據(jù)發(fā)送出去,防止其不斷進入中斷正罢,使其陷入死循環(huán)之中垫蛆,通過for語句把字符數(shù)組的字符發(fā)給發(fā)送寄存器SBUF,當(dāng)我們每發(fā)送一個字符時,硬件都會把TI置1袱饭,又因為我們關(guān)閉了全局中斷川无,此時不回進入中斷,我們只需把TI置0 即可完成發(fā)送虑乖,我們便會在串口助手收到字符數(shù)據(jù)的數(shù)據(jù)和自己輸入的數(shù)據(jù)懦趋,此外,特別聲明SBUF是兩個不同的寄存器疹味,雖然都是用同一地址仅叫,但一個是接收寄存器,一個是發(fā)送寄存器糙捺。
</br>
新手上路诫咱,很多不足,歡迎指正洪灯。