#include <reg52.h>
#include <INTRINS.H>
#include <STCHeader.h>
/*********************************************************************************/
//modbus通信相关宏定义
/*********************************************************************************/
#define MAX_PACKET 14 //串口缓冲区大小
#define MAX_ADDR_NUM 48 //最大从机地址数量
#define FUNC_NUM_ERR 0x01 //错误码
#define REG_ADDR_ERR 0x02
#define REG_NUM_ERR 0x03
#define MY_ADDR 0x01 //modbus从机地址
#define OSFREQ 11059200 //晶振频率11.0592MHz
char idata DI[6]={0x01,0x02,0x03,0x04,0x05,0x06}; //数字量输入数据
char idata DO[6]={0x06,0x07,0x08,0x09,0x10,0x11}; //数字量输出数据
char idata AI[8]={0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18}; //模拟量输入数据
char idata AO[8]={0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18}; //模拟量输出数据
char idata ReceiveData[MAX_PACKET]; //串口接收数据缓冲区,14字节大小
unsigned char sendbuf[MAX_PACKET]; //串口发送数据缓冲区,14字节大小
VOID SendStringToCom(UCHAR *pStrToSend,UINT sendLength); //串口发送函数,发送指定长度的字符串
/*---------------------------------------------------------------------------
函数说明:CRC 高位字节值表
---------------------------------------------------------------------------*/
static unsigned char code Cal_CRC_Hi[] = {
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, 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, 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,
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低位字节值表
---------------------------------------------------------------------------*/
static unsigned char code Cal_CRC_Lo[] = {
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
};
/*---------------------------------------------------------------------------
函数名称:Cal_CRC16
函数说明:modbus rtu通信的CRC校验
---------------------------------------------------------------------------*/
static unsigned int Cal_CRC16(unsigned char *puchMsg, unsigned char usDataLen)
{
unsigned char uchCRCHi = 0xFF ; // 高CRC字节初始化
unsigned char uchCRCLo = 0xFF ; // 低CRC 字节初始化
unsigned int uIndex ; // CRC循环中的索引
while (usDataLen--) // 传输消息缓冲区
{
uIndex = uchCRCHi ^ *puchMsg++ ; // 计算CRC
uchCRCHi = uchCRCLo ^ Cal_CRC_Hi[uIndex] ;
uchCRCLo = Cal_CRC_Lo[uIndex] ;
}
return (uchCRCHi << 8 | uchCRCLo) ;
}
/*---------------------------------------------------------------------------
函数名称:GetBit
函数说明:取出所给地址的位值
---------------------------------------------------------------------------*/
static unsigned char GetBit(unsigned int address,unsigned char function)
{
unsigned char data Offset;
unsigned char data temp;
unsigned char data *Myaddress;
Offset=(char)address&0x07; //求余,该位在对应数组元素中的偏移位置
switch (function) //根据功能码不同进行相应处理
{
case 2:
Myaddress=DI;
break;
case 1:
Myaddress=DO;
break;
default:
return 2;
}
temp=(char)(address>>3); //得到bit位在数组中的索引地址
temp=*(Myaddress+temp); //得到该数组中该字节的数值
temp>>=(Offset); //右移得到对应位的值
if (temp&0x01)
return 1;
else
return 0;
}
/*---------------------------------------------------------------------------
函数名称:ProcessFun1_2
函数说明:功能码1,2处理
---------------------------------------------------------------------------*/
static void ProcessFun1_2(unsigned char address, unsigned char len)
{
unsigned char i;
unsigned char j;
unsigned char length;
unsigned char function;
unsigned int temp;
length=0;
sendbuf[0]=ReceiveData[0]; //地址
sendbuf[1]=ReceiveData[1]; //功能码
function=sendbuf[1];
for (i=1;i<=len;i++)
{
length++;
sendbuf[2+length]=0; //清零
for (j=0;j<8;j++)
{
sendbuf[2+length]=sendbuf[2+length]|(GetBit(address,function)<<j);
address++;
i++;
if(i>len)break;
}
i--;
}
sendbuf[2]=length; //数据长度
temp=Cal_CRC16(sendbuf,length+3); //DI状态数据
sendbuf[3+length]=(char)(temp>>8); //CRC校验高
sendbuf[4+length]=(char)temp; //CRC校验低
SendStringToCom(sendbuf,length+5); //调用串口发送程序
}
/*---------------------------------------------------------------------------
函数名称:ProcessFun3
函数说明:功能码3处理-----读取多个保持寄存器
---------------------------------------------------------------------------*/
static void ProcessFun3(unsigned char address, unsigned char len)
{
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
STC.rar (58个子文件)
STC
Slave
Out
Slave 26KB
Slave.lnp 141B
STARTUP.obj 783B
Slave.hex 6KB
Slave.plg 804B
ModbusCommunication1.obj 23KB
ModbusMain.obj 7KB
Source
ModbusCommunication1.c 13KB
ModbusCommunication.c 17KB
STC12C5A.H 18KB
PCF8591_STC12C5A.h 3KB
ModbusMain.c 5KB
STCHeader.h 985B
Project
Slave 25KB
Slave.opt.bak 2KB
Slave.uvopt 61KB
Slave_Uv2.Bak 2KB
STARTUP.LST 11KB
Slave.lnp 96B
ModbusCommunication1.lst 24KB
Slave_Opt.Bak 2KB
Slave.M51 31KB
Slave.Uv2.bak 2KB
Slave.uvproj 14KB
STARTUP.A51 5KB
ModbusMain.lst 9KB
STARTUP.OBJ 749B
Slave_uvopt.bak 61KB
Slave.plg 188B
ModbusCommunication1.obj 23KB
ModbusMain.obj 6KB
Master
Out
Master.hex 6KB
STARTUP.obj 783B
Master.plg 676B
Master 26KB
ModbusCommunication1.obj 15KB
ModbusMain.obj 15KB
Master.lnp 143B
Source
ModbusCommunication1.c 12KB
ModbusCommunication.c 17KB
STC12C5A.H 18KB
PCF8591_STC12C5A.h 3KB
LED.H 4KB
ModbusMain.c 6KB
STCHeader.h 824B
Project
Master.uvopt 60KB
Master_Uv2.Bak 0B
Master.Uv2.bak 2KB
STARTUP.LST 11KB
Master_Opt.Bak 2KB
Master_uvopt.bak 60KB
ModbusCommunication1.lst 22KB
STARTUP.A51 5KB
ModbusMain.lst 14KB
Master.plg 190B
Master.opt.bak 2KB
Master.m51 31KB
Master.uvproj 14KB
共 58 条
- 1
资源评论
- a2713154932017-03-09东西不错,值得学习一下
sunraiseyx
- 粉丝: 6
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功