Modbus RTU 51单片机从机:轻松对接多种组态软件
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单片机从机源码真的是个好东西,无论是做项目还是学习研究,都非常有价值,感兴趣的小伙伴可以深入研究研究。
