久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12974|回復: 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, 下載次數: 405)


評分

參與人數 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产黄色大片在线观看 | 国产美女自拍视频 | 激情av | 成人伊人 | av免费网站在线观看 | 精品一区二区三区四区在线 | 亚洲自拍偷拍欧美 | 请别相信他免费喜剧电影在线观看 | 五月综合激情在线 | 高清久久 | 久久91av | 欧美精品网站 | 亚洲成人精 | 亚洲免费视频在线观看 | 国产精品欧美精品 | 中文字幕亚洲欧美日韩在线不卡 | 国产精品7777777 | 91精品国产综合久久久久久丝袜 | 久久久久久久电影 | 成人免费视频网站在线观看 | 国产精品综合色区在线观看 | 美国av毛片 | 亚洲第一天堂 | 欧美黄色精品 | 久久久www | 精久久久久 | 色视频www在线播放国产人成 | 日本黄色一级片视频 | 日韩aⅴ片 | 精品久久成人 | 亚洲三区在线观看 | 亚洲第一av | 亚洲综合天堂网 | 国产精品不卡一区 | 一级毛片成人免费看a | 欧美中文视频 | 国内久久精品 | av中文字幕在线播放 | 激情欧美一区二区三区中文字幕 | 一区二区三区视频在线 | 国产亚洲一区二区三区 |