1. 程式人生 > >51微控制器學習——串列埠通訊

51微控制器學習——串列埠通訊

51微控制器的UART串列埠的結構由序列口控制暫存器SCON、傳送和接收電路三部分構成。

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. 配置串列埠為模式1;
  2. 配置定時器T1為模式2;
  3. 設定波特率;
  4. 開啟定時器控制暫存器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;            //軟體清零
    }
}