- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PC机与多个51单片机串口通讯
PC机与多个51单片机串口通讯最近需要用PC机与多个51单片机通过RS232进行通讯。在多机通讯中,要保证主机与所选择的从机实现可靠的通信,必须保证串口具有识别的功能。在串行口控制寄存器SCON中有一位叫做SM2,就是为了多机通讯而设置的控制位。多机通讯的过程可以如下:1 首先从机初始化,开中断,让其以方式2或3接收(9位异步通讯方式),置位SM2,REN位,允许接收,那么当SM2=1的时候,只有当接收到的第9位数据(RB8)等于1(接收到的为地址帧)的时候,前8位数据送入接收SBUF,置位RI,产生中断。如果接收到的第9位数据位0,则将接收到的数据帧丢弃。2 此时主机可以先将从机地址发送给各个从机系统,各个从机的串口接收到第9位数据RB8为1,由于SM2=1,置位RI,各个从机相应中断,在中断服务程序中判断主机送来的地址是否与本机地址相符合(这个地址是由软件编写人员自行设定的),若相符,则清零SM2,准备接收数据。若不符,则保持SM2=1. 3 第三步主机开始发送数据帧,此时前面地址相符合的从机,SM2=0,主机发送的数据RB8=0,这样只有SM2=0的相符的从机可以产生接收数据中断,激活中断标志位RI,进入中断服务程序,去接收数据。其他的从机因SM2=1,又RB8=0,不能激活中断标志RI,不能进入中断,则把接收到的数据丢失不做处理。从而保证了这个数据通信的正确性。上面这个过程就是51单片机通过串行口进行多机通讯的完整过程。但是现在我需要PC机与多个51单片机进行通讯,而PC机上面是无法实现这个RB8的设置,因为我是用串口调试助手来调试程序。那么我所幸不用上面的多机通信的方法。而是自己来规定一个一个信息头,一个信息尾。比如F0,A5,然后跟着地址信息。之所以加这么一个信息头,是为了防止数据与地址的值相同,造成从机误接收。这个信息头设置的越复杂一些,避免误接收的效果就越好,这是很简单的道理。这样只有从机接收到这个代表地址信息的信息头,而且后面跟着的地址与自己的地址相符合,才跳转到接受数据的程序段。而其他从机则是不断的在接收这些数据,无论是地址,还是数据,但是全部丢弃他们。这样就从软件上解决了这个PC机与多个51单片机多机通讯调试程序时的一个缺陷。当然可以考虑自己通过VC编写一个小的上位机软件,来处理这个事情,不知道微软的API是否也有这个RB8的机制,自己才疏学浅,并不知晓。下面将自己编写的简单程序段放在这里,方便日后参考:viewplaincopy to clipboardprint?#include reg52.h #define uchar unsigned char #define uint unsignedint#define __MAX_LEN_ 64 sbit FMQ=P3^7; ucharaddr,s=0,i=0,tmp=0xff; ucharbuf[__MAX_LEN_]; voidinit_serial() { TMOD = 0x20; TH1 = 250; TL1 = 250; TR1 = 1; PCON = 0x80; SCON = 0xd0; } void delay(uint k) { uinti,j; for(i=0;ik;i++) for(j=0;j110;j++); } voidBeep_ok() { FMQ=0; delay(200); FMQ=1; delay(200); FMQ=0; delay(200); FMQ=1; delay(200); } voidBeep_Addr_OK() { FMQ=0; delay(1000); FMQ=1; } ucharrec_uart(uchar *buf) { uchar DATA; RI = 0; while(!RI); DATA=SBUF; P2 = 0xff; addr = P2; if(DATA==addr) return 0xfe; buf[s] = SBUF; s++; if(s==__MAX_LEN_) { s=0; } P0=SBUF; Beep_ok(); return 0xff; } void main() { init_serial(); EA = 0; while
文档评论(0)