找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3660|回復(fù): 0
收起左側(cè)

單片機(jī)485全雙工通信仿真 單數(shù)據(jù)通信 多數(shù)據(jù)通信 自動收發(fā)通信

[復(fù)制鏈接]
ID:137190 發(fā)表于 2016-10-8 23:41 | 顯示全部樓層 |閱讀模式
單片機(jī)用485總線進(jìn)行通信是考勤系統(tǒng)等常用的,下面給大家分享幾個例子,都帶有proteus仿真,有485單數(shù)據(jù)通信 485多數(shù)據(jù)通信 485自動收發(fā)通信仿真下面是仿真原理圖:
0.png 0.png
仿真工程文件及所有完整程序等資料下載地址:
http://www.torrancerestoration.com/bbs/dpj-56304-1.html

485自動收發(fā)單片機(jī)源程序:
  1. #include <reg51.h>
  2. #include <absacc.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. uchar idata buf[10];                      //接受收據(jù)
  6. uchar idata buf1[3]={0x06,0x09,0x05};     //從機(jī)發(fā)送的數(shù)據(jù)
  7. uchar data1,data2,data3;
  8. uchar pf,i;
  9. uchar flag,flag2;

  10. sbit key1=P2^0;

  11. /************延時程序************/
  12. void delay(uchar k)
  13.     {
  14.         uchar j;
  15.         while((k--)!=0)           
  16.                 {
  17.                 for(j=0;j<125;j++)
  18.                         {;}
  19.                 }
  20.     }

  21. void init(void)
  22. {
  23.     TMOD=0x20;
  24.     TH1=0xfd;
  25.     TL1=0xfd;
  26.     PCON=0x00;
  27.     TR1=1;
  28.     SCON=0Xd0;
  29. }

  30. void receive(void)
  31. {  
  32.      SM2=1;                         //SM2=1,從機(jī)只處于接受地址狀態(tài)
  33.      key1=0;
  34.      while(RI==0)
  35.           {
  36.             ;
  37.           }
  38.         data1=SBUF;               //接受地址與本機(jī)的地址比較
  39.         RI=0;               
  40.        if(data1!=0x04)
  41.          {  
  42.          flag2=3;                  //不是本機(jī)的地址
  43.          }
  44.     else {                         //地址正確
  45.               key1=1;
  46.               flag2=2;
  47.               TB8=1;                //TB8=1是從機(jī)發(fā)送地址標(biāo)志
  48.               SM2=0;                //SM2=2是允許任何發(fā)送和接受數(shù)據(jù)
  49.               SBUF=0x04;             //從機(jī)發(fā)送標(biāo)志
  50.               while(TI==0)
  51.                    {
  52.                      ;
  53.                    }
  54.               TI=0;
  55.               pf=0;
  56.               TB8=0;                 //TB8=0是從機(jī)以下通信的全是數(shù)據(jù)
  57.               key1=0;
  58.               while(RI==0)
  59.                     {
  60.                       ;
  61.                     }
  62.               data3=SBUF;             //從機(jī)接受主機(jī)狀態(tài)
  63.               RI=0;
  64.               key1=1;
  65.              if(data3==0x02)           //11111主機(jī)是接受狀態(tài)
  66.                    { TB8=0;
  67.                     
  68.                      SBUF=0x02;        //從機(jī)發(fā)送本機(jī)的狀態(tài)
  69.                      while(TI==0)
  70.                        {
  71.                          ;
  72.                        }
  73.                      TI=0;
  74.                      for(i=0;i<=2;i++)            //從機(jī)發(fā)送數(shù)據(jù)
  75.                           {  SBUF=buf1[i];
  76.                              pf+=buf1[i];
  77.                              while(TI==0)
  78.                                   {
  79.                                     ;
  80.                                   }
  81.                              TI=0;
  82.                            }
  83.                       SBUF=pf;                 //從機(jī)發(fā)送效驗和
  84.                       while(TI==0)
  85.                             {
  86.                               ;
  87.                             }
  88.                       TI=0;
  89.                   }
  90.             
  91.                if(data3==0x01)                  //22222主機(jī)是發(fā)送狀態(tài)
  92.                    {  TB8=0;
  93.                       key1=1;
  94.                       SBUF=0x01;                //從機(jī)發(fā)送本機(jī)的狀態(tài)
  95.                       while(TI==0)
  96.                        {
  97.                          ;
  98.                        }
  99.                      TI=0;
  100.                      key1=0;
  101.                      for(i=0;i<=9;i++)
  102.                         {                           //從機(jī)接受主機(jī)的數(shù)據(jù)
  103.                          while(RI==0)
  104.                               {
  105.                                ;
  106.                               }
  107.                          buf[i]=SBUF;
  108.                          pf+=buf[i];
  109.                          RI=0;
  110.                         }
  111.                      while(RI==0)
  112.                             {
  113.                                ;                   //從機(jī)接受效驗和
  114.                             }
  115.                      data2=SBUF;                  
  116.                      RI=0;
  117.                      key1=1;
  118.                      if(data2==pf)                //從機(jī)接受的效驗和與本機(jī)的效驗和比較
  119.                          {                //效驗正確
  120.                             TB8=0;
  121.                             SBUF=0xcc;            //發(fā)送正確的標(biāo)志
  122.                             while(TI==0)  
  123.                                  {
  124.                                    ;
  125.                                  }
  126.                             TI=0;
  127.                          }
  128.                   else{  
  129.                          TB8=0;                    //效驗錯誤
  130.                          SBUF=0xdd;         //發(fā)送錯誤標(biāo)志,請求主機(jī)重新發(fā)送數(shù)據(jù)
  131.                          while(TI==0)
  132.                                {
  133.                                   ;
  134.                                 }
  135.                           TI=0;
  136.                        }
  137.                 }
  138.              else                           //主機(jī)狀態(tài)錯誤
  139.                    {  key1=1;
  140.                       flag2=3;
  141.                       SBUF=0xac;             //發(fā)送錯誤標(biāo)志
  142.                       while(TI==0)
  143.                         {
  144.                          ;
  145.                         }
  146.                        TI=0;
  147.                     }
  148.        }
  149. }

  150. void display(void)
  151. { if(flag2==2)                   //從機(jī)顯示標(biāo)志
  152.     {
  153.          for(i=0;i<=9;i++)
  154.             {
  155.               P1=buf[i];
  156.               delay(50);
  157.              }
  158.      }
  159. }


  160. void main(void)
  161. {
  162.     delay(500);
  163.     init();
  164.     while(1)
  165.     {  
  166.       receive();                //從機(jī)通信子程序
  167.       display();                //從機(jī)顯示子程序
  168.     }
  169. }
復(fù)制代碼

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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