找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

新人想用51單片機(jī)做多機(jī)通信,麻煩大佬指點(diǎn)程序設(shè)計(jì)思路

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:494868 發(fā)表于 2019-4-3 20:29 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
100黑幣
我想以主機(jī)作為母體,每加入一個(gè)新的從機(jī),主機(jī)都能掃描到并賦予一個(gè)新的地址,然后在主機(jī)上可以控制新的從機(jī)(一號(hào))。在一號(hào)從機(jī)上能夠繼續(xù)加入新的從機(jī),無(wú)論是串聯(lián)狀還是發(fā)散狀,都能由主機(jī)來(lái)控制,而不是直接連接到主機(jī)。請(qǐng)問大佬該怎么編寫代碼?或者提示一下思路。謝謝了!

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:123289 發(fā)表于 2019-4-4 12:58 | 只看該作者
先做好通訊主從之的通訊協(xié)議,協(xié)議說得通就行,不難。
回復(fù)

使用道具 舉報(bào)

板凳
ID:504761 發(fā)表于 2019-4-4 13:56 | 只看該作者
用IIC總線來(lái)搞
回復(fù)

使用道具 舉報(bào)

地板
ID:494868 發(fā)表于 2019-4-4 14:40 | 只看該作者
yzwzfyz 發(fā)表于 2019-4-4 12:58
先做好通訊主從之的通訊協(xié)議,協(xié)議說得通就行,不難。

謝謝提點(diǎn)
回復(fù)

使用道具 舉報(bào)

5#
ID:494868 發(fā)表于 2019-4-4 14:41 | 只看該作者

謝謝提點(diǎn)
回復(fù)

使用道具 舉報(bào)

6#
ID:387856 發(fā)表于 2019-4-4 18:28 | 只看該作者
起始碼+地址碼+數(shù)據(jù)碼+結(jié)束碼,這些碼的位數(shù)和高低電平的脈沖時(shí)間可以自己定義
回復(fù)

使用道具 舉報(bào)

7#
ID:366559 發(fā)表于 2019-4-5 10:40 | 只看該作者
USB接口不就是這樣的嗎,去看一下USB2.0協(xié)議(全速,簡(jiǎn)化版,完整版太長(zhǎng)了),學(xué)習(xí)一下
I2C總線的話,大部分單片機(jī)只有一個(gè)接口,難以實(shí)現(xiàn)級(jí)聯(lián)
回復(fù)

使用道具 舉報(bào)

8#
ID:471632 發(fā)表于 2019-4-5 11:23 | 只看該作者
如果通過以太網(wǎng)進(jìn)行主從通信呢?比如pc服務(wù)器控制幾十臺(tái)或上百臺(tái)51進(jìn)行工作,這樣的環(huán)境有做過的嗎?
回復(fù)

使用道具 舉報(bào)

9#
ID:476644 發(fā)表于 2019-4-5 15:03 | 只看該作者
/******************************************************************************************* *  標(biāo)題:                  RS485通信試驗(yàn)(接收與發(fā)送)                                         * *                                                                                                                                                                        * *  1.通過本例程了解串口的基本原理及使用 ,理解并掌握對(duì)串口進(jìn)行初始化                                        * *                                                                                                                                                                            * *  2.Baud 19200、數(shù)據(jù)位8、停止位1、效驗(yàn)位無(wú) 兩臺(tái)485設(shè)備  a機(jī)發(fā) b機(jī)收                                        * *                                                                                                                                                                               * *  說明:                                                                                                                                                             * *    使用兩個(gè)帶有485功能硬件設(shè)備(例如:兩個(gè)帶485的開發(fā)箱等) 每個(gè)設(shè)備都有信號(hào)端A和B,通過導(dǎo)線        * *         分別連接兩臺(tái)設(shè)備 A 連 A  B 連 B  排線連接參考圖片                                                                                * *  現(xiàn)象:按A機(jī)的獨(dú)立按鈕 在B機(jī)的LED等顯示其狀態(tài) 對(duì)應(yīng)位的LED燈亮                                                            * *  注意:18B20 請(qǐng)卸下,否則會(huì)影響RS485                                                             * * 請(qǐng)學(xué)員認(rèn)真消化本例程,學(xué)會(huì)用C語(yǔ)言操作串口和485的實(shí)現(xiàn)簡(jiǎn)單收發(fā)功能                                 * *********************************************************************************************/  #include <REG52.H> #include <stdio.h>  sbit RS485E=P3^7;   //定義485的使能腳  /**************************************             延時(shí)程序 **************************************/ void delay(unsigned char i) {         unsigned char j;         for(i; i > 0; i--)                 for(j = 200; j > 0; j--); }   void main (void) {           SCON = 0x50;      //REN=1允許串行接受狀態(tài),串口工作模式1                                           TMOD|= 0x20;      //定時(shí)器工作方式2                                     PCON|= 0x80;                                                                                            TH1  = 0xFD;     //baud*2  /* reload value 19200、數(shù)據(jù)位8、停止位1。效驗(yàn)位無(wú)                                            TR1  = 1;                                                                              ES   = 1;        //開串口中斷                                   EA   = 1;        // 開總中斷                     while(1)     {                     if (P0 != 0XFF)    // max485(半雙工通信) RE/DE定義 RE=0為接受狀態(tài)  DE=1為發(fā)送狀態(tài)(參考MAX485芯片管腳)              {                  RS485E=1;           //                    RS5485E=0為接收狀態(tài)  RS5485E=1為發(fā)送狀態(tài)               SBUF=P0;           //發(fā)送數(shù)據(jù)                   delay(40);        }   }   }
回復(fù)

使用道具 舉報(bào)

10#
ID:476644 發(fā)表于 2019-4-5 15:04 | 只看該作者
/*******************************************************************************************
*  標(biāo)題:                  RS485通信試驗(yàn)(接收與發(fā)送)                                         *
*                                                                                                                                                                        *
*  1.通過本例程了解串口的基本原理及使用 ,理解并掌握對(duì)串口進(jìn)行初始化                                        *
*                                                                                                                                                                            *
*  2.Baud 19200、數(shù)據(jù)位8、停止位1、效驗(yàn)位無(wú) 兩臺(tái)485設(shè)備  a機(jī)發(fā) b機(jī)收                                        *
*                                                                                                                                                                               *
*  說明:                                                                                                                                                             *
*    使用兩個(gè)帶有485功能硬件設(shè)備(例如:兩個(gè)帶485的開發(fā)箱等) 每個(gè)設(shè)備都有信號(hào)端A和B,通過導(dǎo)線        *
*         分別連接兩臺(tái)設(shè)備 A 連 A  B 連 B  排線連接參考圖片                                                                                *
*  現(xiàn)象:按A機(jī)的獨(dú)立按鈕 在B機(jī)的LED等顯示其狀態(tài) 對(duì)應(yīng)位的LED燈亮                                                            *
*  注意:18B20 請(qǐng)卸下,否則會(huì)影響RS485                                                             *
* 請(qǐng)學(xué)員認(rèn)真消化本例程,學(xué)會(huì)用C語(yǔ)言操作串口和485的實(shí)現(xiàn)簡(jiǎn)單收發(fā)功能                                 *
*********************************************************************************************/

#include <REG52.H>
#include <stdio.h>

sbit RS485E=P3^7;   //定義485的使能腳

/**************************************
            延時(shí)程序
**************************************/
void delay(unsigned char i)
{
        unsigned char j;
        for(i; i > 0; i--)
                for(j = 200; j > 0; j--);
}


void main (void) {


        SCON = 0x50;      //REN=1允許串行接受狀態(tài),串口工作模式1                             
            TMOD|= 0x20;      //定時(shí)器工作方式2                    
                PCON|= 0x80;                                                         
               
                TH1  = 0xFD;     //baud*2  /* reload value 19200、數(shù)據(jù)位8、停止位1。效驗(yàn)位無(wú)         
               
                TR1  = 1;                                                            
                ES   = 1;        //開串口中斷                  
                EA   = 1;        // 開總中斷
       

        while(1)
    {
       
          if (P0 != 0XFF)    // max485(半雙工通信) RE/DE定義 RE=0為接受狀態(tài)  DE=1為發(fā)送狀態(tài)(參考MAX485芯片管腳)
             {   
              RS485E=1;           //                    RS5485E=0為接收狀態(tài)  RS5485E=1為發(fā)送狀態(tài)
              SBUF=P0;           //發(fā)送數(shù)據(jù)
                  delay(40);
       }

}

}













/*******************************************************************************************
*  標(biāo)題:                  RS485通信試驗(yàn)(接收與發(fā)送)                                         *
*                                                                                                                                                                        *
*  1.通過本例程了解串口的基本原理及使用 ,理解并掌握對(duì)串口進(jìn)行初始化                                        *
*                                                                                                                                                                            *
*  2.Baud 19200、數(shù)據(jù)位8、停止位1、效驗(yàn)位無(wú) 兩臺(tái)485設(shè)備  a機(jī)發(fā) b機(jī)收                                        *
*                                                                                                                                                                               *
*  說明:                                                                                                                                                             *
*    使用兩個(gè)帶有485功能硬件設(shè)備(例如:兩個(gè)帶485的開發(fā)箱等) 每個(gè)設(shè)備都有信號(hào)端A和B,通過導(dǎo)線        *
*         分別連接兩臺(tái)設(shè)備 A 連 A  B 連 B  排線連接參考圖片                                                                            *
*  現(xiàn)象:按A機(jī)的獨(dú)立按鈕 在B機(jī)的LED等顯示其狀態(tài) 對(duì)應(yīng)位的LED燈亮                                                            *
*  注意:18B20 請(qǐng)卸下,否則會(huì)影響RS485                                                          *
* 請(qǐng)學(xué)員認(rèn)真消化本例程,學(xué)會(huì)用C語(yǔ)言操作串口和485的實(shí)現(xiàn)簡(jiǎn)單收發(fā)功能                                 *
*********************************************************************************************/

#include <REG52.H>
#include <stdio.h>

sbit RS485E=P3^7;   //定義485的使能腳
unsigned int ReData;

/**************************************
            延時(shí)程序
**************************************/
void delay(unsigned char i)
{
        unsigned char j;
        for(i; i > 0; i--)
                for(j = 200; j > 0; j--);
}


void main (void) {


        SCON = 0x50;      //REN=1允許串行接受狀態(tài),串口工作模式1                             
            TMOD|= 0x20;      //定時(shí)器工作方式2                    
                PCON|= 0x80;                                                         
               
                TH1  = 0xFD;     //baud*2  /* reload value 19200、數(shù)據(jù)位8、停止位1。效驗(yàn)位無(wú)         
               
                TR1  = 1;                                                            
                ES   = 1;        //開串口中斷                  
                EA   = 1;        // 開總中斷
   
        while(1)
    { P0 = 0xff;
          P0 = ReData;                  // max485(半雙工通信) RE/DE定義 RE=0為接受狀態(tài)  DE=1為發(fā)送狀態(tài)(參考MAX485芯片管腳)
          RS485E=0;                    // RS5485E=0為接收狀態(tài)  RS5485E=1為發(fā)送狀態(tài)
          delay(20);
    }

}

/****************************************************
               串口中斷程序
******************************************************/
void ser_int (void) interrupt 4 using 1
{

if(RI == 1)        //RI接受中斷標(biāo)志
{
        RI = 0;                    //清除RI接受中斷標(biāo)志
        ReData = SBUF;  //SUBF接受/發(fā)送緩沖器
       
   
}
}
回復(fù)

使用道具 舉報(bào)

11#
ID:481641 發(fā)表于 2019-4-5 16:30 | 只看該作者
用I2C總線
回復(fù)

使用道具 舉報(bào)

12#
ID:481641 發(fā)表于 2019-4-5 20:23 | 只看該作者
盡量自己動(dòng)手
回復(fù)

使用道具 舉報(bào)

13#
ID:73118 發(fā)表于 2019-4-5 21:03 | 只看該作者
我做過,你參考一下

多機(jī)通信.zip

134.19 KB, 下載次數(shù): 15

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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