打印
[51单片机]

单片机多机通信的问题,请指教

[复制链接]
682|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiyishenlin|  楼主 | 2016-4-27 15:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机多机通信一主多从,下面是主机和从机的程序,请高手指点一下哪错了?
调试时主机程序走到发地址的地方就走不动了,不知怎么回事,
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;
                 }
   }
}


相关帖子

沙发
ywlzh| | 2016-4-29 12:58 | 只看该作者
自己看问题为什么不先分析一番?
单片机多机通信,一对一的双工模式调通了,能多字节的接受处理发送吗?
多机通信要确定一主多从,主机的TX连所有从机的RX,主机的RX连所有从机的TX,是这样的吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝