找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1654|回复: 12
收起左侧

新人想用51单片机做多机通信,麻烦大佬指点程序设计思路

[复制链接]
ID:494868 发表于 2019-4-3 20:29 | 显示全部楼层 |阅读模式
100黑币
我想以主机作为母体,每加入一个新的从机,主机都能扫描到并赋予一个新的地址,然后在主机上可以控制新的从机(一号)。在一号从机上能够继续加入新的从机,无论是串联状还是发散状,都能由主机来控制,而不是直接连接到主机。请问大佬该怎么编写代码?或者提示一下思路。谢谢了!

回复

使用道具 举报

ID:123289 发表于 2019-4-4 12:58 | 显示全部楼层
先做好通讯主从之的通讯协议,协议说得通就行,不难。
回复

使用道具 举报

ID:504761 发表于 2019-4-4 13:56 | 显示全部楼层
用IIC总线来搞
回复

使用道具 举报

ID:494868 发表于 2019-4-4 14:40 | 显示全部楼层
yzwzfyz 发表于 2019-4-4 12:58
先做好通讯主从之的通讯协议,协议说得通就行,不难。

谢谢提点
回复

使用道具 举报

ID:494868 发表于 2019-4-4 14:41 | 显示全部楼层

谢谢提点
回复

使用道具 举报

ID:387856 发表于 2019-4-4 18:28 | 显示全部楼层
起始码+地址码+数据码+结束码,这些码的位数和高低电平的脉冲时间可以自己定义
回复

使用道具 举报

ID:366559 发表于 2019-4-5 10:40 | 显示全部楼层
USB接口不就是这样的吗,去看一下USB2.0协议(全速,简化版,完整版太长了),学习一下
I2C总线的话,大部分单片机只有一个接口,难以实现级联
回复

使用道具 举报

ID:471632 发表于 2019-4-5 11:23 | 显示全部楼层
如果通过以太网进行主从通信呢?比如pc服务器控制几十台或上百台51进行工作,这样的环境有做过的吗?
回复

使用道具 举报

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

使用道具 举报

ID:476644 发表于 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接受/发送缓冲器
       
   
}
}
回复

使用道具 举报

ID:481641 发表于 2019-4-5 16:30 | 显示全部楼层
用I2C总线
回复

使用道具 举报

ID:481641 发表于 2019-4-5 20:23 | 显示全部楼层
尽量自己动手
回复

使用道具 举报

ID:73118 发表于 2019-4-5 21:03 | 显示全部楼层
我做过,你参考一下

多机通信.zip

134.19 KB, 下载次数: 15

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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