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

標題: 51單片機多機通信源程序與proteus仿真原理圖(含主機和叢機源碼) [打印本頁]

作者: mhcmhc大圣    時間: 2018-3-27 20:49
標題: 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)



作者: 654321.    時間: 2018-5-4 17:05
請問樓主  為什么程序下到硬件 就主機只能發送一次,從機接收之后  從機不再接收
作者: 654321.    時間: 2018-5-4 17:09
請問樓主為什么硬件只能的從機只能接收一次之后不再接收?
作者: mjqing    時間: 2018-7-4 11:30
程序下到硬件,只能發送一次,從機接收之后  從機不再接收

作者: HongZQ2007    時間: 2018-8-23 17:59
非常感謝您的無私分享!!!
作者: sxt158    時間: 2018-8-23 22:35
        很給力!
作者: 371031698    時間: 2018-11-12 10:54
謝謝分享
作者: G-8652    時間: 2019-1-14 17:35
牛逼,讓我學會了多機通信
作者: 肖蠢蠢    時間: 2019-5-30 14:18
樓主你好,想問下波特率怎么算的啊
作者: 法神黎暮    時間: 2019-6-10 14:26
挺好的,解決了燃眉之急
作者: 末永風    時間: 2019-6-25 10:07
謝謝樓主,非常有用
作者: wangqilai    時間: 2019-6-25 23:15
很給力  謝謝樓主分享
作者: wangqilai    時間: 2019-6-25 23:15
謝謝樓主分享
作者: dsdasda    時間: 2020-3-23 16:11
很好,感謝樓主分享
作者: dsdasda    時間: 2020-3-23 16:12
感謝樓主分享
作者: DoubleKing    時間: 2020-5-12 21:31
謝謝分享
作者: zzh999    時間: 2020-9-17 17:40
很好的案例,分享愉快。
作者: 李著    時間: 2020-12-9 13:33
很清晰,測試無誤
作者: kent1249    時間: 2022-8-27 15:14
654321. 發表于 2018-5-4 17:05
請問樓主  為什么程序下到硬件 就主機只能發送一次,從機接收之后  從機不再接收

應該樓主有意讓你自沖出這關上




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲欧美综合另类 | 欧美自拍视频 | av女人的天堂 | 天天摸夜夜操 | 亚州av在线 | 国产黄色免费网站 | 亚洲国产二区 | 日韩av综合网 | 色综合色综合色综合 | 国产又粗又猛又黄又爽的视频 | 在线不卡av | 成人午夜在线 | 中文在线观看视频 | 亚洲成人av | 黄色1级片| 爱啪啪av| 亚洲一区二区精品视频 | 影音先锋中文字幕在线 | 97视频在线 | 欧美激情一区二区 | 91成人小视频 | 欧美国产一区二区三区 | 免费av片| 精久久久 | 亚洲国产日韩欧美 | 亚洲色妞 | 日韩a视频| 国产又粗又猛又黄又爽无遮挡 | 黄色大片av | 成人国产精品免费观看 | av网址在线 | 538精品视频| 日本精品视频 | 精品少妇3p| 成人av播放 | 国产精品看片 | 久久香蕉国产 | 日本中文字幕网站 | 爱福利视频网 | 国产成人小视频 | 国产福利精品视频 |