标题: 新人想用51单片机做多机通信,麻烦大佬指点程序设计思路 [打印本页]

作者: cc_Jonah    时间: 2019-4-3 20:29
标题: 新人想用51单片机做多机通信,麻烦大佬指点程序设计思路
我想以主机作为母体,每加入一个新的从机,主机都能扫描到并赋予一个新的地址,然后在主机上可以控制新的从机(一号)。在一号从机上能够继续加入新的从机,无论是串联状还是发散状,都能由主机来控制,而不是直接连接到主机。请问大佬该怎么编写代码?或者提示一下思路。谢谢了!


作者: yzwzfyz    时间: 2019-4-4 12:58
先做好通讯主从之的通讯协议,协议说得通就行,不难。
作者: wangshengs    时间: 2019-4-4 13:56
用IIC总线来搞
作者: cc_Jonah    时间: 2019-4-4 14:40
yzwzfyz 发表于 2019-4-4 12:58
先做好通讯主从之的通讯协议,协议说得通就行,不难。

谢谢提点
作者: cc_Jonah    时间: 2019-4-4 14:41
wangshengs 发表于 2019-4-4 13:56
用IIC总线来搞

谢谢提点
作者: liuhailan5757    时间: 2019-4-4 18:28
起始码+地址码+数据码+结束码,这些码的位数和高低电平的脉冲时间可以自己定义
作者: jerry_fuyi    时间: 2019-4-5 10:40
USB接口不就是这样的吗,去看一下USB2.0协议(全速,简化版,完整版太长了),学习一下
I2C总线的话,大部分单片机只有一个接口,难以实现级联
作者: tigerzq    时间: 2019-4-5 11:23
如果通过以太网进行主从通信呢?比如pc服务器控制几十台或上百台51进行工作,这样的环境有做过的吗?
作者: toby2006    时间: 2019-4-5 15:03
/******************************************************************************************* *  标题:                  RS485通信试验(接收与发送)                                         * *                                                                                                                                                                        * *  1.通过本例程了解串口的基本原理及使用 ,理解并掌握对串口进行初始化                                        * *                                                                                                                                                                            * *  2.Baud 19200、数据位8、停止位1、效验位无 两台485设备  a机发 b机收                                        * *                                                                                                                                                                               * *  说明:                                                                                                                                                             * *    使用两个带有485功能硬件设备(例如:两个带485的开发箱等) 每个设备都有信号端A和B,通过导线        * *         分别连接两台设备 A 连 A  B 连 B  排线连接参考图片                                                                                * *  现象:按A机的独立按钮 在B机的LED等显示其状态 对应位的LED灯亮                                                            * *  注意:18B20 请卸下,否则会影响RS485                                                             * * 请学员认真消化本例程,学会用C语言操作串口和485的实现简单收发功能                                 * *********************************************************************************************/  #include <REG52.H> #include <stdio.h>  sbit RS485E=P3^7;   //定义485的使能脚  /**************************************             延时程序 **************************************/ 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允许串行接受状态,串口工作模式1                                           TMOD|= 0x20;      //定时器工作方式2                                     PCON|= 0x80;                                                                                            TH1  = 0xFD;     //baud*2  /* reload value 19200、数据位8、停止位1。效验位无                                            TR1  = 1;                                                                              ES   = 1;        //开串口中断                                   EA   = 1;        // 开总中断                     while(1)     {                     if (P0 != 0XFF)    // max485(半双工通信) RE/DE定义 RE=0为接受状态  DE=1为发送状态(参考MAX485芯片管脚)              {                  RS485E=1;           //                    RS5485E=0为接收状态  RS5485E=1为发送状态               SBUF=P0;           //发送数据                   delay(40);        }   }   }
作者: toby2006    时间: 2019-4-5 15:04
/*******************************************************************************************
*  标题:                  RS485通信试验(接收与发送)                                         *
*                                                                                                                                                                        *
*  1.通过本例程了解串口的基本原理及使用 ,理解并掌握对串口进行初始化                                        *
*                                                                                                                                                                            *
*  2.Baud 19200、数据位8、停止位1、效验位无 两台485设备  a机发 b机收                                        *
*                                                                                                                                                                               *
*  说明:                                                                                                                                                             *
*    使用两个带有485功能硬件设备(例如:两个带485的开发箱等) 每个设备都有信号端A和B,通过导线        *
*         分别连接两台设备 A 连 A  B 连 B  排线连接参考图片                                                                                *
*  现象:按A机的独立按钮 在B机的LED等显示其状态 对应位的LED灯亮                                                            *
*  注意:18B20 请卸下,否则会影响RS485                                                             *
* 请学员认真消化本例程,学会用C语言操作串口和485的实现简单收发功能                                 *
*********************************************************************************************/

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

sbit RS485E=P3^7;   //定义485的使能脚

/**************************************
            延时程序
**************************************/
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允许串行接受状态,串口工作模式1                             
            TMOD|= 0x20;      //定时器工作方式2                    
                PCON|= 0x80;                                                         
               
                TH1  = 0xFD;     //baud*2  /* reload value 19200、数据位8、停止位1。效验位无         
               
                TR1  = 1;                                                            
                ES   = 1;        //开串口中断                  
                EA   = 1;        // 开总中断
       

        while(1)
    {
       
          if (P0 != 0XFF)    // max485(半双工通信) RE/DE定义 RE=0为接受状态  DE=1为发送状态(参考MAX485芯片管脚)
             {   
              RS485E=1;           //                    RS5485E=0为接收状态  RS5485E=1为发送状态
              SBUF=P0;           //发送数据
                  delay(40);
       }

}

}













/*******************************************************************************************
*  标题:                  RS485通信试验(接收与发送)                                         *
*                                                                                                                                                                        *
*  1.通过本例程了解串口的基本原理及使用 ,理解并掌握对串口进行初始化                                        *
*                                                                                                                                                                            *
*  2.Baud 19200、数据位8、停止位1、效验位无 两台485设备  a机发 b机收                                        *
*                                                                                                                                                                               *
*  说明:                                                                                                                                                             *
*    使用两个带有485功能硬件设备(例如:两个带485的开发箱等) 每个设备都有信号端A和B,通过导线        *
*         分别连接两台设备 A 连 A  B 连 B  排线连接参考图片                                                                            *
*  现象:按A机的独立按钮 在B机的LED等显示其状态 对应位的LED灯亮                                                            *
*  注意:18B20 请卸下,否则会影响RS485                                                          *
* 请学员认真消化本例程,学会用C语言操作串口和485的实现简单收发功能                                 *
*********************************************************************************************/

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

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

/**************************************
            延时程序
**************************************/
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允许串行接受状态,串口工作模式1                             
            TMOD|= 0x20;      //定时器工作方式2                    
                PCON|= 0x80;                                                         
               
                TH1  = 0xFD;     //baud*2  /* reload value 19200、数据位8、停止位1。效验位无         
               
                TR1  = 1;                                                            
                ES   = 1;        //开串口中断                  
                EA   = 1;        // 开总中断
   
        while(1)
    { P0 = 0xff;
          P0 = ReData;                  // max485(半双工通信) RE/DE定义 RE=0为接受状态  DE=1为发送状态(参考MAX485芯片管脚)
          RS485E=0;                    // RS5485E=0为接收状态  RS5485E=1为发送状态
          delay(20);
    }

}

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

if(RI == 1)        //RI接受中断标志
{
        RI = 0;                    //清除RI接受中断标志
        ReData = SBUF;  //SUBF接受/发送缓冲器
       
   
}
}

作者: 我对你情有独钟    时间: 2019-4-5 16:30
用I2C总线
作者: 我对你情有独钟    时间: 2019-4-5 20:23
尽量自己动手

作者: 435873175    时间: 2019-4-5 21:03
我做过,你参考一下

多机通信.zip

134.19 KB, 下载次数: 15






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