找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13118|回復(fù): 18
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)多機(jī)通信源程序與proteus仿真原理圖(含主機(jī)和叢機(jī)源碼)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
多機(jī)通信說明
主機(jī)功能:按下S1,從機(jī)1燈亮;按下S2,從機(jī)1燈滅;
按下S3,從機(jī)2燈亮;按下S4,從機(jī)2燈亮;
按下key2,從機(jī)1和從機(jī)2同時(shí)燈亮;
按下key3,從機(jī)1和從機(jī)2同時(shí)燈滅;
接   線:  主機(jī)P3^0(RXD)分別接從機(jī)1和從機(jī)2的P3^1(TXD);
          主機(jī)P3^1(TXD)分別接從機(jī)1和從機(jī)2的P3^0(RXD);
          從機(jī)1和從機(jī)2共地;
          主機(jī)P1^7接地,使矩陣鍵盤S1-S4為獨(dú)立鍵盤使用。

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


單片機(jī)源程序如下:
  1. /*主機(jī)功能:按下key1,從機(jī)1燈亮;按下key2,從機(jī)1燈滅
  2.             按下key3,從機(jī)2燈亮;按下key4,從機(jī)2燈亮         
  3.                         按下key5,從機(jī)1和從機(jī)2燈亮;按下key6,從機(jī)1和從機(jī)2燈亮; */
  4. #include<reg51.h>
  5. #include<string.h>
  6. #define _SUCC_   0x0f//數(shù)據(jù)傳送成功
  7. #define _ERR_    0xf0//數(shù)據(jù)傳送失敗
  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. //延時(shí)1ms函數(shù)
  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. //串口初始化函數(shù)
  25. void init()
  26. {
  27.      TMOD=0x20; //定時(shí)器1工作于方式2
  28.      TH1=0xfd;  
  29.      TL1=0xfd; //波特率為9600
  30.      PCON=0;
  31.      SCON=0xd0;  //串口工作于方式3
  32.      TR1=1;  //開啟定時(shí)器
  33.      TI=0;
  34.      RI=0;
  35. }


  36. //發(fā)送數(shù)據(jù)函數(shù)
  37. void SEND_data(unsigned char *Buff)
  38. {
  39.      unsigned char i,lenth,check;
  40.      lenth=strlen(Buff);      //計(jì)算數(shù)據(jù)長度
  41.      check=lenth;
  42.      TI=0;         //發(fā)送數(shù)據(jù)長度
  43.      TB8=0;      //發(fā)送數(shù)據(jù)幀
  44.      SBUF=lenth;
  45.      while(!TI);
  46.      TI=0;
  47.          
  48.      for(i=0;i<lenth;i++)  //發(fā)送數(shù)據(jù)
  49.     {
  50.         check=check^Buff[i];
  51.         TB8=0;
  52.         SBUF=Buff[i];   
  53.         while(!TI);
  54.         TI=0;
  55.     }
  56.       TB8=0;      //發(fā)送校驗(yàn)字節(jié)
  57.       SBUF=check;   
  58.       while(!TI);
  59.       TI=0;     
  60. }


  61. //發(fā)送從機(jī)地址
  62. void ADDR_data(unsigned addr)
  63. {
  64. while(temp!=addr) //主機(jī)等待從機(jī)返回其地址作為應(yīng)答信號
  65. {
  66.   TI=0;    //發(fā)送從機(jī)地址
  67.   TB8=1;    //發(fā)送地址幀
  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);//發(fā)送從機(jī)地址
  87.       temp=_ERR_;   //主機(jī)等待從機(jī)數(shù)據(jù)接收成功信號
  88.       while(temp!=_SUCC_)
  89.       {
  90.           unsigned char Buff[]={0xfe};
  91.           SEND_data(Buff);//發(fā)送數(shù)據(jù)
  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_;   //主機(jī)等待從機(jī)數(shù)據(jù)接收成功信號
  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_;   //主機(jī)等待從機(jī)數(shù)據(jù)接收成功信號
  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_;   //主機(jī)等待從機(jī)數(shù)據(jù)接收成功信號
  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_;   //主機(jī)等待從機(jī)數(shù)據(jù)接收成功信號
  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_;   //主機(jī)等待從機(jī)數(shù)據(jù)接收成功信號
  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_;   //主機(jī)等待從機(jī)數(shù)據(jù)接收成功信號
  194.          while(temp!=_SUCC_)
  195.         {
  196.              unsigned char Buff[]={0xff};
  197.              SEND_data(Buff);
  198.              RI=0;
  199.              while(!RI);
  200. ……………………

  201. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

叢機(jī)程序:
  1. #include<reg51.h>
  2. #include<string.h>
  3. #define addr     0x01//從機(jī)1的地址
  4. #define _SUCC_   0x0f//數(shù)據(jù)傳送成功
  5. #define _ERR_    0xf0//數(shù)據(jù)傳送失敗
  6. unsigned char aa=0xff;//主機(jī)與從機(jī)之間通信標(biāo)志
  7. unsigned char Buff[20];//數(shù)據(jù)緩沖區(qū)
  8. //串口初始化函數(shù)
  9. void init()
  10. {
  11.      TMOD=0x20; //定時(shí)器1工作于方式2
  12.      TH1=0xfd;  
  13.      TL1=0xfd; //波特率為9600
  14.      PCON=0;
  15.      SCON=0xd0;  //串口工作于方式3
  16.      TR1=1;  //開啟定時(shí)器
  17.      TI=0;
  18.      RI=0;
  19. }
  20. //接收數(shù)據(jù)函數(shù)
  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;     //接收數(shù)據(jù)長度
  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++) //接收數(shù)據(jù)
  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);    //接收校驗(yàn)字節(jié)
  43.      if(RB8==1)    //若接收到地址幀,則返回0xfe
  44.      return 0xfe;
  45.      temp=SBUF;
  46.      RI=0;
  47.      check=temp^check;  //將從主機(jī)接收到的校驗(yàn)碼與自己計(jì)算的校驗(yàn)碼比對
  48.      if(check!=0)   //校驗(yàn)碼不一致,表明數(shù)據(jù)接收錯(cuò)誤,向主機(jī)發(fā)送錯(cuò)誤信號,函數(shù)返回0xff
  49.      {
  50.         TI=0;
  51.         TB8=0;
  52.         SBUF=_ERR_;
  53.         while(!TI);
  54.         TI=0;
  55.         return 0xff;
  56.      }
  57.      TI=0;           //校驗(yàn)碼一致,表明數(shù)據(jù)接收正確,向主機(jī)發(fā)送成功信號,函數(shù)返回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)  //從機(jī)等待主機(jī)請求自己的地址
  71.       {
  72.            RI=0;
  73.            while(!RI);
  74.            aa=SBUF;
  75.            RI=0;
  76.       }
  77.       TI=0;     //一旦被請求,從機(jī)返回自己的地址作為應(yīng)答,等待接收數(shù)據(jù)
  78.       TB8=0;
  79.       SBUF=addr;
  80.       while(!TI);
  81.       TI=0;
  82.       SM2=0;                  //接收數(shù)據(jù)幀
  83.       aa=0xff;    //從機(jī)接收數(shù)據(jù),并將數(shù)據(jù)保存到數(shù)據(jù)緩沖區(qū)
  84.       while(aa==0xff)
  85.       {
  86.           aa=RECE_data(Buff);
  87.       }
  88.       if(aa==0xfe)
  89.          continue;
  90.       P2=Buff[0];      //查看接收到的數(shù)據(jù)
  91.    }
  92. }
復(fù)制代碼

所有資料51hei提供下載:
51多機(jī)通信.rar (125.2 KB, 下載次數(shù): 405)


評分

參與人數(shù) 2黑幣 +55 收起 理由
a962671336 + 5 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏16 分享淘帖 頂6 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:315229 發(fā)表于 2018-5-4 17:05 | 只看該作者
請問樓主  為什么程序下到硬件 就主機(jī)只能發(fā)送一次,從機(jī)接收之后  從機(jī)不再接收
回復(fù)

使用道具 舉報(bào)

板凳
ID:315229 發(fā)表于 2018-5-4 17:09 | 只看該作者
請問樓主為什么硬件只能的從機(jī)只能接收一次之后不再接收?
回復(fù)

使用道具 舉報(bào)

地板
ID:143232 發(fā)表于 2018-7-4 11:30 | 只看該作者
程序下到硬件,只能發(fā)送一次,從機(jī)接收之后  從機(jī)不再接收
回復(fù)

使用道具 舉報(bào)

5#
ID:337813 發(fā)表于 2018-8-23 17:59 | 只看該作者
非常感謝您的無私分享。!
回復(fù)

使用道具 舉報(bào)

6#
ID:345771 發(fā)表于 2018-8-23 22:35 | 只看該作者
        很給力!
回復(fù)

使用道具 舉報(bào)

7#
ID:424884 發(fā)表于 2018-11-12 10:54 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

8#
ID:426450 發(fā)表于 2019-1-14 17:35 | 只看該作者
牛逼,讓我學(xué)會了多機(jī)通信
回復(fù)

使用道具 舉報(bào)

9#
ID:537232 發(fā)表于 2019-5-30 14:18 | 只看該作者
樓主你好,想問下波特率怎么算的啊
回復(fù)

使用道具 舉報(bào)

10#
ID:472123 發(fā)表于 2019-6-10 14:26 | 只看該作者
挺好的,解決了燃眉之急
回復(fù)

使用道具 舉報(bào)

11#
ID:571481 發(fā)表于 2019-6-25 10:07 | 只看該作者
謝謝樓主,非常有用
回復(fù)

使用道具 舉報(bào)

12#
ID:428450 發(fā)表于 2019-6-25 23:15 | 只看該作者
很給力  謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

13#
ID:428450 發(fā)表于 2019-6-25 23:15 | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

14#
ID:526472 發(fā)表于 2020-3-23 16:11 | 只看該作者
很好,感謝樓主分享
回復(fù)

使用道具 舉報(bào)

15#
ID:526472 發(fā)表于 2020-3-23 16:12 | 只看該作者
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

16#
ID:505285 發(fā)表于 2020-5-12 21:31 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

17#
ID:818895 發(fā)表于 2020-9-17 17:40 | 只看該作者
很好的案例,分享愉快。
回復(fù)

使用道具 舉報(bào)

18#
ID:857362 發(fā)表于 2020-12-9 13:33 | 只看該作者
很清晰,測試無誤
回復(fù)

使用道具 舉報(bào)

19#
ID:1042956 發(fā)表于 2022-8-27 15:14 | 只看該作者
654321. 發(fā)表于 2018-5-4 17:05
請問樓主  為什么程序下到硬件 就主機(jī)只能發(fā)送一次,從機(jī)接收之后  從機(jī)不再接收

應(yīng)該樓主有意讓你自沖出這關(guān)上
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表