51单片机modbus协议程序IC解密
IC解密#include <reg51.h>
#define uint8 unsigned char
#define uint16 unsigned int
#define FOSC 16000000
uint16 BAUD=9600;
uint16 TEMP_Alert=1000;
//字地址 0 - 255 (只取低8位)
//位地址 0 - 255 (只取低8位)
uint16 TempRegister; //用于测试 字址址16
uint8 localAddr = 0x01; //单片机控制板的地址
uint8 sendCount; //发送字节个数
uint8 receCount; //接收到的字节个数
//uint8 sendPosi; //发送位置
uint8 xdata receBuf[1];
uint8 xdata sendBuf[1];
void checkComm0Modbus(void);
uint16 getRegisterVal(uint16 addr,uint16 *tempData);
uint16 setRegisterVal(uint16 addr,uint16 tempData);
void switch_BAUD(uint16 value);
/*****************************波特率调整函数 ********************************/
////函数功能:调整串口通信波特率
////串口工作在工作方式1,即8位波特率可变模式
/****************************************************************************/
void switch_BAUD(uint16 value)
{
switch(value)
{
case 0x0001: { BAUD=9600;break; }
case 0x0002: { BAUD=14400;break; }
case 0x0003: { BAUD=19200;break; }
}
TR1=0; //停止定时器1
ES=0; //关闭串口中断
TH1=TL1=-(FOSC/12/32/BAUD); //设置波特率
TR1=1; //开启定时器1
ES=1; //使能串口中断
}
/***************************CRC校验码生成函数 ********************************/
////函数功能:生成CRC校验码
////本代码中使用查表法,以提高运算速度
/****************************************************************************/
uint16 crc16(uint8 *puchMsg, uint16 usDataLen)
{
uint8 uchCRCHi = 0xFF ; /* 高CRC字节初始化 */
uint8 uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */
uint16 uIndex ; /* CRC循环中的索引 */
while (usDataLen--) /* 传输消息缓冲区 */
{
uIndex = uchCRCHi ^ *puchMsg++ ; /* 计算CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (uchCRCLo << 8 | uchCRCHi) ;
}//uint16 crc16(uint8 *puchMsg, uint16 usDataLen)
/*******************************串口发送函数 ********************************/
////函数功能:将数据包通过串口发送至主机
////有待修改......
/****************************************************************************/
//开始发送
void Begin_send(void)
{
uint16 i=0;
while(sendCount--)
{
SBUF = sendBuf[i++];
while(!TI);
}
}
/********IC解密从机响应主机问询函数,function code : 03,读取多个寄存器值 ********/
////函数功能:丛机根据串口接收到的数据包receBuf[]里面的内容,根据被读取寄存器
////的起始地址和读取的寄存器个数,去读相应的寄存器的值,并将读取的数据以MODBUS
////响应数据的标准格式打包,经过串口发送到主机。数据包格式同上。