51单片机串口485通讯程序..docVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
51单片机串口485通讯程序.

/* 以下为单片机串口485通讯程序,从机程序(当然也适用于主机程序),主机发送可以先用串口帮手软件来调试,经过Keil uVision4实际测试,测试效果如结尾图片所示,?大 len = sizeof(dbuf),if(i =( __ERRLEN+1)) // 帧超长,错误,返回,就可以实现了,其中的原因自已体会吧 */ #ifndef __485_C__ #define __485_C__ #include reg51.h #include string.h #include stdio.h #include intrins.h #define uchar unsigned char #define uint unsigned int /* 通信命令 */ #define __ACTIVE_ 0x01 // 主机询问从机是否存在 #define __GETDATA_ 0x02 // 主机发送读设备请求 #define __OK_ 0x03 // 从机应答 #define __STATUS_ 0x04 // 从机发送设备状态信息 #define __MAXSIZE 0x08 // 缓冲区长度 #define __ERRLEN 12 // 任何通信帧长度超过12则表示出错 //uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息 uchar dbuf[__MAXSIZE];//={0,1,2,3,4,5,6,7}; // 该缓冲区用于保存设备状态信息 uchar dev; // 该字节用于保存本机设备号 sbit M_DE = P1^0; // 驱动器使能,1有效 sbit M_RE = P1^1; // 接收器使能,0有效 void get_status(); // 调用该函数获得设备状态信息,函数代码未给出 void send_data(uchar type, uchar len, uchar *buf); // 发送数据帧 bit recv_cmd(uchar *type); // 接收主机命令,主机请求仅包含命令信息 void send_byte(uchar da); // 该函数发送一帧数据中的一个字节,由send_data()函数调用 void main() { uchar type; uchar len; /* 系统初始化 */ P1 = 0xff; // 读取本机设备号 //dev = (P12); dev = 0x01; TMOD = 0x20; // 定时器T1使用工作方式2 TH1 = 250; // 设置初值 TL1 = 250; TR1 = 1; // 开始计时 PCON = 0x80; // SMOD = 1 SCON = 0x50; // 工作方式1,波特率9600bps,允许接收 ES = 0; // 关闭串口中断 //IT0 = 0; // 外部中断0使用电平触发模式 //EX0 = 1; // 开启外部中断0 EA = 1; // 开启中断 /* 主程序流程 */ while(1) // 主循环 { if(recv_cmd(type) == 0) // 发生帧错误或帧地址与本机地址不符,丢弃当前帧后返回 continue; switch(type) { case __ACTIVE_: // 主机询问从机是否存在 send_data(__OK_, 0, dbuf); // 发送应答信息,这里buf的内容并未用到 break; case __GETDATA_: // len = strlen(dbuf);//在C51中不能这个函数计算unsigned char型,这个函数只能计算char型 len = sizeof(dbuf); // len =0x08; send_data(__STATUS_, len, dbuf); // 发送设备状态信息 break; default: break; // 命令类型错误,丢弃当前帧后返回 } } } void READSTATUS() interrupt 0 using 1 // 产生外部中断0时表示设备状态发生改变,该函数使用寄存器组1 { get_status(); // 获得设备状态信息,并将其存入dbuf指向的存储区,数据最后一字节置0表示数据结束 } /* 该函数接收一帧数据并进行检测,无论该帧是

文档评论(0)

gangshou + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档