标题: 51单片机多机通信(主从机通信)问题 [打印本页]

作者: 江湖人称好人    时间: 2014-11-30 20:30
标题: 51单片机多机通信(主从机通信)问题
小弟初学单片机,跪求各位大神帮忙解答!!我最近弄了个单片机多机通信程序,具体暂时是一主一从。用串口助手显示主机地址发送没问题,从机接收到某一地址后正确反馈没问题。那么问题来了,当两机的TXD和RXD互连、共地之后,显示主从识别不成功(小弟我是以LED灯的亮灭判断的)。程序是从郭天祥那本书上面一模一样copy的。
已经纠结了一周,跪求各位大哥解救!万分感谢!


作者: admin    时间: 2014-11-30 23:38
TXD和RX交叉连接
作者: 江湖人称好人    时间: 2014-11-30 23:42
admin 发表于 2014-11-30 23:38
TXD和RX交叉连接

对的,是交叉互连的。可是还是不成功,请问你有什么建议吗?
作者: mqwu    时间: 2014-12-1 09:01
要看你的I2C怎么写的, 才知道真正的问题在哪里
作者: admin    时间: 2014-12-1 09:14
把程序贴出来看看
作者: 江湖人称好人    时间: 2014-12-1 16:14
主机程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define Slave 0x02
#define BN 16
sbit liang=P1^0;                          
uchar rbuf[16];
uchar code tbuf[16]={"master transmit"};
void err(void)
{
SBUF=0xff;
while(TI!=1);
      TI=0;
}

uchar master(uchar addr,uchar command)
{  
   uchar aa,i,p;                                                         
   while(1)
   {
    SBUF=Slave;
        while(TI!=1);
          TI=0;       
        while(RI!=1);
          RI=0;
        if(SBUF!=addr)
        err();       
        else                                         //以上配对成功
        {         liang=0;                         //成功标志  
             TB8=0;                                  
                 SBUF=command;
                 while(TI!=1);
                       TI=0;
             while(RI!=1);
               RI=0;
                aa=SBUF;
                if((aa&0x08)==0x08)
                           {
                               TB8=1;
                                   err();
                           }
                           else
                           {
                               if(command==0x01)
                                   {
                                   if((aa&0x01)==0x01)
                                   {
                                       do
                                         {
                                           p=0;
                                           for(i=0;i<BN;i++)
                                           {
                                           SBUF=tbuf[i];
                                           p+=tbuf[i];
                                           while(TI!=1);
                                     TI=0;         
                                          }
                                          SBUF=p;
                                          while(TI!=1);
                                     TI=0;
                           while(RI!=1);
                             RI=0;
                                           }       
                                           while(SBUF!=0);
                                           TB8=1;
                                           return(0);
                                        }
                                    else
                                             {
                                                 if((aa&0x02)==0x02)
                                                     {
                                                         while(1);
                                                        {  
                                                         p=0;
                                                         for(i=0;i<BN;i++)
                                                         {while(RI!=1);
                                                                RI=0;
                                                         rbuf[i]=SBUF;
                                                         p+=rbuf[i];
                                                         }
                                                         while(RI!=1);
                                                               RI=0;
                                                         
                                                         if(SBUF==P)
                                                            {SBUF=0x00;
                                                                while(TI!=1);
                                                                      TI=0;
                                                                          break;
                                                                }
                                                                else
                                                                {SBUF=0xff;
                                                                while(TI!=0);
                                                                TI=0;
                                                                }
                                                                }
                                                                TB8=1;
                                                                return(0);
                                                                }
                                                        }
                                                }
                                             }
                                                 liang=0;
                                          }
                                 }
                         }
             void main()
                 {               
                            TMOD=0x20;
                                TL1=0xfd;
                                TH1=0xfd;
                                PCON=0x00;
                                TR1=1;
                                SCON=0xf8;                               
                                master(Slave,0x01);
                                master(Slave,0x02);                                                       
                                while(1);
                                }
作者: 江湖人称好人    时间: 2014-12-1 16:15
从机程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define Slave 0x02
#define BN 16
uchar trbuf[16];
uchar rebuf[16];  
bit TRDY;
bit RRDY;

void str(void);
void sre(void);
void main(void)
{
TMOD=0X20;
TL1=0xfd;
TH1=0xfd;
PCON=0x00;
TR1=1;
SCON=0xf0;
ES=1;
EA=1;
while(1)
{
TRDY=1;
RRDY=1;
}
}
void ssio()interrupt 4       
{
uchar a;
RI=0;
ES=0;
if(SBUF!=Slave)
{
ES=1;
goto reti;
}
SM2=0;
SBUF=Slave;                               
while(TI!=1);
      TI=0;
while(RI!=1);
      RI=0;
if(RB8==1)                       
{
SM2=1;
ES=1;
goto reti;
}
a=SBUF;
if(a==0x01)
{
if(RRDY==1)
SBUF=0x01;
else
SBUF=0x00;
while(TI!=1);
TI=0;
while(RI!=1);
RI=0;
if(RB8==1)
{
SM2=1;
ES=1;
goto reti;
}
sre();
}
else
{
if(a==0x02)
{
if(TRDY==1)
SBUF=0x02;
else
SBUF=0X00;
while(TI!=1);
TI=0;
while(RI!=1);
RI=0;
if(RB8==1)
{
SM2=1;
ES=1;
goto reti;
}
str();
}
else
{
SBUF=0x80;
while(TI!=1);
TI=0;
SM2=1;
ES=1;
}
}
reti:;
}
void str(void)                                                   //发送数据块
{
uchar p,i;
TRDY=0;
do
{
p=0;
for(i=0;i<BN;i++)
{
SBUF=trbuf[i];
p+=trbuf[i];
while(TI!=1);
TI=0;
}
SBUF=p;
while(TI!=1);
TI=0;
while(RI!=1);
RI=0;
}
while(SBUF!=0);
SM2=1;
ES=1;
}
void sre(void)                                                  //接收数据块
{
uchar p,i=0;
RRDY=0;
while(1)
{
p=0;
for(i=0;i<BN;i++)
{
while(RI!=1);
RI=0;
rebuf[i]=SBUF;
p+=rebuf[i];
}
while(RI!=1);
RI=0;
if(SBUF==p)
{
SBUF=0x00;
break;
}
else
{
SBUF=0xff;
while(TI==0);
TI=0;
}
}
SM2=1;
ES=1;
}
作者: 江湖人称好人    时间: 2014-12-1 16:15
admin 发表于 2014-12-1 09:14
把程序贴出来看看

程序已经贴出来了,麻烦帮忙看看谢谢啦~
作者: 江湖人称好人    时间: 2014-12-1 16:16
mqwu 发表于 2014-12-1 09:01
要看你的I2C怎么写的, 才知道真正的问题在哪里

程序已经贴出来了麻烦帮忙看看谢谢啦~
作者: 风缘    时间: 2014-12-7 14:13
学习一下!!!!!!!!!!!
作者: mqwu    时间: 2014-12-17 15:46
楼主的程序看起来比较混乱, 今天我抽空给你写了一个, 我没有做硬件,也没有51的编译器,应该没问题, 主机用查询方式写人, 用P1口显示LED的状态,从机用中断方式,用P1口显示LED的状态, 如果同步就OK。
//*****Master SourceCode for Uart******//
#include <reg52.h>
#define uchar  unsigned char
#define uint    unsigned int

const uchar LEDcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void delay_ms(uint t)
{
  uint m,n;
  for (m=0;m<t;m++)
   for (n=0;n<1000;n++);

}
void MasterUART_init(void)
{
    SCON = 0x50;
    TMOD = 0x20;
    TH1  = 0xFD;
    TL1  = 0xFD;
    TR1  = 1;
//    ES   = 1;
//    EA   = 1;
}

void MasterSendByte(uchar udat)
{
SBUF = udat;
while(!TI);
      TI = 0;
}


void MasterSendStr(uchar *str)
{
while(*str!='\0')
  {
  SendByte(*str);
  str++;
  }
}


main()
{
    MasterUART_init();
    while(1)
    {
      for(i=0;i<8; i++)
      {
         MasterSendByte(LEDcode[i]);
         P1=LEDcode[i];
         delay_ms(1000);
      }
    }
}


//*******Slave_source code for Uart******//
#include <reg52.h>
#define uchar  unsigned char
#define uint    unsigned int


void delay_ms(uint t)
{
  uint m,n;
  for (m=0;m<t;m++)
   for (n=0;n<1000;n++);

}
void SlaveUART_init(void)
{
    SCON = 0x50;
    TMOD = 0x20;
    TH1  = 0xFD;
    TL1  = 0xFD;
    TR1  = 1;
    ES   = 1;
    EA   = 1;
}


main()
{
    SlaveUART_init();
    while(1);
}


void interrupt_uart() interrupt 4
{
   uchar temp;

    if(TI)
    {
        TI = 0;
        REN = 1;
    }
    if(RI)
    {
        RI = 0;
        temp = SBUF;
        P1=temp;
        REN  = 0;
    }
}

作者: 长风电子    时间: 2015-10-27 19:51
嘿嘿,主机程序main中i没有定义。。。。
作者: 长风电子    时间: 2015-10-27 19:53
mqwu 发表于 2014-12-17 15:46
楼主的程序看起来比较混乱, 今天我抽空给你写了一个, 我没有做硬件,也没有51的编译器,应该没问题, 主 ...


嘿嘿,主机程序main中i没有定义。。。。
作者: mqwu    时间: 2015-10-29 11:14
Exactly. You are correct. Thank you very much. modifing as following
main()
{
   uchar i;
    MasterUART_init();
    while(1)
    {
      for(i=0;i<8; i++)
      {
         MasterSendByte(LEDcode[i]);
         P1=LEDcode[i];
         delay_ms(1000);
      }
    }
}
作者: 欧阳小渡    时间: 2016-3-23 17:19
楼主,我也出现了类似的问题,你的解决了吗,求指导
作者: zxzqrtf    时间: 2016-4-30 13:36
欧阳小渡 发表于 2016-3-23 17:19
楼主,我也出现了类似的问题,你的解决了吗,求指导

请问您解决了吗?我也在做这个,希望得到您的指导
作者: zl2168    时间: 2016-5-1 19:28
换一本书看看,郭天祥书没有全部仿真,个案有可能不能实现。张志良主编的“《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版”全部仿真,能演示,能观看,其中有双机串行通讯方式1、2、3,有电路有程序,你试试。
作者: zl2168    时间: 2016-5-1 19:29
郭天祥书没有全部仿真,个案有可能不能实现。
作者: zl2168    时间: 2016-5-1 19:29
换一本书看看,张志良主编的“《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版”全部仿真,能演示,能观看,其中有双机串行通讯方式1、2、3,有电路有程序,你试试。
作者: zl2168    时间: 2016-5-1 19:31
张志良主编的“《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版”有双机串行通讯方式1、2、3,全部仿真,能演示,能观看。
作者: 美猴王HLM    时间: 2017-5-4 14:04
void MasterSendStr(uchar *str)
{
while(*str!='\0')
  {
  SendByte(*str);
  str++;
  }
}
求助 请问这段函数是什么意思
作者: 489484    时间: 2017-7-13 21:30
美猴王HLM 发表于 2017-5-4 14:04
void MasterSendStr(uchar *str)
{
while(*str!='\0')

送字符串
作者: dzbj    时间: 2017-7-13 23:06
你总共就俩机通讯还分什么主从啊 直接对着喊就完了 搞这么复杂 郭老师那意思是说一个完整的通讯程序应该怎么写 有呼叫 有应答 有确认 但并不是每个程序都必须那么写 你这么简单的应用自己又不是很熟练 出点问题还不够找错的呢

1. 你能分别给两个片子下载程序 说明片子的通讯部分没问题
2. RX-TX TX-RX GND-GND 这是TTL标准接法 照接就应该不会有问题
3. 以上硬件排除 那就是软件 你先写个简单的 每隔2s从任意一个向另外一个发一位16进制 程序前面定义个数组是要发送的内容 0x01,0X02 0X03 另外一个机器不断的判断接收数据 然后 如果是0x01 亮1灭2 3 如果是0x02 灭1 3亮2 以此类推 这样的程序够简单吧 能行 再往深了写
4. 真到需要分主从也不一定非郭老师那么写 你加一位地址 所有机器收到数据流就判断第一位地址是否呼叫自己 是自己就处理 不是自己就不动作 一样可以分出来
作者: 17346    时间: 2018-3-10 19:21
都是大神,大神们有没有3个单片机的多机通讯啊
作者: 笨笨兔    时间: 2018-3-12 15:29
2个、3个单片机和100个单片的多机通讯都一样的,关键是通讯协议要弄好。。。。。。

作者: 有理想    时间: 2019-12-29 12:21
楼主,您好,请问多机通信从机怎么应答
作者: 东111    时间: 2019-12-29 18:56
应该TX接RX  RX接TX
作者: jizhongbiao    时间: 2020-1-8 13:54
UART出问题大部分是RXTX接反了还有一部分是波特率弄错了。。
作者: chuqianyiding01    时间: 2021-3-9 20:33
SCON和PCON没有配置好就会这样




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1