单片机多机通信一主多从,下面是主机和从机的程序,请高手指点一下哪错了?
调试时主机程序走到发地址的地方就走不动了,不知怎么回事,
void Uart_Init(void)
{
TMOD=0x20; //定时器T1使用工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1; //开始计时
PCON=0x80; //SMOD=1;
SCON=0x90; //工作方式2,9位数据位,波特率9600bit/s,允许接收
TI=1;
RI=1;
}
void send_data(uchar ddata) //发送数据,但此处由于与从机的协议,禁止发送0xff
{
while(!TI); //等待发送完毕
TI=0; //软件复位TI
TB8=0; //发送数据帧
SBUF=ddata; //发送数据
// while(!TI);
}
uchar Receive(void) //接收数据程序
{
uchar Data;
while(!RI); //等待接受完毕
RI=0;
Data=SBUF; //接收数据
return Data;
}
void send_addr(uchar addr) //发送地址
{
uchar tem;
while(addr!=tem) //如果发送的地址与从机应答的地址不一样,则一直发送地址
{
//发送地址帧
SBUF=addr; //发送地址
while(!TI); //等待发送完毕
TI=0; //软件复位TI
tem=Receive();
}
}
void main()
{
LcdInitiate();
Uart_Init();
while(1)
{
TB8=1;
send_addr(addr1); //程序走到这就不走了
send_data(2);
Rce[1]=Receive(); //接收数据
display(Rce[1],0x03);
}
}
下面是从机程序
void Uart_Init(void)
{
TMOD=0x20; //定时器T1使用工作方式2
TH1=0xfd;
TH0=0xfd;
TR1=1; //开始计时
PCON=0x80; //SMOD=1;
SCON=0x90; //工作方式3,9位数据位,波特率9600bit/s,允许接收
TI=1;
RI=1;
}
void send(uchar Data) //发送数据程序
{
SBUF=Data;
while(!TI); //等待发送完毕
TI=0;
// while(!TI);
}
uchar recv_data(void) //接收数据
{
uchar date;
while(!RI); //等待接受完毕
RI=0;
if(RB8==1) //若当前接收为地址帧则返回0xff
return 0xff;
date=SBUF;
// while(!RI);
return date;
}
void write(uchar add1,uchar **,uchar a) //写设备信息
{
buf[0]=0xfe;
buf[1]=add1;
buf[2]=**;
buf[3]=a;
buf[4]=0xef;
}
void main()
{
uchar tem,Data;
Uart_Init();
while(1)
{
SM2=1; //只接收地址帧
//如果接收到的地址帧不是本机地址,则继续等待
do
{ led=0;
while(!RI);
RI=0;
tem=SBUF;
}while(tem!=addr);
TB8=0; //主机不检测该位
send(addr); //如果是本机地址,发送应答信号,并做好接受数据的准备
SM2=0; //允许接受数据信息
Data=recv_data(); //接收数据
switch(Data)
{
case 1:
send(1);break;
case 2:
send(2);break;
case 3:
send(3);break;
default:
break;
}
}
}
|