51单片机UART-串口通讯的配置方法

前言
在我们配置51系列单片机的串口时,涉及到定时器寄存器、中断寄存器、串口寄存器等多个寄存器,且在厂家的芯片手册中处于分散的位置,查阅不便,因此本文将51单片机中UART-串口通讯的配置过程进行了归纳汇总,方便学习和配置。

一、配置流程

在51单片机上,集成了串口通讯的功能,我们通过配置相关寄存器的参数就可以使用串口通讯功能。具体的配置流程如下:
第一步:配置定时器1
通过选定的波特率晶振频率 、单片机的机器周期 等信息计算定时器的初值;
TMOD寄存器选择定时器的工作模式---一般使用8位自动重装模式;
将计算好的初值装入到TH1和TL1寄存器中;
启动定时器1
第二步:配置中断
打开总中断允许位 EA
打开串口中断 ES
第三步:配置串口寄存器
配置SCON寄存器,选择串口的工作模式---通常采用模式1
配置PCON寄存器,选择是否倍频--这里的配置会影响到波特率的计算

二、定时器寄存器的配置

(1)波特率的计算

51单片机的模式1和模式3是可以通过定时器1的溢出率来调整波特率的,我们常用的波特率有2400、4800、9600、19200等。
本次我们波特率采用9600、晶振频率11.0592MHz、不倍频(SMOD为0)。
根据芯片的技术手册提供的计算公式:

公式中的fosc = 11.0592MHz,转换为Hz:11059200
公式中的SMOD = 0
公式中的n = 8(采用的是8位重装模式),因此2的8次方就是 256
波特率选定为9600
求初值a =256 - 11059200 / 32 / 12 /9600 = 253

(2)定时器1寄存器的配置

以下三张图是从芯片的手册中截取的定时器1的寄存器信息:



定时器工作模式选择8位自动重装,由于TMOD寄存器不可位寻址,因此我们需要通过位运算将寄存器中的M1和M0改成1和0,其余位保持不变,代码如下:
TMOD &= 0X0F;//将定时器1的寄存器(BIT4-BIT7)复位 TMOD |= 0X20;//将定时器1的M1置1 TH1 = 0XFD;//装自动重装值 TL1 = 0XFD;//装初值 TR1 = 1;//打开定时器1,开始计数

三、串口寄存器的配置

芯片手册中与串口相关的寄存器截图如下:


我们的需求是:使用串口模式1、发送和接受数据、不倍频
因此寄存器的设置应为:
SCON寄存器内的值设置为:0101 0000 转换为十六进制:0X50
PCON:0000 0000
串口寄存器设置的代码为:
SCON = 0X50; PCON = 0X00;

四、中断寄存器的配置

最后,如果希望使用中断的方式接受串口的数据,需要配置中断寄存器:
1.开启总中断
2.开启串口中断
代码如下:
EA = 1;//开总中断 ES = 1;//开串口中断

五、 串口初始化函数

将代码汇总,即可构成一个串口初始化代码:

cpp 复制代码
void UART_Init(void)
{
    //定时器配置
    TMOD &= 0X0F;//将定时器1的寄存器(BIT4-BIT7)复位
    TMOD |= 0X20;//将定时器1的M1置1
    TH1 = 0XFD;//装自动重装值
    TL1 = 0XFD;//装初值
    TR1 = 1;//打开定时器1,开始计数
    //串口配置
    SCON = 0X50;//串口工作模式1
    PCON = 0X00;//不倍频
    //中断配置
    EA = 1;//开总中断
    ES = 1;//开串口中断
}

六、 特别注意

在完成上述的配置后,就可以使用51单片机的串口发送和接收数据了,但是需要注意的是:

  • 单片机在发送和接收完一次数据后,都会产生中断,进入中断服务函数;
  • 需要在中断服务函数中进行判断是发送完成产生的中断还是接收完成产生的中断;
    • 发送完成后TI会置1
    • 接收完成后RI会置1
  • 在处理完后将中断标志位清零,否则无法再次进入中断函数。
    示例:
cpp 复制代码
void UART_Interrupt(void) interrupt 4
{
    if(RI == 1)
    {
        //处理逻辑
    }
    if(TI == 1)
    {
        //处理逻辑
    }
}
//注意:在中断服务函数中,需要尽量缩短代码的执行任务,以免本次执行还未结束,下次中断已经开始,导致程序混乱。
相关推荐
Wave8451 小时前
基于 STM32 + ESP8266 + W25Q64 的双核 OTA 底层架构总结
stm32·嵌入式硬件·架构
xiangw@GZ2 小时前
WiFi 全世代(WiFi1~WiFi7)技术规范与核心参数总结
嵌入式硬件
振南的单片机世界2 小时前
CPU时钟:频率越高跑越快,但物理极限在“拖后腿”
stm32·单片机·嵌入式硬件
普中科技4 小时前
【普中 51-Ai8051 开发攻略】-- 第 20 章 输入捕获实验
单片机·嵌入式硬件·输入捕获·pca·普中科技·ai8051u·aicube
d111111111d4 小时前
直流电机位置式 PID 控制 和 舵机的区别
笔记·stm32·单片机·嵌入式硬件·学习
d111111111d6 小时前
了解Modbus
网络·笔记·stm32·单片机·嵌入式硬件·学习
三佛科技-134163842126 小时前
主控FT32F031便携式吸尘器方案,迷你手持吸尘器MCU控制方案开发
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
一个平凡而乐于分享的小比特7 小时前
一文读懂MCU与FPGA:核心区别、协同之道与双修秘籍
单片机·fpga开发·职场发展·mcu开发
踏着七彩祥云的小丑8 小时前
嵌入式——认识电子元器件——微动开关系列
单片机·嵌入式硬件
调光IC-小雅8 小时前
解析FP62××系列限流保护机制:为何它是DC/DC芯片的安全底线
单片机·嵌入式硬件