找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3250|回复: 0
打印 上一主题 下一主题
收起左侧

单片机485全双工通信仿真 单数据通信 多数据通信 自动收发通信

[复制链接]
跳转到指定楼层
楼主
单片机用485总线进行通信是考勤系统等常用的,下面给大家分享几个例子,都带有proteus仿真,有485单数据通信 485多数据通信 485自动收发通信仿真下面是仿真原理图:

仿真工程文件及所有完整程序等资料下载地址:
http://www.51hei.com/bbs/dpj-56304-1.html

485自动收发单片机源程序:
  1. #include <reg51.h>
  2. #include <absacc.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. uchar idata buf[10];                      //接受收据
  6. uchar idata buf1[3]={0x06,0x09,0x05};     //从机发送的数据
  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,从机只处于接受地址状态
  33.      key1=0;
  34.      while(RI==0)
  35.           {
  36.             ;
  37.           }
  38.         data1=SBUF;               //接受地址与本机的地址比较
  39.         RI=0;               
  40.        if(data1!=0x04)
  41.          {  
  42.          flag2=3;                  //不是本机的地址
  43.          }
  44.     else {                         //地址正确
  45.               key1=1;
  46.               flag2=2;
  47.               TB8=1;                //TB8=1是从机发送地址标志
  48.               SM2=0;                //SM2=2是允许任何发送和接受数据
  49.               SBUF=0x04;             //从机发送标志
  50.               while(TI==0)
  51.                    {
  52.                      ;
  53.                    }
  54.               TI=0;
  55.               pf=0;
  56.               TB8=0;                 //TB8=0是从机以下通信的全是数据
  57.               key1=0;
  58.               while(RI==0)
  59.                     {
  60.                       ;
  61.                     }
  62.               data3=SBUF;             //从机接受主机状态
  63.               RI=0;
  64.               key1=1;
  65.              if(data3==0x02)           //11111主机是接受状态
  66.                    { TB8=0;
  67.                     
  68.                      SBUF=0x02;        //从机发送本机的状态
  69.                      while(TI==0)
  70.                        {
  71.                          ;
  72.                        }
  73.                      TI=0;
  74.                      for(i=0;i<=2;i++)            //从机发送数据
  75.                           {  SBUF=buf1[i];
  76.                              pf+=buf1[i];
  77.                              while(TI==0)
  78.                                   {
  79.                                     ;
  80.                                   }
  81.                              TI=0;
  82.                            }
  83.                       SBUF=pf;                 //从机发送效验和
  84.                       while(TI==0)
  85.                             {
  86.                               ;
  87.                             }
  88.                       TI=0;
  89.                   }
  90.             
  91.                if(data3==0x01)                  //22222主机是发送状态
  92.                    {  TB8=0;
  93.                       key1=1;
  94.                       SBUF=0x01;                //从机发送本机的状态
  95.                       while(TI==0)
  96.                        {
  97.                          ;
  98.                        }
  99.                      TI=0;
  100.                      key1=0;
  101.                      for(i=0;i<=9;i++)
  102.                         {                           //从机接受主机的数据
  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.                                ;                   //从机接受效验和
  114.                             }
  115.                      data2=SBUF;                  
  116.                      RI=0;
  117.                      key1=1;
  118.                      if(data2==pf)                //从机接受的效验和与本机的效验和比较
  119.                          {                //效验正确
  120.                             TB8=0;
  121.                             SBUF=0xcc;            //发送正确的标志
  122.                             while(TI==0)  
  123.                                  {
  124.                                    ;
  125.                                  }
  126.                             TI=0;
  127.                          }
  128.                   else{  
  129.                          TB8=0;                    //效验错误
  130.                          SBUF=0xdd;         //发送错误标志,请求主机重新发送数据
  131.                          while(TI==0)
  132.                                {
  133.                                   ;
  134.                                 }
  135.                           TI=0;
  136.                        }
  137.                 }
  138.              else                           //主机状态错误
  139.                    {  key1=1;
  140.                       flag2=3;
  141.                       SBUF=0xac;             //发送错误标志
  142.                       while(TI==0)
  143.                         {
  144.                          ;
  145.                         }
  146.                        TI=0;
  147.                     }
  148.        }
  149. }

  150. void display(void)
  151. { if(flag2==2)                   //从机显示标志
  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();                //从机通信子程序
  167.       display();                //从机显示子程序
  168.     }
  169. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表