1. 项目概述:串口中断与Modbus协议在单片机中的应用
在单片机开发中,串口通信是最基础也最常用的外设之一。不同于轮询方式,采用中断机制处理串口数据能显著提高系统效率。Modbus作为工业领域广泛应用的通信协议,其RTU模式正是基于串口实现。本实验将使用51单片机平台,通过串口中断实现Modbus RTU协议的数据收发,并完成从机设备的数据读写操作。
关键提示:初学者常犯的错误是混淆查询方式和中断方式。串口中断的核心价值在于"事件驱动"——只有当数据到达时才触发处理,避免了CPU持续检查状态寄存器的资源浪费。
2. 硬件准备与电路设计
2.1 最小系统搭建
以STC89C52为例,需要以下基本组件:
- 11.0592MHz晶振(该频率可精确产生波特率)
- 22pF负载电容×2
- 10μF电解电容+0.1μF瓷片电容组成电源滤波
- CH340G USB转串口模块(需注意TX/RX交叉连接)
2.2 串口电路关键参数
c复制// 波特率计算示例(9600bps,SMOD=0)
TH1 = 256 - (11059200/12/32)/9600; // 得到0xFD
实测发现:使用11.0592MHz晶振时,TH1装入0xFD产生的实际波特率为9603.84,误差仅0.04%,完全满足Modbus RTU要求。若用12MHz晶振,则会产生7.8%的误差,导致通信失败。
3. 串口中断编程实现
3.1 初始化配置步骤
- 设置串口模式(SCON寄存器)
- 配置定时器1为波特率发生器(TMOD寄存器)
- 装载定时器初值(TH1/TL1)
- 开启中断(IE寄存器)
c复制void UART_Init() {
SCON = 0x50; // 模式1,允许接收
TMOD &= 0x0F; // 清除定时器1模式位
TMOD |= 0x20; // 定时器1,模式2
TH1 = 0xFD; // 9600bps @11.0592MHz
TR1 = 1; // 启动定时器
ES = 1; // 允许串口中断
EA = 1; // 全局中断使能
}
