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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5060|回復: 3
打印 上一主題 下一主題
收起左側

單片機多機通信互傳數據仿真+代碼(1602顯示從機信息)

[復制鏈接]
跳轉到指定樓層
樓主
功能說明:主機功能:按下key1,從機1燈亮,lcd顯示從機1發送的數據,按下key2,從機1燈。按下key3,從機2燈亮,lcd顯示從機2發送的數據;按下key4,從機2燈滅,按下key5,從機1和從機2燈滅;按下key6,從機1和從機2燈滅;
proteus仿真圖:


主機部分單片機代碼:
  1. /*******************************************************************************
  2. *  標題:                        多機通信                                       *
  3. *  時間                      2019年3月11日16:14:33                                                           *                                                                                                                                          
  4. *                                                                              *                                                                        
  5. *  實驗說明:主機功能:按下key1,從機1燈亮,lcd顯示從機1發送的數據,按下key2,   *
  6. 從機1燈。按下key3,從機2燈亮,lcd顯示從機2發送的數據;按下key4,從機2燈滅,按下*
  7. key5,從機1和從機2燈滅;按下key6,從機1和從機2燈滅;                           *                                                               
  8. ********************************************************************************
  9. * 實驗心得:1.例如發送的字符串數組是buff[]={0x01,0x02,0x03},那么接收端前三位收到*
  10. 的數據就是0x01,0x02,0x03,之后也是有數據發送過來,但是數據的值不是字符串賦的值  *
  11. 2.check=check^Buff[i];這句話的意思是check和buff的值進行二進制或與,相同為0,   *
  12. 不同為1,按這個進行主機與從機數據的校驗                                        *
  13. ********************************************************************************/
  14. #include<reg51.h>
  15. #include<string.h>
  16. #include "lcd.h"
  17. #define _SUCC_   0x0f//數據傳送成功
  18. #define _ERR_    0xf0//數據傳送失敗
  19. unsigned char aa=0xff;//主機與從機之間通信標志
  20. unsigned char temp=0xff;
  21. unsigned char Buff[20];//數據緩沖區
  22. unsigned char recive[6];         //用于保存從機發送的數據
  23. sbit KEY1=P1^3;
  24. sbit KEY2=P1^2;
  25. sbit KEY3=P1^1;
  26. sbit KEY4=P1^0;
  27. sbit KEY5=P3^2;
  28. sbit KEY6=P3^3;

  29. //sbit KEY5=P1^4;
  30. //sbit KEY6=P1^5;
  31. //延時1ms函數
  32. void delay_1ms(unsigned int i)
  33. {
  34.      unsigned int x,y;
  35.      for(x=i;x>0;x--)
  36.          for(y=110;y>0;y--);
  37. }
  38. //串口初始化函數
  39. void init()
  40. {
  41.      TMOD=0x20; //定時器1工作于方式2
  42.      TH1=0xfd;  
  43.      TL1=0xfd; //波特率為9600
  44.      PCON=0;
  45.      SCON=0xd0;  //串口工作于方式3
  46.      TR1=1;  //開啟定時器
  47.      TI=0;
  48.      RI=0;
  49. }


  50. //發送數據函數
  51. void SEND_data(unsigned char *Buff)
  52. {
  53.      unsigned char i,lenth,check;
  54.      lenth=strlen(Buff);      //計算數據長度
  55.      check=lenth;
  56.      TI=0;         //發送數據長度
  57.      TB8=0;       //發送數據幀
  58.      SBUF=lenth;
  59.      while(!TI);
  60.      TI=0;
  61.          
  62.      for(i=0;i<lenth;i++)  //發送數據
  63.     {
  64.         check=check^Buff[i];
  65.         TB8=0;
  66.         SBUF=Buff[i];      
  67.         while(!TI);
  68.         TI=0;
  69.     }
  70.       TB8=0;      //發送校驗字節
  71.       SBUF=check;   
  72.       while(!TI);
  73.       TI=0;     
  74. }

  75. //接收數據函數
  76. unsigned char RECE_data(unsigned char *Buff)
  77. {
  78.      unsigned char i;
  79.      unsigned char lenth;
  80.      unsigned char check;
  81.      RI=0;     //接收數據長度
  82.      while(!RI);
  83.      if(RB8==1)
  84.          {
  85.                  RI = 0;   
  86.              return 0xfe;  //若接收到地址幀,則返回0xfe
  87.          }
  88.      lenth=SBUF;
  89.      RI=0;     
  90.      check=lenth;
  91.      for(i=0;i<lenth;i++) //接收數據
  92.     {
  93.         while(!RI);
  94.         if(RB8==1)   //若接收到地址幀,則返回0xfe
  95.         return 0xfe;
  96.         Buff[i]=SBUF;   
  97.         check=check^(Buff[i]);
  98.         RI=0;
  99.     }
  100.      while(!RI);    //接收校驗字節
  101.      if(RB8==1)    //若接收到地址幀,則返回0xfe
  102.      return 0xfe;
  103.      temp=SBUF;
  104.      RI=0;
  105.      check=temp^check;  //將從主機接收到的校驗碼與自己計算的校驗碼比對
  106.      if(check!=0)   //校驗碼不一致,表明數據接收錯誤,向主機發送錯誤信號,函數返回0xff
  107.      {
  108.         TI=0;
  109.         TB8=0;
  110.         SBUF=_ERR_;
  111.         while(!TI);
  112.         TI=0;
  113.         return 0xff;
  114.      }
  115.      TI=0;           //校驗碼一致,表明數據接收正確,向主機發送成功信號,函數返回0x00
  116.      TB8=0;
  117.      SBUF=_SUCC_;            
  118.      while(!TI);
  119.      TI=0;
  120.      return 0;
  121. }                                 

  122. //發送從機地址
  123. void ADDR_data(unsigned addr)
  124. {
  125. while(temp!=addr) //主機等待從機返回其地址作為應答信號
  126. {
  127.   TI=0;    //發送從機地址
  128.   TB8=1;    //發送地址幀
  129.   SBUF=addr;
  130.   while(!TI);
  131.   TI=0;
  132.   
  133.   RI=0;
  134.   while(!RI);
  135.   temp=SBUF;
  136.   RI=0;
  137. }
  138. }

  139. void keyscan()
  140. {
  141.   
  142.   if(KEY1==0)
  143.   {
  144.      delay_1ms(5);
  145.      if(KEY1==0)
  146.     {
  147.       while(!KEY1);
  148.       ADDR_data(0x01);//發送從機地址
  149.       temp=_ERR_;   //主機等待從機數據接收成功信號
  150.       while(temp!=_SUCC_)
  151.       {
  152.           unsigned char Buff[]={0xfe};
  153.           SEND_data(Buff);//發送數據
  154.           RI=0;
  155.           while(!RI);
  156.           temp=SBUF;
  157.           RI=0;
  158.       }
  159.           SM2=0;       //接收數據幀
  160.       aa=0xff;    //從機接收數據,并將數據保存到數據緩沖區
  161.       while(aa==0xff)
  162.       {
  163.           aa=RECE_data(Buff);
  164.                   P0 = 0xff;
  165.       }
  166.           P0 = 0xfe;
  167.       recive[0] = Buff[0];
  168.           recive[1] = Buff[1];
  169.           recive[2] = Buff[2];
  170.          
  171.     }
  172.   }

  173.   if(KEY2==0)
  174.   {
  175.      delay_1ms(5);
  176.      if(KEY2==0)
  177.      {
  178.         while(!KEY2);
  179.         ADDR_data(0x01);
  180.         temp=_ERR_;   //主機等待從機數據接收成功信號
  181.         while(temp!=_SUCC_)
  182.        {
  183.           unsigned char Buff[]={0xff};
  184.           SEND_data(Buff);
  185.           RI=0;
  186.           while(!RI);  
  187.           RI=0;
  188.                   temp=SBUF;
  189.        }
  190.      }
  191.   }

  192.   if(KEY3==0)
  193.   {
  194.      delay_1ms(5);
  195.      if(KEY3==0)
  196.      {
  197.          while(!KEY3);
  198.          ADDR_data(0x02);
  199.              temp=_ERR_;   //主機等待從機數據接收成功信號
  200.          while(temp!=_SUCC_)
  201.         {
  202.            unsigned char Buff[]={0xfe};
  203.            SEND_data(Buff);
  204.            RI=0;
  205.            while(!RI);
  206.            temp=SBUF;
  207.            RI=0;
  208.         }
  209.                 SM2=0;       //接收數據幀
  210.                 aa=0xff;    //從機接收數據,并將數據保存到數據緩沖區
  211.                 while(aa==0xff)
  212.                 {
  213.                         aa=RECE_data(Buff);
  214.                         P0 = 0xff;
  215.                 }
  216.                 P0 = 0xfe;
  217.                 recive[3] = Buff[0];
  218.                 recive[4] = Buff[1];
  219.                 recive[5] = Buff[2];
  220.      }
  221.   }

  222.   if(KEY4==0)
  223.   {
  224.       delay_1ms(5);
  225.       if(KEY4==0)
  226.      {
  227.          while(!KEY4);
  228.          ADDR_data(0x02);
  229.               temp=_ERR_;   //主機等待從機數據接收成功信號
  230.          while(temp!=_SUCC_)
  231.         {
  232.              unsigned char Buff[]={0xff};
  233.              SEND_data(Buff);
  234.              RI=0;
  235.              while(!RI);
  236.              temp=SBUF;
  237.              RI=0;
  238.         }
  239.      }
  240.   }
  241.   if(KEY5==0)
  242.   {
  243.       delay_1ms(5);
  244.       if(KEY5==0)
  245.      {
  246.          while(!KEY5);
  247.          ADDR_data(0x01);
  248.               temp=_ERR_;   //主機等待從機數據接收成功信號
  249.          while(temp!=_SUCC_)
  250.         {
  251.              unsigned char Buff[]={0xff};
  252.              SEND_data(Buff);
  253.              RI=0;
  254.              while(!RI);
  255.              temp=SBUF;
  256.              RI=0;
  257.         }
  258.          ADDR_data(0x02);
  259.               temp=_ERR_;   //主機等待從機數據接收成功信號
  260.          while(temp!=_SUCC_)
  261.         {
  262.              unsigned char Buff[]={0xff};
  263.              SEND_data(Buff);
  264.              RI=0;
  265.              while(!RI);
  266.              temp=SBUF;
  267.              RI=0;
  268.         }
  269.      }
  270.   }
  271.   if(KEY6==0)
  272.   {
  273.       delay_1ms(5);
  274.       if(KEY6==0)
  275.      {
  276.          while(!KEY6);
  277.          ADDR_data(0x01);
  278.               temp=_ERR_;   //主機等待從機數據接收成功信號
  279.          while(temp!=_SUCC_)
  280.         {
  281.              unsigned char Buff[]={0xff};
  282.              SEND_data(Buff);
  283.              RI=0;
  284.              while(!RI);
  285.              temp=SBUF;
  286.              RI=0;
  287.         }
  288.          ADDR_data(0x02);
  289.               temp=_ERR_;   //主機等待從機數據接收成功信號
  290.          while(temp!=_SUCC_)
  291.         {
  292.              unsigned char Buff[]={0xff};
  293.              SEND_data(Buff);
  294.              RI=0;
  295.              while(!RI);
  296.              temp=SBUF;
  297.              RI=0;
  298.         }
  299.      }
  300.   }

  301. }      
  302. void main()
  303. {
  304.      init();
  305.          LcdInit();                         //初始化LCD1602
  306.      LcdWriteCom(0x01);
  307.      while(1)
  308.      {
  309.         keyscan();
  310.                 LcdWriteData(recive[0]);
  311.             LcdWriteData(recive[1]);
  312.                 LcdWriteData(recive[2]);
  313.             LcdWriteData(recive[3]);
  314.                 LcdWriteData(recive[4]);
  315.             LcdWriteData(recive[5]);
  316.                 LcdWriteCom(0x80);
  317.      }
  318. }
復制代碼
從機1部分代碼:
  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. unsigned char ceshi[] = {0x77,0x78,0x56};                //傳遞給主機的信息
  9. unsigned char tp;
  10. //串口初始化函數
  11. void init()
  12. {
  13.      TMOD=0x20; //定時器1工作于方式2
  14.      TH1=0xfd;  
  15.      TL1=0xfd; //波特率為9600
  16.      PCON=0;
  17.      SCON=0xd0;  //串口工作于方式3
  18.      TR1=1;  //開啟定時器         
  19.      TI=0;
  20.      RI=0;
  21. }

  22. //發送數據函數
  23. void SEND_data(unsigned char *Buff)
  24. {
  25.      unsigned char i,lenth,check;
  26.      lenth=strlen(Buff);      //計算數據長度
  27.      check=lenth;
  28.      TI=0;         //發送數據長度
  29.      TB8=0;       //發送數據幀
  30.      SBUF=lenth;
  31.      while(!TI);
  32.      TI=0;
  33.          
  34.      for(i=0;i<lenth;i++)  //發送數據
  35.     {
  36.         check=check^Buff[i];
  37.         TB8=0;
  38.         SBUF=Buff[i];      
  39.         while(!TI);
  40.         TI=0;
  41.     }
  42.       TB8=0;      //發送校驗字節
  43.       SBUF=check;   
  44.       while(!TI);
  45.       TI=0;     
  46. }

  47. //接收數據函數
  48. unsigned char RECE_data(unsigned char *Buff)
  49. {
  50.      unsigned char i,temp;
  51.      unsigned char lenth;
  52.      unsigned char check;
  53.      RI=0;     //接收數據長度
  54.      while(!RI);
  55.      if(RB8==1)
  56.          {
  57.                  RI = 0;   
  58.              return 0xfe;  //若接收到地址幀,則返回0xfe
  59.          }
  60.      lenth=SBUF;
  61.      RI=0;     
  62.      check=lenth;
  63.      for(i=0;i<lenth;i++) //接收數據
  64.     {
  65.         while(!RI);
  66.         if(RB8==1)   //若接收到地址幀,則返回0xfe
  67.         return 0xfe;
  68.         Buff[i]=SBUF;   
  69.         check=check^(Buff[i]);
  70.         RI=0;
  71.     }
  72.      while(!RI);    //接收校驗字節
  73.      if(RB8==1)    //若接收到地址幀,則返回0xfe
  74.      return 0xfe;
  75.      temp=SBUF;
  76.      RI=0;
  77.      check=temp^check;  //將從主機接收到的校驗碼與自己計算的校驗碼比對
  78.      if(check!=0)   //校驗碼不一致,表明數據接收錯誤,向主機發送錯誤信號,函數返回0xff
  79.      {
  80.         TI=0;
  81.         TB8=0;
  82.         SBUF=_ERR_;
  83.         while(!TI);
  84.         TI=0;
  85.         return 0xff;
  86.      }
  87.      TI=0;           //校驗碼一致,表明數據接收正確,向主機發送成功信號,函數返回0x00
  88.      TB8=0;
  89.      SBUF=_SUCC_;            
  90.      while(!TI);
  91.      TI=0;
  92.      return 0;
  93. }                                 
  94. void main()
  95. {
  96.     init();
  97.     while(1)
  98.    {
  99.        SM2=1;              //處于接收地址幀狀態
  100.        while(aa!=addr)  //從機等待主機請求自己的地址
  101.       {
  102.            RI=0;
  103.            while(!RI);
  104.            aa=SBUF;
  105.            RI=0;
  106.       }
  107.       TI=0;     //一旦被請求,從機返回自己的地址作為應答,等待接收數據
  108.       TB8=0;
  109.       SBUF=addr;
  110.       while(!TI);
  111.       TI=0;
  112.       SM2=0;       //接收數據幀
  113.       aa=0xff;    //從機接收數據,并將數據保存到數據緩沖區
  114.       while(aa==0xff)
  115.       {
  116.           aa=RECE_data(Buff);
  117.       }
  118.       if(aa==0xfe)
  119.          continue;
  120.       P2=Buff[0];      //查看接收到的數據
  121.           tp = _ERR_;
  122.           if(Buff[0] == 0xfe)
  123.           {
  124.                   while(tp!=_SUCC_)
  125.                   {
  126.                           SEND_data(ceshi);
  127.                         RI=0;
  128.                         while(!RI);  
  129.                         RI=0;
  130.                         tp=SBUF;
  131.                   }
  132.           }
  133.    }
  134. }
復制代碼

從機2部分代碼:
  1. #include<reg51.h>
  2. #include<string.h>
  3. #define addr     0x02//從機2的地址
  4. #define _SUCC_   0x0f//數據傳送成功
  5. #define _ERR_    0xf0//數據傳送失敗
  6. unsigned char aa=0xff;//主機與從機之間通信標志
  7. unsigned char ceshi[] = {0x6b,0x6c,0x2b};
  8. unsigned char tp;
  9. unsigned char Buff[20];//數據緩沖區
  10. //串口初始化函數
  11. void init()
  12. {
  13.      TMOD=0x20; //定時器1工作于方式2
  14.      TH1=0xfd;  
  15.      TL1=0xfd; //波特率為9600
  16.      PCON=0;
  17.      SCON=0xd0;  //串口工作于方式3
  18.      TR1=1;  //開啟定時器
  19.      TI=0;
  20.      RI=0;
  21. }

  22. //發送數據函數
  23. void SEND_data(unsigned char *Buff)
  24. {
  25.      unsigned char i,lenth,check;
  26.      lenth=strlen(Buff);      //計算數據長度
  27.      check=lenth;
  28.      TI=0;         //發送數據長度
  29.      TB8=0;       //發送數據幀
  30.      SBUF=lenth;
  31.      while(!TI);
  32.      TI=0;
  33.          
  34.      for(i=0;i<lenth;i++)  //發送數據
  35.     {
  36.         check=check^Buff[i];
  37.         TB8=0;
  38.         SBUF=Buff[i];      
  39.         while(!TI);
  40.         TI=0;
  41.     }
  42.       TB8=0;      //發送校驗字節
  43.       SBUF=check;   
  44.       while(!TI);
  45.       TI=0;     
  46. }

  47. //接收數據函數
  48. unsigned char RECE_data(unsigned char *Buff)
  49. {
  50.      unsigned char i,temp;
  51.      unsigned char lenth;
  52.      unsigned char check;
  53.      RI=0;     //接收數據長度
  54.      while(!RI);
  55.      if(RB8==1)    //若接收到地址幀,則返回0xfe
  56.      return 0xfe;
  57.      lenth=SBUF;
  58.      RI=0;     
  59.      check=lenth;
  60.      for(i=0;i<lenth;i++) //接收數據
  61.     {
  62.         while(!RI);
  63.         if(RB8==1)   //若接收到地址幀,則返回0xfe
  64.         return 0xfe;
  65.         Buff[i]=SBUF;   
  66.         check=check^(Buff[i]);
  67.         RI=0;
  68.     }
  69.      while(!RI);    //接收校驗字節
  70.      if(RB8==1)    //若接收到地址幀,則返回0xfe
  71.      return 0xfe;
  72.      temp=SBUF;
  73.      RI=0;
  74.      check=temp^check;  //將從主機接收到的校驗碼與自己計算的校驗碼比對
  75.      if(check!=0)   //校驗碼不一致,表明數據接收錯誤,向主機發送錯誤信號,函數返回0xff
  76.      {
  77.         TI=0;
  78.         TB8=0;
  79.         SBUF=_ERR_;
  80.         while(!TI);
  81.         TI=0;
  82.         return 0xff;
  83.      }
  84.      TI=0;           //校驗碼一致,表明數據接收正確,向主機發送成功信號,函數返回0x00
  85.      TB8=0;
  86.      SBUF=_SUCC_;
  87.      while(!TI);
  88.      TI=0;
  89.      return 0;
  90. }
  91. void main()
  92. {
  93.     init();
  94.     while(1)
  95.    {
  96.        SM2=1;              //接收地址幀
  97.        while(aa!=addr)  //從機等待主機請求自己的地址
  98.       {
  99.            RI=0;
  100.            while(!RI);
  101.            aa=SBUF;
  102.            RI=0;
  103.       }
  104.       TI=0;     //一旦被請求,從機返回自己的地址作為應答,等待接收數據
  105.       TB8=0;
  106.       SBUF=addr;
  107.       while(!TI);
  108.       TI=0;
  109.       SM2=0;                  //接收數據幀
  110.       aa=0xff;    //從機接收數據,并將數據保存到數據緩沖區
  111.       while(aa==0xff)
  112.       {
  113.           aa=RECE_data(Buff);
  114.       }
  115.       if(aa==0xfe)
  116.          continue;
  117.       P2=Buff[0];      //查看接收到的數據
  118.           tp = _ERR_;
  119.           if(Buff[0] == 0xfe)
  120.           {
  121.                   while(tp!=_SUCC_)
  122.                   {
  123.                           SEND_data(ceshi);
  124.                         RI=0;
  125.                         while(!RI);  
  126.                         RI=0;
  127.                         tp=SBUF;
  128.                   }
  129.           }
  130.    }
  131. }
復制代碼

全套代碼可以下載附件


注意這個仿真只能用Proteus7.8版本打開,經過測試其他版本均無反應:
多機通信-1602顯示從機信息.zip (194.84 KB, 下載次數: 137)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:509233 發表于 2019-4-27 17:14 | 只看該作者
請問下如果我不進行校驗的話代碼可以怎么改?比如說我只接受兩個從機的八位數據
回復

使用道具 舉報

板凳
ID:289218 發表于 2023-1-24 16:23 | 只看該作者
反饋:8.13版本運行,按下任何按鈕均無反應。
回復

使用道具 舉報

地板
ID:717459 發表于 2023-5-8 15:49 | 只看該作者
效果不行
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产免费xxx| 欧美精品久久 | 欧美一区二区三区在线看 | 人人草人人干 | 国产日韩欧美91 | 免费黄色av网站 | 欧美亚洲国产精品 | 久久尤物免费一区二区三区 | 欧美日韩在线一区二区 | 午夜影院黄 | 成人99 | 国产免费观看一区 | 国产精品一区二区日韩 | 福利电影在线 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 欧美日韩中| 国产精品69毛片高清亚洲 | 色婷婷亚洲 | 九九久久99 | 一呦二呦三呦国产精品 | 欧美日韩国产一区二区三区 | 天天干天天草 | 精品一二 | 亚洲视频在线看 | 免费看a| 一区二区三区视频 | 手机av网| 成人一区二区三区 | 成人一区二区视频 | 污视频在线免费观看 | 韩日av片 | 狠狠婷婷综合久久久久久妖精 | 性色av香蕉一区二区 | 国产精品一区二区视频 | 国产精品视频观看 | 成人国产精品免费观看 | 成人av网站在线观看 | 99视频 | 欧美精品久久 | 在线中文字幕国产 | 亚洲热在线视频 |