找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机多机通信源程序与proteus仿真原理图(含主机和丛机源码)

  [复制链接]
跳转到指定楼层
楼主
多机通信说明
主机功能:按下S1,从机1灯亮;按下S2,从机1灯灭;
按下S3,从机2灯亮;按下S4,从机2灯亮;
按下key2,从机1和从机2同时灯亮;
按下key3,从机1和从机2同时灯灭;
接   线:  主机P3^0(RXD)分别接从机1和从机2的P3^1(TXD);
          主机P3^1(TXD)分别接从机1和从机2的P3^0(RXD);
          从机1和从机2共地;
          主机P1^7接地,使矩阵键盘S1-S4为独立键盘使用。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. /*主机功能:按下key1,从机1灯亮;按下key2,从机1灯灭
  2.             按下key3,从机2灯亮;按下key4,从机2灯亮         
  3.                         按下key5,从机1和从机2灯亮;按下key6,从机1和从机2灯亮; */
  4. #include<reg51.h>
  5. #include<string.h>
  6. #define _SUCC_   0x0f//数据传送成功
  7. #define _ERR_    0xf0//数据传送失败
  8. unsigned char temp=0xff;
  9. sbit KEY1=P1^3;
  10. sbit KEY2=P1^2;
  11. sbit KEY3=P1^1;
  12. sbit KEY4=P1^0;
  13. sbit KEY5=P3^2;
  14. sbit KEY6=P3^3;

  15. //sbit KEY5=P1^4;
  16. //sbit KEY6=P1^5;
  17. //延时1ms函数
  18. void delay_1ms(unsigned int i)
  19. {
  20.      unsigned int x,y;
  21.      for(x=i;x>0;x--)
  22.          for(y=110;y>0;y--);
  23. }
  24. //串口初始化函数
  25. void init()
  26. {
  27.      TMOD=0x20; //定时器1工作于方式2
  28.      TH1=0xfd;  
  29.      TL1=0xfd; //波特率为9600
  30.      PCON=0;
  31.      SCON=0xd0;  //串口工作于方式3
  32.      TR1=1;  //开启定时器
  33.      TI=0;
  34.      RI=0;
  35. }


  36. //发送数据函数
  37. void SEND_data(unsigned char *Buff)
  38. {
  39.      unsigned char i,lenth,check;
  40.      lenth=strlen(Buff);      //计算数据长度
  41.      check=lenth;
  42.      TI=0;         //发送数据长度
  43.      TB8=0;      //发送数据帧
  44.      SBUF=lenth;
  45.      while(!TI);
  46.      TI=0;
  47.          
  48.      for(i=0;i<lenth;i++)  //发送数据
  49.     {
  50.         check=check^Buff[i];
  51.         TB8=0;
  52.         SBUF=Buff[i];   
  53.         while(!TI);
  54.         TI=0;
  55.     }
  56.       TB8=0;      //发送校验字节
  57.       SBUF=check;   
  58.       while(!TI);
  59.       TI=0;     
  60. }


  61. //发送从机地址
  62. void ADDR_data(unsigned addr)
  63. {
  64. while(temp!=addr) //主机等待从机返回其地址作为应答信号
  65. {
  66.   TI=0;    //发送从机地址
  67.   TB8=1;    //发送地址帧
  68.   SBUF=addr;
  69.   while(!TI);
  70.   TI=0;
  71.   
  72.   RI=0;
  73.   while(!RI);
  74.   temp=SBUF;
  75.   RI=0;
  76. }
  77. }

  78. void keyscan()
  79. {
  80.   if(KEY1==0)
  81.   {
  82.      delay_1ms(5);
  83.      if(KEY1==0)
  84.     {
  85.       while(!KEY1);
  86.       ADDR_data(0x01);//发送从机地址
  87.       temp=_ERR_;   //主机等待从机数据接收成功信号
  88.       while(temp!=_SUCC_)
  89.       {
  90.           unsigned char Buff[]={0xfe};
  91.           SEND_data(Buff);//发送数据
  92.           RI=0;
  93.           while(!RI);
  94.           temp=SBUF;
  95.            RI=0;
  96.       }
  97.     }
  98.   }

  99.   if(KEY2==0)
  100.   {
  101.      delay_1ms(5);
  102.      if(KEY2==0)
  103.      {
  104.         while(!KEY2);
  105.         ADDR_data(0x01);
  106.         temp=_ERR_;   //主机等待从机数据接收成功信号
  107.         while(temp!=_SUCC_)
  108.        {
  109.           unsigned char Buff[]={0xff};
  110.           SEND_data(Buff);
  111.           RI=0;
  112.           while(!RI);
  113.           temp=SBUF;
  114.           RI=0;
  115.        }
  116.      }
  117.   }

  118.   if(KEY3==0)
  119.   {
  120.      delay_1ms(5);
  121.      if(KEY3==0)
  122.      {
  123.          while(!KEY3);
  124.          ADDR_data(0x02);
  125.              temp=_ERR_;   //主机等待从机数据接收成功信号
  126.          while(temp!=_SUCC_)
  127.         {
  128.            unsigned char Buff[]={0xfe};
  129.            SEND_data(Buff);
  130.            RI=0;
  131.            while(!RI);
  132.            temp=SBUF;
  133.            RI=0;
  134.         }
  135.      }
  136.   }

  137.   if(KEY4==0)
  138.   {
  139.       delay_1ms(5);
  140.       if(KEY4==0)
  141.      {
  142.          while(!KEY4);
  143.          ADDR_data(0x02);
  144.               temp=_ERR_;   //主机等待从机数据接收成功信号
  145.          while(temp!=_SUCC_)
  146.         {
  147.              unsigned char Buff[]={0xff};
  148.              SEND_data(Buff);
  149.              RI=0;
  150.              while(!RI);
  151.              temp=SBUF;
  152.              RI=0;
  153.         }
  154.      }
  155.   }
  156.   if(KEY5==0)
  157.   {
  158.       delay_1ms(5);
  159.       if(KEY5==0)
  160.      {
  161.          while(!KEY5);
  162.          ADDR_data(0x01);
  163.               temp=_ERR_;   //主机等待从机数据接收成功信号
  164.          while(temp!=_SUCC_)
  165.         {
  166.              unsigned char Buff[]={0xfe};
  167.              SEND_data(Buff);
  168.              RI=0;
  169.              while(!RI);
  170.              temp=SBUF;
  171.              RI=0;
  172.         }
  173.          ADDR_data(0x02);
  174.               temp=_ERR_;   //主机等待从机数据接收成功信号
  175.          while(temp!=_SUCC_)
  176.         {
  177.              unsigned char Buff[]={0xfe};
  178.              SEND_data(Buff);
  179.              RI=0;
  180.              while(!RI);
  181.              temp=SBUF;
  182.              RI=0;
  183.         }
  184.      }
  185.   }
  186.   if(KEY6==0)
  187.   {
  188.       delay_1ms(5);
  189.       if(KEY6==0)
  190.      {
  191.          while(!KEY6);
  192.          ADDR_data(0x01);
  193.               temp=_ERR_;   //主机等待从机数据接收成功信号
  194.          while(temp!=_SUCC_)
  195.         {
  196.              unsigned char Buff[]={0xff};
  197.              SEND_data(Buff);
  198.              RI=0;
  199.              while(!RI);
  200. ……………………

  201. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

丛机程序:
  1. #include<reg51.h>
  2. #include<string.h>
  3. #define addr     0x01//从机1的地址
  4. #define _SUCC_   0x0f//数据传送成功
  5. #define _ERR_    0xf0//数据传送失败
  6. unsigned char aa=0xff;//主机与从机之间通信标志
  7. unsigned char Buff[20];//数据缓冲区
  8. //串口初始化函数
  9. void init()
  10. {
  11.      TMOD=0x20; //定时器1工作于方式2
  12.      TH1=0xfd;  
  13.      TL1=0xfd; //波特率为9600
  14.      PCON=0;
  15.      SCON=0xd0;  //串口工作于方式3
  16.      TR1=1;  //开启定时器
  17.      TI=0;
  18.      RI=0;
  19. }
  20. //接收数据函数
  21. unsigned char RECE_data(unsigned char *Buff)
  22. {
  23.      unsigned char i,temp;
  24.      unsigned char lenth;
  25.      unsigned char check;
  26.      RI=0;     //接收数据长度
  27.      while(!RI);
  28.      if(RB8==1)    //若接收到地址帧,则返回0xfe
  29.      return 0xfe;
  30.      lenth=SBUF;
  31.      RI=0;     
  32.      check=lenth;
  33.      for(i=0;i<lenth;i++) //接收数据
  34.     {
  35.         while(!RI);
  36.         if(RB8==1)   //若接收到地址帧,则返回0xfe
  37.         return 0xfe;
  38.         Buff[i]=SBUF;   
  39.         check=check^(Buff[i]);
  40.        RI=0;
  41.     }
  42.      while(!RI);    //接收校验字节
  43.      if(RB8==1)    //若接收到地址帧,则返回0xfe
  44.      return 0xfe;
  45.      temp=SBUF;
  46.      RI=0;
  47.      check=temp^check;  //将从主机接收到的校验码与自己计算的校验码比对
  48.      if(check!=0)   //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff
  49.      {
  50.         TI=0;
  51.         TB8=0;
  52.         SBUF=_ERR_;
  53.         while(!TI);
  54.         TI=0;
  55.         return 0xff;
  56.      }
  57.      TI=0;           //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00
  58.      TB8=0;
  59.      SBUF=_SUCC_;
  60.      while(!TI);
  61.      TI=0;
  62.      return 0;
  63. }
  64. void main()
  65. {
  66.     init();
  67.     while(1)
  68.    {
  69.        SM2=1;              //接收地址帧
  70.        while(aa!=addr)  //从机等待主机请求自己的地址
  71.       {
  72.            RI=0;
  73.            while(!RI);
  74.            aa=SBUF;
  75.            RI=0;
  76.       }
  77.       TI=0;     //一旦被请求,从机返回自己的地址作为应答,等待接收数据
  78.       TB8=0;
  79.       SBUF=addr;
  80.       while(!TI);
  81.       TI=0;
  82.       SM2=0;                  //接收数据帧
  83.       aa=0xff;    //从机接收数据,并将数据保存到数据缓冲区
  84.       while(aa==0xff)
  85.       {
  86.           aa=RECE_data(Buff);
  87.       }
  88.       if(aa==0xfe)
  89.          continue;
  90.       P2=Buff[0];      //查看接收到的数据
  91.    }
  92. }
复制代码

所有资料51hei提供下载:
51多机通信.rar (125.2 KB, 下载次数: 392)


评分

参与人数 2黑币 +55 收起 理由
a962671336 + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:315229 发表于 2018-5-4 17:05 | 只看该作者
请问楼主  为什么程序下到硬件 就主机只能发送一次,从机接收之后  从机不再接收
回复

使用道具 举报

板凳
ID:315229 发表于 2018-5-4 17:09 | 只看该作者
请问楼主为什么硬件只能的从机只能接收一次之后不再接收?
回复

使用道具 举报

地板
ID:143232 发表于 2018-7-4 11:30 | 只看该作者
程序下到硬件,只能发送一次,从机接收之后  从机不再接收
回复

使用道具 举报

5#
ID:337813 发表于 2018-8-23 17:59 | 只看该作者
非常感谢您的无私分享!!!
回复

使用道具 举报

6#
ID:345771 发表于 2018-8-23 22:35 | 只看该作者
        很给力!
回复

使用道具 举报

7#
ID:424884 发表于 2018-11-12 10:54 | 只看该作者
谢谢分享
回复

使用道具 举报

8#
ID:426450 发表于 2019-1-14 17:35 | 只看该作者
牛逼,让我学会了多机通信
回复

使用道具 举报

9#
ID:537232 发表于 2019-5-30 14:18 | 只看该作者
楼主你好,想问下波特率怎么算的啊
回复

使用道具 举报

10#
ID:472123 发表于 2019-6-10 14:26 | 只看该作者
挺好的,解决了燃眉之急
回复

使用道具 举报

11#
ID:571481 发表于 2019-6-25 10:07 | 只看该作者
谢谢楼主,非常有用
回复

使用道具 举报

12#
ID:428450 发表于 2019-6-25 23:15 | 只看该作者
很给力  谢谢楼主分享
回复

使用道具 举报

13#
ID:428450 发表于 2019-6-25 23:15 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

14#
ID:526472 发表于 2020-3-23 16:11 | 只看该作者
很好,感谢楼主分享
回复

使用道具 举报

15#
ID:526472 发表于 2020-3-23 16:12 | 只看该作者
感谢楼主分享
回复

使用道具 举报

16#
ID:505285 发表于 2020-5-12 21:31 | 只看该作者
谢谢分享
回复

使用道具 举报

17#
ID:818895 发表于 2020-9-17 17:40 | 只看该作者
很好的案例,分享愉快。
回复

使用道具 举报

18#
ID:857362 发表于 2020-12-9 13:33 | 只看该作者
很清晰,测试无误
回复

使用道具 举报

19#
ID:1042956 发表于 2022-8-27 15:14 | 只看该作者
654321. 发表于 2018-5-4 17:05
请问楼主  为什么程序下到硬件 就主机只能发送一次,从机接收之后  从机不再接收

应该楼主有意让你自冲出这关上
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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