51微控制器學習——串列埠通訊
51微控制器的UART串列埠的結構由序列口控制暫存器SCON、傳送和接收電路三部分構成。
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
符號 | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
復位值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
其中,SM0和SM1共同決定串列埠通訊的模式,共4種通訊模式;SM2是多機通訊控制位;REN使能序列接收;TB8和RB8是模式2中要傳送和接收的第9位資料;TI是傳送中斷標誌位,當傳送電路傳送到停止位的中間位置時,TI由硬體置一,必須通過軟體清零;RI是接收中斷標誌位,當接收電路傳送到停止位的中間位置時,RI由硬體置一,必須通過軟體清零。
對於硬體串列埠模組中,有一個專門的波特率發生器用來控制傳送和接收的速率,對於STC89C52而言,只能由定時器T1或T2來設定。由於使用定時器T2需要額外的配置暫存器,故使用定時器T1.
通訊方式使用方式1,即SM0 = 0, SM = 1。方式1下的波特率必須使用定時器T1的自動過載模式,過載值計算公式為:
TH1 = TL1 = 晶振值/12/2/16/波特率
和波特率有關的還有一個電源管理暫存器PCON,它的最高位可以把波特率提高一倍,也就是如果寫PCON |= 0x80,計算公式為:
TH1 = TL1 = 晶振值/12/16/波特率
其中,256是8位定時器的溢位值,即TL1的溢位值;12是指一個機器週期等於12個時鐘週期;16,串列埠把一位訊號採集16次,其中把7、8、9次取出,如果兩次高就是1,兩次低就是0;
串列埠通訊的傳送和接收在物理上是名字名字相同的SBUF暫存器,地址也是一樣,但是一個用來發送緩衝,一個用來接收緩衝。
編寫串列埠通訊的一般步驟:
- 配置串列埠為模式1;
- 配置定時器T1為模式2;
- 設定波特率;
- 開啟定時器控制暫存器TR1;
例:
#include <reg52.h>
void ConfigBaud(unsigned int baud);
void main()
{
EA = 1; //使能總中斷
ConfigBaud(9600); //設定波特率為9600
while(1);
}
//波特率配置函式
void ConfigBaud(unsigned int baud)
{
SCON = 0x50; //配置串列埠為模式1
TMOD &= 0x0F; //清零T1控制位
TMOD |= 0x20; //配置T1為模式2
TH1 = 256 - (11059200/12/32)/baud; //計算T1過載值
TH1 = TL1;
ET1 = 0; //禁止T1中斷
ES = 1; //使能串列埠中斷
TR1 = 1; //使能T1
}
//串列埠中斷服務函式
void InterruptUART() interrupt 4
{
if(RI) //接收到資料
{
RI = 0; //軟體清零
......
}
if(TI) //資料傳送完畢
{
TI = 0; //軟體清零
}
}