关于单片机的多机通信

这是我做的三个单片机的通信,一个主机,两个从机,现在的问题是,有一个可以正常通信,但是当我切换,需要通信另一块时,全都不行了,求教啊这是主机的程序
#include<reg52.h>
#include"stc12.h"
#define uchar unsigned char
#define uint unsigned int

#define addr1 0x31 //从机1地址
#define addr2 0x32 //从机2地址
sbit S1=P1^0;
sbit S2=P1^1;
sbit d1=P1^2;
sbit d2=P1^3;
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void ck_init()
{
SCON=0xf0;
BRT=0xe6;
AUXR=0x11;
TI=1;
RI=1;
ES=1;
EA=1;

}
uchar jieshou(void) //接收数据
{
uchar shuju;
shuju=SBUF;
while(!RI);
RI=0;
return shuju;
}
void fasong_dizhi(uchar dizhi) //发送地址
{
uchar temp;
while(temp!=dizhi) //如果主机发送的地址和从机应答的不一样的话,就一直发送
{
ES=0;
TB8=1;
SBUF=dizhi;
while(!TI);

TI=0;
ES=1;
temp=jieshou();
// if(temp==dizhi)
// break;

}
}
void fasong_shuju(uchar date) //发送数据
{
TB8=0;
SBUF=date;
while(!TI);
TI=0;
//置1表示发送的是数据

}
void main()
{
ck_init();
while(1)
{
if(S1==0)
{
delay(5);
if(S1==0)
{
while(!S1);
fasong_dizhi(addr1);
d1=0;
fasong_shuju('a');
fasong_shuju('a');
}
}
if(S2==0)
{
delay(5);
if(S2==0)
{
while(!S2);
fasong_dizhi(addr2);
ES=1;
d2=0;
fasong_shuju('b');
fasong_shuju('b');
}
}
}
}
void zd() interrupt 4
{
ES=0;
}
这是从机的程序,放不下了,麻烦大家去我的网盘看看,我怎么弄都不行http://pan.baidu.com/s/1dGUdS

描述一下硬件连接情况,是在同一组通讯线上还是分两组通讯线实现1主2从?
如果是通讯总线分挂从机,就要将从机的串口设置成空闲地址帧方式,地址帧使用两个停止位.让从机在空闲状态下对2个地址位相应,产生串口服务申请或者中断.被叫从机发现于自己地址一致就会应,并建立一个停止位的通讯连接.地址不一致的从机同时也收到了地址呼叫,只是因为不是自己而不再响应,直到下一个地址帧到来.如果是这样,请在从机硬件的TX,RX线上传接100欧姆电阻避免电流冲击.
如果是分两组通讯线,应该没有问题的.追问

我是把两个从机的TXD接一起,然后和主机的RXD连接,从机的RXD都接一起,和主机的TXD连接,这样应该是总线分挂从机吧?

追答

是的.总线模式.从机通讯线上最好加个电阻.同时,使用空闲地址帧模式实现多机通讯.原理上面已经说过了.

追问

是每条从机的TXD和RXD都加100欧姆吗,因为我是全部都连在一起了,还是只要加1个100欧姆就可以了,我线是这样接的,那电阻应该接在哪啊

追答

每个从机通讯线上加电阻.
测试软件时可以不加.长期使用最好加.

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答