找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17001|回复: 28
打印 上一主题 下一主题
收起左侧

51单片机多机通信(主从机通信)问题

  [复制链接]
跳转到指定楼层
楼主
ID:69716 发表于 2014-11-30 20:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟初学单片机,跪求各位大神帮忙解答!!我最近弄了个单片机多机通信程序,具体暂时是一主一从。用串口助手显示主机地址发送没问题,从机接收到某一地址后正确反馈没问题。那么问题来了,当两机的TXD和RXD互连、共地之后,显示主从识别不成功(小弟我是以LED灯的亮灭判断的)。程序是从郭天祥那本书上面一模一样copy的。
已经纠结了一周,跪求各位大哥解救!万分感谢!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2014-11-30 23:38 来自手机 | 只看该作者
TXD和RX交叉连接
回复

使用道具 举报

板凳
ID:69716 发表于 2014-11-30 23:42 | 只看该作者

对的,是交叉互连的。可是还是不成功,请问你有什么建议吗?

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:66032 发表于 2014-12-1 09:01 | 只看该作者
要看你的I2C怎么写的, 才知道真正的问题在哪里

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:1 发表于 2014-12-1 09:14 来自手机 | 只看该作者
把程序贴出来看看
回复

使用道具 举报

6#
ID:69716 发表于 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);
                                }
回复

使用道具 举报

7#
ID:69716 发表于 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;
}
回复

使用道具 举报

8#
ID:69716 发表于 2014-12-1 16:15 | 只看该作者
admin 发表于 2014-12-1 09:14
把程序贴出来看看

程序已经贴出来了,麻烦帮忙看看谢谢啦~
回复

使用道具 举报

9#
ID:69716 发表于 2014-12-1 16:16 | 只看该作者
mqwu 发表于 2014-12-1 09:01
要看你的I2C怎么写的, 才知道真正的问题在哪里

程序已经贴出来了麻烦帮忙看看谢谢啦~
回复

使用道具 举报

10#
ID:69706 发表于 2014-12-7 14:13 | 只看该作者
学习一下!!!!!!!!!!!
回复

使用道具 举报

11#
ID:66032 发表于 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;
    }
}
回复

使用道具 举报

12#
ID:93787 发表于 2015-10-27 19:51 来自手机 | 只看该作者
嘿嘿,主机程序main中i没有定义。。。。
回复

使用道具 举报

13#
ID:93787 发表于 2015-10-27 19:53 | 只看该作者
mqwu 发表于 2014-12-17 15:46
楼主的程序看起来比较混乱, 今天我抽空给你写了一个, 我没有做硬件,也没有51的编译器,应该没问题, 主 ...


嘿嘿,主机程序main中i没有定义。。。。
回复

使用道具 举报

14#
ID:66032 发表于 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);
      }
    }
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

15#
ID:110401 发表于 2016-3-23 17:19 | 只看该作者
楼主,我也出现了类似的问题,你的解决了吗,求指导
回复

使用道具 举报

16#
ID:70774 发表于 2016-4-30 13:36 | 只看该作者
欧阳小渡 发表于 2016-3-23 17:19
楼主,我也出现了类似的问题,你的解决了吗,求指导

请问您解决了吗?我也在做这个,希望得到您的指导
回复

使用道具 举报

17#
ID:111634 发表于 2016-5-1 19:28 | 只看该作者
换一本书看看,郭天祥书没有全部仿真,个案有可能不能实现。张志良主编的“《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版”全部仿真,能演示,能观看,其中有双机串行通讯方式1、2、3,有电路有程序,你试试。
回复

使用道具 举报

18#
ID:111634 发表于 2016-5-1 19:29 | 只看该作者
郭天祥书没有全部仿真,个案有可能不能实现。
回复

使用道具 举报

19#
ID:111634 发表于 2016-5-1 19:29 | 只看该作者
换一本书看看,张志良主编的“《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版”全部仿真,能演示,能观看,其中有双机串行通讯方式1、2、3,有电路有程序,你试试。
回复

使用道具 举报

20#
ID:111634 发表于 2016-5-1 19:31 | 只看该作者
张志良主编的“《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版”有双机串行通讯方式1、2、3,全部仿真,能演示,能观看。
回复

使用道具 举报

21#
ID:188933 发表于 2017-5-4 14:04 | 只看该作者
void MasterSendStr(uchar *str)
{
while(*str!='\0')
  {
  SendByte(*str);
  str++;
  }
}
求助 请问这段函数是什么意思
回复

使用道具 举报

22#
ID:168308 发表于 2017-7-13 21:30 | 只看该作者
美猴王HLM 发表于 2017-5-4 14:04
void MasterSendStr(uchar *str)
{
while(*str!='\0')

送字符串
回复

使用道具 举报

23#
ID:47286 发表于 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. 真到需要分主从也不一定非郭老师那么写 你加一位地址 所有机器收到数据流就判断第一位地址是否呼叫自己 是自己就处理 不是自己就不动作 一样可以分出来
回复

使用道具 举报

24#
ID:277837 发表于 2018-3-10 19:21 | 只看该作者
都是大神,大神们有没有3个单片机的多机通讯啊
回复

使用道具 举报

25#
ID:158375 发表于 2018-3-12 15:29 | 只看该作者
2个、3个单片机和100个单片的多机通讯都一样的,关键是通讯协议要弄好。。。。。。
回复

使用道具 举报

26#
ID:675464 发表于 2019-12-29 12:21 | 只看该作者
楼主,您好,请问多机通信从机怎么应答
回复

使用道具 举报

27#
ID:384312 发表于 2019-12-29 18:56 | 只看该作者
应该TX接RX  RX接TX
回复

使用道具 举报

28#
ID:130230 发表于 2020-1-8 13:54 | 只看该作者
UART出问题大部分是RXTX接反了还有一部分是波特率弄错了。。
回复

使用道具 举报

29#
ID:599521 发表于 2021-3-9 20:33 | 只看该作者
SCON和PCON没有配置好就会这样
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表