找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19057|回復(fù): 28
打印 上一主題 下一主題
收起左側(cè)

51單片機多機通信(主從機通信)問題

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:69716 發(fā)表于 2014-11-30 20:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
小弟初學(xué)單片機,跪求各位大神幫忙解答!我最近弄了個單片機多機通信程序,具體暫時是一主一從。用串口助手顯示主機地址發(fā)送沒問題,從機接收到某一地址后正確反饋沒問題。那么問題來了,當(dāng)兩機的TXD和RXD互連、共地之后,顯示主從識別不成功(小弟我是以LED燈的亮滅判斷的)。程序是從郭天祥那本書上面一模一樣copy的。
已經(jīng)糾結(jié)了一周,跪求各位大哥解救!萬分感謝!

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2014-11-30 23:38 來自手機 | 只看該作者
TXD和RX交叉連接
回復(fù)

使用道具 舉報

板凳
ID:69716 發(fā)表于 2014-11-30 23:42 | 只看該作者

對的,是交叉互連的?墒沁是不成功,請問你有什么建議嗎?

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

地板
ID:66032 發(fā)表于 2014-12-1 09:01 | 只看該作者
要看你的I2C怎么寫的, 才知道真正的問題在哪里

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

5#
ID:1 發(fā)表于 2014-12-1 09:14 來自手機 | 只看該作者
把程序貼出來看看
回復(fù)

使用道具 舉報

6#
ID:69716 發(fā)表于 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;                         //成功標(biāo)志  
             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);
                                }
回復(fù)

使用道具 舉報

7#
ID:69716 發(fā)表于 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)                                                   //發(fā)送數(shù)據(jù)塊
{
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)                                                  //接收數(shù)據(jù)塊
{
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;
}
回復(fù)

使用道具 舉報

8#
ID:69716 發(fā)表于 2014-12-1 16:15 | 只看該作者
admin 發(fā)表于 2014-12-1 09:14
把程序貼出來看看

程序已經(jīng)貼出來了,麻煩幫忙看看謝謝啦~
回復(fù)

使用道具 舉報

9#
ID:69716 發(fā)表于 2014-12-1 16:16 | 只看該作者
mqwu 發(fā)表于 2014-12-1 09:01
要看你的I2C怎么寫的, 才知道真正的問題在哪里

程序已經(jīng)貼出來了麻煩幫忙看看謝謝啦~
回復(fù)

使用道具 舉報

10#
ID:69706 發(fā)表于 2014-12-7 14:13 | 只看該作者
學(xué)習(xí)一下。。。。。。。。。!
回復(fù)

使用道具 舉報

11#
ID:66032 發(fā)表于 2014-12-17 15:46 | 只看該作者
樓主的程序看起來比較混亂, 今天我抽空給你寫了一個, 我沒有做硬件,也沒有51的編譯器,應(yīng)該沒問題, 主機用查詢方式寫人, 用P1口顯示LED的狀態(tài),從機用中斷方式,用P1口顯示LED的狀態(tài), 如果同步就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;
    }
}
回復(fù)

使用道具 舉報

12#
ID:93787 發(fā)表于 2015-10-27 19:51 來自手機 | 只看該作者
嘿嘿,主機程序main中i沒有定義。。。。
回復(fù)

使用道具 舉報

13#
ID:93787 發(fā)表于 2015-10-27 19:53 | 只看該作者
mqwu 發(fā)表于 2014-12-17 15:46
樓主的程序看起來比較混亂, 今天我抽空給你寫了一個, 我沒有做硬件,也沒有51的編譯器,應(yīng)該沒問題, 主 ...


嘿嘿,主機程序main中i沒有定義。。。。
回復(fù)

使用道具 舉報

14#
ID:66032 發(fā)表于 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);
      }
    }
}

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

15#
ID:110401 發(fā)表于 2016-3-23 17:19 | 只看該作者
樓主,我也出現(xiàn)了類似的問題,你的解決了嗎,求指導(dǎo)
回復(fù)

使用道具 舉報

16#
ID:70774 發(fā)表于 2016-4-30 13:36 | 只看該作者
歐陽小渡 發(fā)表于 2016-3-23 17:19
樓主,我也出現(xiàn)了類似的問題,你的解決了嗎,求指導(dǎo)

請問您解決了嗎?我也在做這個,希望得到您的指導(dǎo)
回復(fù)

使用道具 舉報

17#
ID:111634 發(fā)表于 2016-5-1 19:28 | 只看該作者
換一本書看看,郭天祥書沒有全部仿真,個案有可能不能實現(xiàn)。張志良主編的“《單片機實驗實訓(xùn)100例》 ISBN 978-7-5124-1603-1,北航社出版”全部仿真,能演示,能觀看,其中有雙機串行通訊方式1、2、3,有電路有程序,你試試。
回復(fù)

使用道具 舉報

18#
ID:111634 發(fā)表于 2016-5-1 19:29 | 只看該作者
郭天祥書沒有全部仿真,個案有可能不能實現(xiàn)。
回復(fù)

使用道具 舉報

19#
ID:111634 發(fā)表于 2016-5-1 19:29 | 只看該作者
換一本書看看,張志良主編的“《單片機實驗實訓(xùn)100例》 ISBN 978-7-5124-1603-1,北航社出版”全部仿真,能演示,能觀看,其中有雙機串行通訊方式1、2、3,有電路有程序,你試試。
回復(fù)

使用道具 舉報

20#
ID:111634 發(fā)表于 2016-5-1 19:31 | 只看該作者
張志良主編的“《單片機實驗實訓(xùn)100例》 ISBN 978-7-5124-1603-1,北航社出版”有雙機串行通訊方式1、2、3,全部仿真,能演示,能觀看。
回復(fù)

使用道具 舉報

21#
ID:188933 發(fā)表于 2017-5-4 14:04 | 只看該作者
void MasterSendStr(uchar *str)
{
while(*str!='\0')
  {
  SendByte(*str);
  str++;
  }
}
求助 請問這段函數(shù)是什么意思
回復(fù)

使用道具 舉報

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

送字符串
回復(fù)

使用道具 舉報

23#
ID:47286 發(fā)表于 2017-7-13 23:06 | 只看該作者
你總共就倆機通訊還分什么主從啊 直接對著喊就完了 搞這么復(fù)雜 郭老師那意思是說一個完整的通訊程序應(yīng)該怎么寫 有呼叫 有應(yīng)答 有確認 但并不是每個程序都必須那么寫 你這么簡單的應(yīng)用自己又不是很熟練 出點問題還不夠找錯的呢

1. 你能分別給兩個片子下載程序 說明片子的通訊部分沒問題
2. RX-TX TX-RX GND-GND 這是TTL標(biāo)準(zhǔn)接法 照接就應(yīng)該不會有問題
3. 以上硬件排除 那就是軟件 你先寫個簡單的 每隔2s從任意一個向另外一個發(fā)一位16進制 程序前面定義個數(shù)組是要發(fā)送的內(nèi)容 0x01,0X02 0X03 另外一個機器不斷的判斷接收數(shù)據(jù) 然后 如果是0x01 亮1滅2 3 如果是0x02 滅1 3亮2 以此類推 這樣的程序夠簡單吧 能行 再往深了寫
4. 真到需要分主從也不一定非郭老師那么寫 你加一位地址 所有機器收到數(shù)據(jù)流就判斷第一位地址是否呼叫自己 是自己就處理 不是自己就不動作 一樣可以分出來
回復(fù)

使用道具 舉報

24#
ID:277837 發(fā)表于 2018-3-10 19:21 | 只看該作者
都是大神,大神們有沒有3個單片機的多機通訊啊
回復(fù)

使用道具 舉報

25#
ID:158375 發(fā)表于 2018-3-12 15:29 | 只看該作者
2個、3個單片機和100個單片的多機通訊都一樣的,關(guān)鍵是通訊協(xié)議要弄好。。。。。。
回復(fù)

使用道具 舉報

26#
ID:675464 發(fā)表于 2019-12-29 12:21 | 只看該作者
樓主,您好,請問多機通信從機怎么應(yīng)答
回復(fù)

使用道具 舉報

27#
ID:384312 發(fā)表于 2019-12-29 18:56 | 只看該作者
應(yīng)該TX接RX  RX接TX
回復(fù)

使用道具 舉報

28#
ID:130230 發(fā)表于 2020-1-8 13:54 | 只看該作者
UART出問題大部分是RXTX接反了還有一部分是波特率弄錯了。。
回復(fù)

使用道具 舉報

29#
ID:599521 發(fā)表于 2021-3-9 20:33 | 只看該作者
SCON和PCON沒有配置好就會這樣
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表