求助高手帮忙看一下单片机双机通信的问题

[复制链接]
 楼主| guo9322 发表于 2007-8-25 14:41 | 显示全部楼层 |阅读模式
照课本上的例子写的,看了感觉没问题,编译也能通过,下载到单片机上就是不好用.找了很长时间也找不出毛病。<br />B机(接收)程序:<br />#include&nbsp;&ltreg51.h&gt<br />#include&nbsp;&quot;intrins.h&quot;<br />#define&nbsp;uchar&nbsp;unsigned&nbsp;char<br />#define&nbsp;uint&nbsp;unsigned&nbsp;int<br />#define&nbsp;ulong&nbsp;unsigned&nbsp;long<br />uchar&nbsp;idata&nbsp;buf[1];<br />uint&nbsp;pf;<br />void&nbsp;init1(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//串口初始化//<br />{&nbsp;TMOD=0x20;<br />&nbsp;&nbsp;TH1=0xe8;<br />&nbsp;&nbsp;TL1=0xe8;<br />&nbsp;&nbsp;PCON=0x00;<br />&nbsp;&nbsp;TR1=1;<br />&nbsp;&nbsp;SCON=0x50;<br />}<br />void&nbsp;receive(uchar&nbsp;idata&nbsp;*d)<br />{&nbsp;&nbsp;uchar&nbsp;i;<br />&nbsp;&nbsp;&nbsp;do<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;while(RI==0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RI=0;<br />&nbsp;&nbsp;&nbsp;}while((SBUF^0xaa)!=0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//判断A机发送请求//<br />&nbsp;&nbsp;&nbsp;SBUF=0xbb;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发应答信号//<br />&nbsp;&nbsp;&nbsp;while(TI==0);&nbsp;<br />&nbsp;&nbsp;&nbsp;TI=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;pf=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt16;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;while(RI==0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RI=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d=SBUF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//接收数据//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pf+=d;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//求校验和//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(RI==0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RI=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((SBUF^pf)==0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//比较校验和//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;SBUF=0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;SBUF=0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//出错发FF&nbsp;重新接收//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(TI==0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TI=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />}<br />void&nbsp;main()<br />{&nbsp;init1();<br />&nbsp;&nbsp;receive(buf);<br />&nbsp;&nbsp;&nbsp;}<br />A机(发送)程序:<br />#include&nbsp;&ltreg51.h&gt<br />#include&nbsp;&ltabsacc.h&gt<br />#include&nbsp;&quot;intrins.h&quot;<br />#define&nbsp;uchar&nbsp;unsigned&nbsp;char<br />#define&nbsp;uint&nbsp;unsigned&nbsp;int&nbsp;<br />uchar&nbsp;idata&nbsp;buf[1]={0x35};<br />uchar&nbsp;ab=0;<br />uint&nbsp;pf;<br />uchar&nbsp;a,m,p;<br />void&nbsp;init1(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//串口初始化//<br />{&nbsp;TMOD=0x20;<br />&nbsp;&nbsp;TH1=0xe8;<br />&nbsp;&nbsp;TL1=0xe8;<br />&nbsp;&nbsp;PCON=0x00;<br />&nbsp;&nbsp;TR1=1;<br />&nbsp;&nbsp;SCON=0x50;<br />}<br />void&nbsp;send(uchar&nbsp;idata&nbsp;*d)<br />{&nbsp;&nbsp;uchar&nbsp;i;<br />&nbsp;&nbsp;&nbsp;do<br />&nbsp;&nbsp;&nbsp;{&nbsp;SBUF=0xaa;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送联络信号//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(TI==0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//等待发送成功//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TI=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(RI==0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//等待B机//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RI=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}while((SBUF^0xbb)!=0);&nbsp;&nbsp;&nbsp;//B机未准备好,继续联络//<br />&nbsp;&nbsp;&nbsp;&nbsp;do<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;pf=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt16;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;SBUF=d;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送数据//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pf+=d;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(TI==0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TI=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SBUF=pf;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送校验和//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(TI==0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TI=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(RI==0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RI=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}while(SBUF!=0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//B机回答出错则重发//<br />}<br />void&nbsp;main(void)<br />{&nbsp;init1();<br />&nbsp;&nbsp;&nbsp;send(buf);<br />}<br />
sjiton 发表于 2007-8-26 17:49 | 显示全部楼层

经验

程序我没有仔细看&nbsp;<br /><br />一般来讲问题可能不在程序,而可能是<br />1:交叉线连接错误。<br />2;&nbsp;232芯片由于带电操作已经坏了。<br /><br />
 楼主| guo9322 发表于 2007-8-27 09:52 | 显示全部楼层

我是近距离的,不需要rs232吧??

两片单片机离得很近的,没超过1m
dafei 发表于 2007-8-31 11:49 | 显示全部楼层

通信握手的问题

通信握手的逻辑太脆弱了,要不就加强,要不就不要握手了。<br /><br />比如:A机发0xAA的时候,如果B机还每初始化好,肯定握不上了,死循环。<br />如果,B机SBUF里有上次的数,则认为收到的握手信号不是0xAA,死循环。<br />如果,A机SBUF里有上次的数,收到的应答信号不是0xBB,死循环。
wenbinjj 发表于 2007-9-4 12:04 | 显示全部楼层

那本书是垃圾

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

33

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

13

主题

33

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部