本文内容列表:
51独立芯片与触摸屏连接有四个步骤:
1 触摸屏与微控制器之间的硬件连接
2 建立触摸屏内存地址与单片机的对应关系
3 触摸屏组态软件编辑
4 MODBUSRTU(远程终端设备)通讯协议简介
下面介绍三个选项:
第一个采用单片机+串口触摸屏(较贵),采用232或485通讯方式。
第二种选择是购买裸屏触摸屏,使用ADS芯片驱动,这样过程比较麻烦。
第三种选择是购买与PLC通信的触摸屏模块,使用RTC的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字节初始化 */
无符号 uIndex ; /* CRC 循环中的索引 */
while (usDataLen--) /* 发送消息缓冲区 */
{
uIndex = uchCRCHi ^ *puchMsg++ ; /* 计算CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
返回 (uchCRCHi 8 | uchCRCLo) ;
}
调用方法:dd=CRC16(tmp,x);
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: