当前位置:人工智能 > 51单片机modbus教程_modbus编程

51单片机modbus教程_modbus编程

  • 发布:2023-10-09 14:13

本文内容列表:

  • 1、51单片机和触摸屏地址如何对应?
  • 2、如何用C语言编写51单片机的Modbus通讯程序?
  • 3、51单片机MODbUs通讯,功能码05的位操作如何实现

51单片机和触摸屏的地址如何对应

51独立芯片与触摸屏连接有四个步骤:

1 触摸屏与微控制器之间的硬件连接

2 建立触摸屏内存地址与单片机的对应关系

3 触摸屏组态软件编辑

4 MODBUSRTU(远程终端设备)通讯协议简介

下面介绍三个选项:

第一个采用单片机+串口触摸屏(较贵),采用232或485通讯方式。

第二种选择是购买裸屏触摸屏,使用ADS芯片驱动,这样过程比较麻烦。

第三种选择是购买与PLC通信的触摸屏模块,使用RTC的modbus通信。这种类型的触摸屏模块是最昂贵的。

51 如何用C语言编写单片机Modbus通讯程序?

我刚好在做crc验证。给你一段代码。我也是从网上复制的。已验证。

无符号短crc16;

静态 uchar 代码 auchCRCHi[256] = {

0x00、0xC1、0x81、0x40、0x01、0xC0、0x80、0x41、0x01、0xC0、

0x80、0x41、0x00、0xC1、0x81、0x40、0x01、0xC0、0x80、0x41、

0x00、0xC1、0x81、0x40、0x00、0xC1、0x81、0x40、0x01、0xC0、

0x01、0xC0、0x80、0x41、0x00、0xC1、0x81、0x40、0x01、0xC0、

0x80、0x41、0x01、0xC0、0x80、0x41、0x00、0xC1、0x81、0x40、

0x00、0xC1、0x81、0x40、0x01、0xC0、0x80、0x41、0x01、0xC0、

0x80、0x41、0x00、0xC1、0x81、0x40、0x01、0xC0、0x80、0x41、

0x00、0xC1、0x81、0x40、0x00、0xC1、0x81、0x40、0x01、0xC0、

0x80、0x41、0x00、0xC1、0x81、0x40、0x01、0xC0、0x80、0x41、

0x01、0xC0、0x80、0x41、0x00、0xC1、0x81、0x40、0x01、0xC0、

0x80、0x41、0x00、0xC1、0x81、0x40、0x00、0xC1、0x81、0x40、

0x01、0xC0、0x80、0x41、0x01、0xC0、0x80、0x41、0x00、0xC1、

0x81、0x40、0x00、0xC1、0x81、0x40、0x01、0xC0、0x80、0x41、

0x00、0xC1、0x81、0x40、0x01、0xC0、0x80、0x41、0x01、0xC0、

0x80、0x41、0x00、0xC1、0x81、0x40

};

// CRC 低位字节值表

静态 uchar 代码 auchCRCLo[256] = {

0x00、0xC0、0xC1、0x01、0xC3、0x03、0x02、0xC2、0xC6、0x06、

0x07、0xC7、0x05、0xC5、0xC4、0x04、0xCC、0x0C、0x0D、0xCD、

0x0F、0xCF、0xCE、0x0E、0x0A、0xCA、0xCB、0x0B、0xC9、0x09、

0x08、0xC8、0xD8、0x18、0x19、0xD9、0x1B、0xDB、0xDA、0x1A、

0x1E、0xDE、0xDF、0x1F、0xDD、0x1D、0x1C、0xDC、0x14、0xD4、

0xD5、0x15、0xD7、0x17、0x16、0xD6、0xD2、0x12、0x13、0xD3、

0x11、0xD1、0xD0、0x10、0xF0、0x30、0x31、0xF1、0x33、0xF3、

0xF2、0x32、0x36、0xF6、0xF7、0x37、0xF5、0x35、0x34、0xF4、

0x3C、0xFC、0xFD、0x3D、0xFF、0x3F、0x3E、0xFE、0xFA、0x3A、

0x3B、0xFB、0x39、0xF9、0xF8、0x38、0x28、0xE8、0xE9、0x29、

0xEB、0x2B、0x2A、0xEA、0xEE、0x2E、0x2F、0xEF、0x2D、0xED、

0xEC、0x2C、0xE4、0x24、0x25、0xE5、0x27、0xE7、0xE6、0x26、

0x22、0xE2、0xE3、0x23、0xE1、0x21、0x20、0xE0、0xA0、0x60、

0x61、0xA1、0x63、0xA3、0xA2、0x62、0x66、0xA6、0xA7、0x67、

0xA5、0x65、0x64、0xA4、0x6C、0xAC、0xAD、0x6D、0xAF、0x6F、

0x6E、0xAE、0xAA、0x6A、0x6B、0xAB、0x69、0xA9、0xA8、0x68、

0x78、0xB8、0xB9、0x79、0xBB、0x7B、0x7A、0xBA、0xBE、0x7E、

0x7F、0xBF、0x7D、0xBD、0xBC、0x7C、0xB4、0x74、0x75、0xB5、

0x77、0xB7、0xB6、0x76、0x72、0xB2、0xB3、0x73、0xB1、0x71、

0x70、0xB0、0x50、0x90、0x91、0x51、0x93、0x53、0x52、0x92、

0x96、0x56、0x57、0x97、0x55、0x95、0x94、0x54、0x9C、0x5C、

0x5D、0x9D、0x5F、0x9F、0x9E、0x5E、0x5A、0x9A、0x9B、0x5B、

0x99、0x59、0x58、0x98、0x88、0x48、0x49、0x89、0x4B、0x8B、

0x8A、0x4A、0x4E、0x8E、0x8F、0x4F、0x8D、0x4D、0x4C、0x8C、

0x44、0x84、0x85、0x45、0x87、0x47、0x46、0x86、0x82、0x42、

0x43、0x83、0x41、0x81、0x80、0x40

};

//CRC校验功能

无符号短 CRC16(无符号 char *puchMsg,无符号短 usDataLen)

{

无符号字符 uchCRCHi = 0xFF; /* 高CRC字节初始化 */

无符号字符 uchCRCLo = 0xFF; /* 低CRC字节初始化 */

无符号 uInde​​x ; /* CRC 循环中的索引 */

while (usDataLen--) /* 发送消息缓冲区 */

{

uInde​​x = uchCRCHi ^ *puchMsg++ ; /* 计算CRC */

uchCRCHi = uchCRCLo ^ auchCRCHi[uInde​​x] ;

uchCRCLo = auchCRCLo[uInde​​x] ;

}

返回 (uchCRCHi 8 | uchCRCLo) ;

}

调用方法:dd=CRC16(tmp,x);

51单片机MODbUs通讯,如何实现功能码05

的位操作

05H-写入单个线圈

1)说明:写单个线圈,位操作,只能写一个。写入 0xff00 表示将线圈状态设置为 ON,写入 0x0000 表示将线圈状态设置为 OFF

2) 发送命令:

将0x0032线圈设置为ON;

3) 回应:

与发送指令相同。

0FH-写入多个线圈

1) 说明:写入多个线圈寄存器。如果数据区中某一位的值为“1”,则表示所请求的相应线圈的状态为ON。如果某一位的值为“0”,则表示状态为OFF。

2) 发送命令:

线圈地址为0x04a5,写入12个线圈,

DATA1 为 0x0c,表示:

DATA2为0x02,不够8位,字节高位补0:

相关文章