在《51單片機(三十一)—— 串口通信介紹》中,我們介紹了51單片機串口的工作原理及寄存器定義,在本文中,我們通過一個實例來熟悉51單片機的串口使用方法。本文的資源中有實例的源碼。在源碼中首先是串口的初始化代碼,如下所示。
void init_UART(void)
{
SCON = 0x50; //串口工作方式1,8位數據位,使能接收
TMOD |= 0x20; //T1爲方式2,8位自動重裝
TH1 = 0xFD; //晶振11.0592MHz,0xFD對應波特率爲9600
TR1 = 1; //打開T1定時
EA = 1; //打開總中斷
ES = 1; //打開串口中斷
}
需要注意的是,在進行本文的實驗時,需要將單片機的晶振換成11.0592MHz的晶振,這與串口的波特率直接相關。串口的初始化代碼將串口的波特率設置爲9600bit/s。
代碼中串口採用方式1。方式1的波特率採用下式計算,其中T1表示定時器T1的溢出頻率
其中SMOD=0,定時器T1採用方式2,爲8位自動重裝的方式。裝載值爲0xFD,即爲253。則T1溢出率爲11.0592MHz/12/3=307.2KHz,則串口的波特率爲307.2KHz/32=9600。
串口的發送函數如下所示
void send_Byte(unsigned char shuju)
{
SBUF = shuju; //賦值需要發送的數據
}
函數的形參爲需要發送的數據,函數中直接將需要發送的數據賦值給數據寄存器。
串口的接收函數如下所示
unsigned char receive_Byte(void)
{
unsigned char temp;
temp=SBUF; //讀取接收到的數據
return temp;
}
接收函數直接將數據寄存器中的數據返回。
這個實驗中還將串口的接收設置爲中斷接收方式,中斷處理函數如下所示。
void UART_ISR(void) interrupt 4
{
if(RI==1) //接收到數據
{
receivedata=receive_Byte();
if(receivedata=='O')
{
LED=0;
send_Byte('Y');
}
if(receivedata=='C')
{
LED=1;
send_Byte('V');
}
RI=0; //清除標誌位
}
if(TI) //如果是發送標誌位,清除
TI=0;
}
在中斷函數中,判斷接收中斷標誌,如果標誌位置1,說明接收到數據,則讀取數據,並判斷數據是否爲O或C,如果爲O,點亮指示燈,並返回Y,如果爲C,熄滅指示燈,並返回V。如果是發送中斷標誌,則將標誌位清零,不處理。
接下來我們來驗證這個實例的代碼,將程序燒寫到單片機中,並接通電源。在上位機上需要用到串口助手sscom.exe,如下圖所示,進行設置。其中COM5爲串口號,需要根據實際計算機使用的串口號進行設置。
在字符串輸入框中輸入大寫字母“O”,點擊“發送”按鈕,窗口返回“Y”,並且開發板上的LED1燈點亮。在字符串輸入框中輸入大寫字母“C”,點擊“發送”按鈕,窗口返回“V”,並且開發板上的LED1燈熄滅。