Modbus RTU 51单片机从机源码与多种组态软件通信支持485和232串口通信,该从机源码可直接用于51系列和STC12系列单片机的,支持功能码01,02,03,04,05,06,0F,10等常用功能码。

最近在研究Modbus RTU通信这块,发现一个特别实用的51单片机从机源码,必须跟大家分享分享。这个源码不仅支持485和232串口通信,而且在与多种组态软件通信上表现超棒。它还能直接应用于51系列和STC12系列单片机,常用的功能码01、02、03、04、05、06、0F、10等都稳稳支持。
源码剖析
咱们先看看串口初始化部分代码,以485通信为例:
// 485控制引脚定义
sbit RS485 = P1^0;
void UART_Init(void) {
// 设置波特率为9600
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
SCON = 0x50;
PCON = 0x00;
TR1 = 1;
ES = 1;
EA = 1;
}
这里,通过配置 TMOD 寄存器,我们设定定时器1工作在模式2,即8位自动重装模式。TH1 和 TL1 赋的值 0xfd 对应波特率9600。SCON 设置为 0x50 意味着串口工作在模式1,允许接收。PCON 清零,波特率不加倍。开启定时器1,使能串口中断以及总中断。

Modbus RTU 51单片机从机源码与多种组态软件通信支持485和232串口通信,该从机源码可直接用于51系列和STC12系列单片机的,支持功能码01,02,03,04,05,06,0F,10等常用功能码。

再看看功能码处理部分,以功能码03为例:
void HandleFunction03(void) {
unsigned char i;
unsigned int startAddr, numRegs;
// 从接收缓冲区获取起始地址和寄存器数量
startAddr = (unsigned int)(RxBuffer[2] << 8) + RxBuffer[3];
numRegs = (unsigned int)(RxBuffer[4] << 8) + RxBuffer[5];
// 检查地址和数量是否越界
if (startAddr + numRegs > MAX_REG_ADDR) {
// 发送异常响应
SendExceptionResponse(0x02);
return;
}
// 填充响应数据
TxBuffer[0] = RxBuffer[0];
TxBuffer[1] = RxBuffer[1];
TxBuffer[2] = 0x02 * numRegs;
for (i = 0; i < numRegs; i++) {
TxBuffer[3 + 2 * i] = (unsigned char)(Registers[startAddr + i] >> 8);
TxBuffer[4 + 2 * i] = (unsigned char)(Registers[startAddr + i] & 0xff);
}
// 发送响应数据
SendData(TxBuffer, 3 + 2 * numRegs);
}
这段代码里,先从接收缓冲区提取起始地址和寄存器数量,然后检查是否越界。要是没问题,就填充响应数据到发送缓冲区,最后发送出去。要是地址越界,就发送异常响应。
与组态软件通信
有了这个51单片机从机源码,与组态软件通信就变得很容易。比如力控、组态王这类常见的组态软件,只要按照Modbus RTU协议设置好串口参数、设备地址等,就能轻松实现数据交互。像读取寄存器数据,组态软件发送带有功能码03的请求帧,咱们的51单片机从机接收后按上述代码处理,再返回数据给组态软件。

总的来说,这个Modbus RTU 51单片机从机源码真的是个好东西,无论是做项目还是学习研究,都非常有价值,感兴趣的小伙伴可以深入研究研究。


被折叠的 条评论
为什么被折叠?



