1. 串口通信基础与STC89C52硬件解析
串口通信作为单片机与外部设备交互的核心方式,其重要性在嵌入式领域不言而喻。STC89C52这款经典51单片机自带UART模块,通过简单的配置即可实现稳定通信。实际项目中,我经常用它来传输传感器数据或接收上位机指令,相比并口通信更节省IO资源。
硬件上,STC89C52的串口通过P3.0(RXD)和P3.1(TXD)两个引脚实现数据收发。其内部包含独立的发送和接收缓冲器SBUF,共用同一个地址(99H)。工作时,波特率由定时器1产生,因此配置时需要同时考虑串口控制和定时器设置。根据我的实测经验,在11.0592MHz晶振下,波特率误差可以控制在0.16%以内,远优于12MHz晶振的6.99%误差。
关键提示:STC89C52的UART模块不支持硬件流控,如需RTS/CTS控制需通过GPIO模拟实现
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 寄存器配置与波特率计算
2.1 核心寄存器详解
配置串口需要操作以下四个关键寄存器:
-
SCON(98H):串口控制寄存器
- SM0/SM1决定工作模式(常用模式1:8位UART)
- REN使能接收
- TI/RI中断标志需软件清零
-
PCON(87H):电源控制寄存器
- SMOD位直接加倍波特率
- 一般上电默认为0
-
TMOD(89H):定时器模式寄存器
- 定时器1需配置为8位自动重装模式(M1=1,M0=0)
-
TCON/IE:中断相关控制
2.2 波特率精确计算
模式1波特率公式:
code复制波特率 = (2^SMOD / 32) × (定时器1溢出率)
以9600bps为例计算步骤:
- 选择11.0592MHz晶振
- 设置SMOD=0
- 定时器1采用模式2(8位自动重载)
- 计算初值:
code复制定时器溢出率 = 波特率 × 32 / (2^SMOD) = 9600 × 32 /1 = 307200 初值TH1 = 256 - 晶振频率/(12×溢出率) = 256 - 11059200/(12×307200) = 253.67 → 取整254(0xFE)
实测发现,TH1=0x
