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;            //软件清零
    }
}

猜你喜欢

转载自blog.csdn.net/LKZYnih/article/details/81221421