1. 串行通信基础与51单片机实现
在嵌入式系统开发中,串行通信是最基础也最重要的功能之一。作为一位从事单片机开发多年的工程师,我经常需要处理各种串行通信问题。今天我想系统地分享一下51单片机串行通信的实现方法,特别是UART模块的详细使用技巧。
1.1 串行通信的基本概念
串行通信与并行通信最大的区别在于数据传输方式。串行通信使用单根数据线逐位传输数据,而并行通信则使用多根数据线同时传输多位数据。在实际工程中,串行通信因其布线简单、成本低廉、抗干扰能力强等优势,成为嵌入式系统中最常用的通信方式。
串行通信又可分为同步和异步两种类型。同步通信需要额外的时钟线来同步数据传输,如SPI和I2C协议;而异步通信则依靠双方预先约定的波特率来实现同步,UART就是典型的异步通信协议。
1.2 51单片机的UART模块
51单片机内部集成了全双工的UART模块,可以实现同时收发数据。这个模块包含以下关键部件:
- 发送缓冲器SBUF和接收缓冲器SBUF(实际上是两个独立的寄存器,但共用同一个地址)
- 波特率发生器(通常使用Timer1工作在模式2)
- 串行控制寄存器SCON
- 中断系统
UART通信需要配置几个关键参数:
- 波特率:常见的有9600、19200、115200等
- 数据位:通常为8位
- 校验位:可选无校验、奇校验或偶校验
- 停止位:通常为1位
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. UART硬件配置与初始化
2.1 波特率计算与设置
51单片机的UART波特率由Timer1产生。当使用11.0592MHz晶振时,波特率计算公式为:
波特率 = (2^SMOD × 晶振频率) / (32 × 12 × (256 - TH1))
其中SMOD是PCON寄存器的一个控制位,用于波特率加倍。TH1是Timer1的重装值。常用的波特率对应TH1值如下:
| 波特率 | SMOD | TH1值 | 实际波特率 | 误差率 |
|---|---|---|---|---|
| 2400 | 1 | 0xF4 | 2403.85 | 0.16% |
| 4800 | 0 | 0xFA | 4807.69 | 0.16% |
| 9600 | 0 | 0xFD | 9615.38 | 0.16% |
| 19200 | 0 | 0xFE | 19230.77 | 0.16% |
| 115200 | 1 | 0xFF | 115200 | 0% |
提示:11.0592MHz晶振被广泛使用的原因就是它能够精确产生这些常用波特率,误差极小。
2.2 寄存器配置详解
UART初始化涉及多个寄存器的配置:
SCON寄存器(98H)
- SM0、SM1:工作模式选择,通常设置为01(模式1,8位UART)
- REN:接收使能,必须置1才能接收数据
- TI、RI:发送/接收中断标志,需要软件清零
PCON寄存器(87H)
- SMOD:波特率加倍控制位
TMOD寄存器(89H)
- 配置Timer1为模式2(8位自动重装)
IE寄存器(A8H)
- EA:总中断使能
- E
