51单片机通讯rs485通讯问题,高分求助!

51单片机实现的485通讯程序_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
51单片机实现的485通讯程序
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩8页未读,
定制HR最喜欢的简历
你可能喜欢查看: 857|回复: 0
基于RS485的Modbus通信示例
#include &reg52.h&
sbit BUZZ = P1^6;
bit flagBuzzOn = 0;& &//蜂鸣器启动标志
unsigned char T0RH = 0;&&//T0重载值的高字节
unsigned char T0RL = 0;&&//T0重载值的低字节
unsigned char regGroup[5];&&//Modbus寄存器组,地址为0x00~0x04
void ConfigTimer0(unsigned int ms);
extern void UartDriver();
extern void ConfigUART(unsigned int baud);
extern void UartRxMonitor(unsigned char ms);
extern void UartWrite(unsigned char *buf, unsigned char len);
extern unsigned int GetCRC16(unsigned char *ptr,&&unsigned char len);
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
void main()
& & EA = 1;& && && && &//开总中断
& & ConfigTimer0(1);& &//配置T0定时1ms
& & ConfigUART(9600);&&//配置波特率为9600
& & InitLcd1602();& &&&//初始化液晶
& & while (1)
& && &&&UartDriver();&&//调用串口驱动
/* 串口动作函数,根据接收到的命令帧执行响应的动作
& &buf-接收到的命令帧指针,len-命令帧长度 */
void UartAction(unsigned char *buf, unsigned char len)
& & unsigned char str[4];
& & unsigned int&&
& & unsigned char crch,
& & if (buf[0] != 0x01) //本例中的本机地址设定为0x01,
& & {& && && && && && & //如数据帧中的地址字节与本机地址不符,
& && &&&& && && &//则直接退出,即丢弃本帧数据不做任何处理
& & //地址相符时,再对本帧数据进行校验
& & crc = GetCRC16(buf, len-2);&&//计算CRC校验值
& & crch = crc && 8;
& & crcl = crc & 0xFF;
& & if ((buf[len-2]!=crch) || (buf[len-1]!=crcl))
& && &&&& &//如CRC校验不符时直接退出
& & //地址和校验字均相符后,解析功能码,执行相关操作
& & switch (buf[1])
& && &&&case 0x03:&&//读取一个或连续的寄存器
& && && && &if ((buf[2]==0x00) && (buf[3]&=0x05)) //只支持0x5
& && && && &{
& && && && && & if (buf[3] &= 0x04)
& && && && && & {
& && && && && && &&&i = buf[3];& && &//提取寄存器地址
& && && && && && &&&cnt = buf[5];& & //提取待读取的寄存器数量
& && && && && && &&&buf[2] = cnt*2;&&//读取数据的字节数,为寄存器数*2
& && && && && && &&&len = 3;& && && &//帧前部已有地址、功能码、字节数共3个字节
& && && && && && &&&while (cnt--)
& && && && && && &&&{
& && && && && && && && &buf[len++] = 0x00;& && && & //寄存器高字节补0
& && && && && && && && &buf[len++] = regGroup[i++]; //寄存器低字节
& && && && && && &&&}
& && && && && & }
& && && && && & else&&//地址0x05为蜂鸣器状态
& && && && && & {
& && && && && && &&&buf[2] = 2;&&//读取数据的字节数
& && && && && && &&&buf[3] = 0x00;
& && && && && && &&&buf[4] = flagBuzzOn;
& && && && && && &&&len = 5;
& && && && && & }
& && && && && &
& && && && &}
& && && && &else&&//寄存器地址不被支持时,返回错误码
& && && && &{
& && && && && & buf[1] = 0x83;&&//功能码最高位置1
& && && && && & buf[2] = 0x02;&&//设置异常码为02-无效地址
& && && && && & len = 3;
& && && && && &
& && && && &}
& && && && &
& && &&&case 0x06:&&//写入单个寄存器
& && && && &if ((buf[2]==0x00) && (buf[3]&=0x05)) //只支持0x5
& && && && &{
& && && && && & if (buf[3] &= 0x04)
& && && && && & {
& && && && && && &&&i = buf[3];& && && && & //提取寄存器地址
& && && && && && &&&regGroup[i] = buf[5];& &//保存寄存器数据
& && && && && && &&&cnt = regGroup[i] && 4; //显示到液晶上
& && && && && && &&&if (cnt &= 0xA)
& && && && && && && && &str[0] = cnt - 0xA + 'A';
& && && && && && &&&else
& && && && && && && && &str[0] = cnt + '0';
& && && && && && &&&cnt = regGroup[i] & 0x0F;
& && && && && && &&&if (cnt &= 0xA)
& && && && && && && && &str[1] = cnt - 0xA + 'A';
& && && && && && &&&else
& && && && && && && && &str[1] = cnt + '0';
& && && && && && &&&str[2] = '\0';
& && && && && && &&&LcdShowStr(i*3, 0, str);
& && && && && & }
& && && && && & else&&//地址0x05为蜂鸣器状态
& && && && && & {
& && && && && && &&&flagBuzzOn = (bit)buf[5]; //寄存器值转为蜂鸣器的开关
& && && && && & }
& && && && && & len -= 2; //长度-2以重新计算CRC并返回原帧
& && && && && &
& && && && &}
& && && && &else&&//寄存器地址不被支持时,返回错误码
& && && && &{
& && && && && & buf[1] = 0x86;&&//功能码最高位置1
& && && && && & buf[2] = 0x02;&&//设置异常码为02-无效地址
& && && && && & len = 3;
& && && && && &
& && && && &}
& && && && &
& && &&&default:&&//其它不支持的功能码
& && && && &buf[1] |= 0x80;&&//功能码最高位置1
& && && && &buf[2] = 0x01;& &//设置异常码为01-无效功能
& && && && &len = 3;
& && && && &
& & crc = GetCRC16(buf, len); //计算返回帧的CRC校验值
& & buf[len++] = crc && 8;& & //CRC高字节
& & buf[len++] = crc & 0xFF;&&//CRC低字节
& & UartWrite(buf, len);& && &//发送返回帧
/* 配置并启动T0,ms-T0定时时间 */
void ConfigTimer0(unsigned int ms)
& &&&//临时变量
/ 12;& && &//定时器计数频率
& & tmp = (tmp * ms) / 1000;&&//计算所需的计数值
& & tmp = 65536 -& && &&&//计算定时器重载值
& & tmp = tmp + 33;& && && &&&//补偿中断响应延时造成的误差
& & T0RH = (unsigned char)(tmp&&8);&&//定时器重载值拆分为高低字节
& & T0RL = (unsigned char)
& & TMOD &= 0xF0;& &//清零T0的控制位
& & TMOD |= 0x01;& &//配置T0为模式1
& & TH0 = T0RH;& &&&//加载T0重载值
& & TL0 = T0RL;
& & ET0 = 1;& && &&&//使能T0中断
& & TR0 = 1;& && &&&//启动T0
/* T0中断服务函数,执行串口接收监控和蜂鸣器驱动 */
void InterruptTimer0() interrupt 1
& & TH0 = T0RH;&&//重新加载重载值
& & TL0 = T0RL;
& & if (flagBuzzOn)&&//执行蜂鸣器鸣叫或关闭
& && &&&BUZZ = ~BUZZ;
& && &&&BUZZ = 1;
& & UartRxMonitor(1);&&//串口接收监控
共享资料的黑币奖励!
Powered by485通讯问题,做技术很多年,实在没办法了,请教了!
[问题点数:40分,结帖人thatislife]
485通讯问题,做技术很多年,实在没办法了,请教了!
[问题点数:40分,结帖人thatislife]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2011年1月 VB大版内专家分月排行榜第二2010年10月 VB大版内专家分月排行榜第二
2013年1月 VB大版内专家分月排行榜第三2012年12月 VB大版内专家分月排行榜第三2011年6月 VB大版内专家分月排行榜第三2011年2月 VB大版内专家分月排行榜第三2010年12月 VB大版内专家分月排行榜第三2010年11月 VB大版内专家分月排行榜第三2009年7月 VB大版内专家分月排行榜第三
2011年12月 硬件/嵌入开发大版内专家分月排行榜第三2011年10月 硬件/嵌入开发大版内专家分月排行榜第三2011年6月 硬件/嵌入开发大版内专家分月排行榜第三
2013年4月 硬件/嵌入开发大版内专家分月排行榜第二2007年9月 硬件/嵌入开发大版内专家分月排行榜第二
2013年5月 硬件/嵌入开发大版内专家分月排行榜第三2012年9月 硬件/嵌入开发大版内专家分月排行榜第三2007年11月 硬件/嵌入开发大版内专家分月排行榜第三
2011年12月 硬件/嵌入开发大版内专家分月排行榜第三2011年10月 硬件/嵌入开发大版内专家分月排行榜第三2011年6月 硬件/嵌入开发大版内专家分月排行榜第三
2011年12月 硬件/嵌入开发大版内专家分月排行榜第三2011年10月 硬件/嵌入开发大版内专家分月排行榜第三2011年6月 硬件/嵌入开发大版内专家分月排行榜第三
2013年1月 硬件/嵌入开发大版内专家分月排行榜第一2012年10月 硬件/嵌入开发大版内专家分月排行榜第一2012年9月 硬件/嵌入开发大版内专家分月排行榜第一2012年8月 硬件/嵌入开发大版内专家分月排行榜第一2012年7月 硬件/嵌入开发大版内专家分月排行榜第一2012年6月 硬件/嵌入开发大版内专家分月排行榜第一2012年5月 硬件/嵌入开发大版内专家分月排行榜第一2012年4月 硬件/嵌入开发大版内专家分月排行榜第一2012年3月 硬件/嵌入开发大版内专家分月排行榜第一2012年2月 硬件/嵌入开发大版内专家分月排行榜第一2012年1月 硬件/嵌入开发大版内专家分月排行榜第一2011年11月 硬件/嵌入开发大版内专家分月排行榜第一2011年10月 硬件/嵌入开发大版内专家分月排行榜第一2011年9月 硬件/嵌入开发大版内专家分月排行榜第一
2014年10月 硬件/嵌入开发大版内专家分月排行榜第二2014年2月 硬件/嵌入开发大版内专家分月排行榜第二2013年10月 硬件/嵌入开发大版内专家分月排行榜第二2013年8月 硬件/嵌入开发大版内专家分月排行榜第二2013年3月 硬件/嵌入开发大版内专家分月排行榜第二2012年12月 硬件/嵌入开发大版内专家分月排行榜第二2012年11月 硬件/嵌入开发大版内专家分月排行榜第二2011年12月 硬件/嵌入开发大版内专家分月排行榜第二
2011年12月 硬件/嵌入开发大版内专家分月排行榜第三2011年10月 硬件/嵌入开发大版内专家分月排行榜第三2011年6月 硬件/嵌入开发大版内专家分月排行榜第三
2011年12月 硬件/嵌入开发大版内专家分月排行榜第三2011年10月 硬件/嵌入开发大版内专家分月排行榜第三2011年6月 硬件/嵌入开发大版内专家分月排行榜第三
匿名用户不能发表回复!|更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
按住视频可进行拖动
&正在加载...
收藏成功,可进入
查看所有收藏列表
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
手把手教你学51单片机-18-RS485通信与Modbus协议
正在检测客户端...
您尚未安装客户端,正在为您下载...安装完成后点击按钮即可下载
30秒后自动关闭
手把手教你学51单片机-18-RS485通信与Modbus协议">手把手教你学51单片机-18-RS485通信与Modbus协议
请选择打赏金额:
播放量12.7万
播放量数据:快去看看谁在和你一起看视频吧~
更多数据:
热门短视频推荐
Copyright (C) 2018 & All Rights Reserved
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
正在为您下载爱奇艺客户端安装后即可快速下载海量视频
正在为您下载爱奇艺客户端安装后即可免费观看1080P视频
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
后才可以领取积分哦~
每观看视频30分钟
+{{data.viewScore}}分
{{data.viewCount}}/3
{{if data.viewCount && data.viewCount != "0" && data.viewCount != "1" && data.viewCount != "2" }}
访问泡泡首页
+{{data.rewardScore}}分
{{if data.rewardCount && data.rewardCount != 0 && data.getRewardDayCount != 0}} 1 {{else}} 0 {{/if}}/1
{{if data.rewardCount && data.rewardCount != 0 && data.getRewardDayCount != 0}}
+{{data.signScore}}分
{{data.signCount}}/1
{{if data.signCount && data.signCount != 0}}
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制51单片机 485通信 高4位错误_百度知道
51单片机 485通信 高4位错误
笔记本通过rs232-rs485模块发16进制数到单片机,并在单片机上显示出来,但是发现8位的16进制数种高4位永远是错误的,低4位没有问题,而且问题还是很有规律的,比如0xGD,G为高4位,D为低4位,那么G有问题分别对应的是我的G为0,接收到也为0,而后面就是1-(对应...
我有更好的答案
停止位和校验位收发设置的一样吗?如果一样考虑是不是晶振选的不好,选11.0592M的比12M的好,12M的用来做串口误差太大,很容易误码。
非常感谢您的回答,现在有个问题,我可以正常发送数据,但是pc接收到单片机返回的数据会多一个字节,如果发送n个字节,则返回的多n个字节的数据,烦请指教。。。单片机是89c52,晶振12m,现调整为波特率2400.。。。程序如下,请指教,谢谢字数超限,只能图片了,谢谢
你试试x0=(num&&4)&ox0f
再次感谢您的回答,x0=num&&4只是用来在lcd屏幕显示的,不影响发送状况的;另外不只是max485模块是否存在类似于收到反馈的功能,因为我在单片机程序中并没有添加任何的发送命令,通过pc经串口软件发送命令,也是会收到相应的反馈信息!
你逗我呢,你send()函数在while(1)里做环回发送呢,你串口接收中断里把收到的值给了DAT2,然后又在while(1)的send函数里把DAT2赋值给SUBF,那发送函数自动就把SUBF的值给发送出去了,你这就是个串口环回的程序呀。
抱歉我没有说清楚,send是最开始的程序,发现发送一个会回传两个后注释掉了,发现还是会有回传,谢谢
采纳率:54%
来自团队:
你用的是哪款单片机呢?把程序都贴上来看看
非常感谢您的回答!
为您推荐:
其他类似问题
冰酒的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 单片机rs 的文章

 

随机推荐