1 / 35
文档名称:

51单片机modbus协议程序.docx

格式:docx   大小:18KB   页数:35页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

51单片机modbus协议程序.docx

上传人:zhuwo11 2022/10/18 文件大小:18 KB

下载得到文件列表

51单片机modbus协议程序.docx

相关文档

文档介绍

文档介绍:该【51单片机modbus协议程序 】是由【zhuwo11】上传分享,文档一共【35】页,该文档可以免费在线阅读,需要了解更多关于【51单片机modbus协议程序 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。51单片机modbus协议程序
#include;
#defineuint8unsignedchar
#defineuint16unsignedint
#defineFOSC16000000
uint16BAUD=9600;
uint16TEMP_Alert=1000;
//字地址0-255(只取低8位)
//位地址0-255(只取低8位)
uint16TempRegister;//用于测试字址址16
uint8localAddr=0x01;//单片机控制板的地址
uint8sendCount;//发送字节个数
uint8receCount;
//接收到的字节个数
//uint8sendPosi;
//发送位置
uint8xdatareceBuf[1];
uint8xdatasendBuf[1];
voidcheckComm0Modbus(void);
uint16getRegisterVal(uint16addr,uint16*tempData);
voidswitch_BAUD(uint16value);
/*****************************波特率调整函数********************************/////函数功能:调整串口通信波特率////串口工作在工作方式1,即8位波特率可变模式/****************************************************************************/
voidswitch_BAUD(uint16value){
switch(value)
{
case0x0001:{BAUD=9600;break;}
case0x0002:{BAUD=14400;break;}
case0x0003:{BAUD=19200;break;}}
TR1=0;
//停止定时器1
ES=0;
//关闭串口中断
TH1=TL1=-(FOSC/12/32/BAUD);
//设置波特率
TR1=1;
//开启定时器1
ES=1;
//使能串口中断
/***************************CRC校验码生成函数********************************/
////函数功能:生成CRC校验码
////本代码中使用查表法,以提高运算速度/****************************************************************************/
uint16crc16(uint8*puchMsg,uint16usDataLen){
uint8uchCRCHi=0xFF;/*高CRC字节初始化*/uint8uchCRCLo=0xFF;/*低CRC字节初始化*/uintl6ulndex;/*CRC循环中的索引*/while(usDataLen--)/*传输消息缓冲区*/
{
ulndex=uchCRCHi八*puchMsg++;/*计算CRC*/uchCRCHi=uchCRCLo八auchCRCHi[uIndex];
uchCRCLo=auchCRCLo[uIndex];
}return(uchCRCLo;>;8;
sendBuf[i+4]=tempData&0xff;
}
sendBuf[0]=localAddr;
sendBuf[1]=3;//functioncode:03sendBuf[2]=byteCount;
byteCount+=3;
//加上前面的地址,功能码,地址共3+byteCount个字节
crcData=crc16(sendBuf,byteCount);sendBuf[byteCount]=crcData&0xff;
//CRC代码低位在前
byteCount++;
sendBuf[byteCount]=crcData>;>;8;
//高位在后
sendCount=byteCount+1;
//例如byteCount=49,则sendBuf[]中实际上有49+1个元素待发
Begin_send();
}//voidreadRegisters(void)
/********从机响应主机问询函数,functioncode:16,设置多个寄存器值*********/
////函数功能:丛机根据串口接收到的数据包receBuf[]里面的内容,根据被强制寄存器
////的起始地址,去设置相应寄存器的值,响应数据包同询问数据包
////的内容相同,经过串口发送到主机。
/****************************************************************************///////////////询问数据包格式://///////////////////////receBuf[0]receBuf[1]receBuf[2]
receBuf[3]
receBuf[4]
//响应数据包内容为除去询问数据包中的字节计数和数据高低位的其他内容
voidpresetMultipleRegisters(void)
{
uint8addr;
uint8tempAddr;
uint8byteCount;
uint8setCount;
uint16crcData;
uint16tempData;
uint8i;
//addr=(receBuf[2];>;8;//寄存器地址高位
sendBuf[3]=addr&0xff;//寄存器地址低位sendBuf[4]=setCount>;>;8;//待设置寄存器数量高位
sendBuf[5]=setCount&0xff;//待设置寄存器数量低位
crcData=crcl6(sendBuf,6);//生成CRC校验码sendBuf[6]=crcData&0xff;//CRC代码低位在前sendBuf[7]=crcData>;>;8;
//高位在后sendCount=8;
Begin_send();
}//voidpresetMultipleRegisters(void)
/*************************查询uart接收的数据包内容函数**************************/////函数功能:丛机根据串口接收到的数据包receBuf[l]里面的内容,即functioncode执行////相应的命令/********************************************************************************/voidcheckComm0Modbus(void)
{
uint16crcData;
uint16tempData;
if(receCount>;4)
{
switch(receBuf[1])
{
case3://读取保持寄存器(一个或多个)
{
if(receCount>;=8)//从询问数据包格式可知,
{//接收完成一组数据
//应该关闭接收中断
if(receBuf[0]==localAddr)
//核对地址
{
crcData=crc16(receBuf,6);
//核对校验码
if(crcData==receBuf[7]+(receBuf[6];=tempData)
{
if(receBuf[0]==localAddr)
{
crcData=crc16(receBuf,tempData-2);
if(crcData==(receBuf[tempData-2]<<8)+
receBuf[tempData-1])
{
presetMultipleRegisters();
}
receCount=0;
}
break;
}
default:break;
}
}//voidcheckComm0(void)/*******************************读取寄存器内容函数**************************/////函数功能:根据寄存器地址读取相应寄存器内容/****************************************************************************/
//取寄存器值返回0表示成功
uint16getRegisterVal(uint16addr,uint16*tempData){
uint16result=0;
uint16tempAddr;
tempAddr=addr&0xfff;switch(tempAddr&0xff)
{

最近更新

2025年医院后勤年终工作总结5篇 10页

2019年贵州省安顺市中考化学试卷及答案 12页

2025年度工程合同管理及招投标实训师资力量引.. 16页

2019年湖南省湘西州中考语文真题及答案 8页

2025学生读书心得体会交流会5篇 最新的学生读.. 6页

2019年海南三亚中考地理真题及答案 11页

2025年度建筑行业包工头劳务承包合同范本 13页

2025医院护士长年终工作总结5篇 11页

2025初中英语教师年终工作总结3篇 7页

2019年江苏淮安中考历史真题及答案 6页

2025优秀教师教育个人工作总结5篇 6页

2025中秋节演讲稿600字4篇 5页

2025年度房屋租赁合同租赁物租赁价格调整通用.. 9页

2025年度拆迁房买卖合同范本,保障购房人隐私.. 16页

2025年度搬家服务及家居整理合同范本 13页

2025年度数字经济产业园区建设二零二五版标准.. 15页

2025年度文档多场景应用培训与实施合同 4页

2025年度新型殡葬服务合作协议书范本 16页

2025年度新能源创新咨询服务协议书 16页

2025年度无司机长期租赁车辆,打造专属商务出.. 16页

2025年度智慧城市数据更新与创建综合服务合同.. 17页

2019中国石油报社应届高校毕业生招聘试题及答.. 23页

2025年度智能家居设备销售与安装合同 3页

2018年重庆南川中考语文真题及答案B卷 14页

2025年度机动车交通事故责任认定及赔偿协议书.. 16页

2025年度标准商业保理合同 16页

2025年度水沟加固与承包劳务合同范本 16页

2025年度汽车维修技术支持居间服务合同A 13页

2025年度火锅店直营店合作经营合同范本 16页

2025年度物流搬运服务合同细则 15页