找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3243|回复: 3
收起左侧

组态王与单片机通信协议 源程序

[复制链接]
ID:196525 发表于 2017-5-4 15:54 | 显示全部楼层 |阅读模式
  1. /*
  2.   单片机与组态王进行数据通讯(HEX模式)
  3.          测试通过
  4.                赵学军
  5. */

  6. #include <reg51.h>
  7. #define byte unsigned char
  8. #define word unsigned int
  9. #define ENQ 0x05  //询问
  10. #define ACK 0x06  //确认
  11. #define NAK 0x15  //否认
  12. #define EOT 0x04  //发送结束
  13. #define ETX 0x03  //应答结束
  14. #define DB  0x01  //字节
  15. #define DW  0x02  //字
  16. #define DF  0x03  //浮点
  17. #define BufMax 30
  18. #define time0  -100000
  19. bit RecvOk,CRCok;
  20. bit LED;
  21. sbit LIT=P0^0;
  22. byte idata Rbuf[BufMax],Tbuf[BufMax];
  23. byte data Rptr,Tptr,Tnum;
  24. byte data MyAddr,DelayMs,last,ReadMe;

  25. byte  idata DatB[8];
  26. word  idata DatW[8];
  27. float idata DatF[8];


  28. void CheckCRC()
  29. {
  30.   byte i,n,crc;
  31.   n=Rptr;
  32.   crc=ENQ;
  33.   for(i=0;i<n;i++) crc^=Rbuf[i];
  34.   if(crc==0) CRCok=1;
  35.   else CRCok=0;
  36. }

  37. void Uart() interrupt 4 using 1
  38. {
  39.   byte m;
  40.   if(RI) //ENQ.......EOT,CRC
  41.   {
  42.     RI=0;m=SBUF;
  43.     if(last==ENQ &&(m==MyAddr ||m=='R' || m=='W'))    Rptr=0;   
  44.     if(Rptr<BufMax)
  45.     {
  46.       Rbuf[Rptr]=m; Rptr++;
  47.     }
  48.     if(last==EOT)   RecvOk=1;
  49.     last=m;
  50.   }
  51.   else
  52.   {
  53.     TI=0;
  54.     if(Tnum>0)
  55.     {
  56.       SBUF=Tbuf[Tptr];
  57.       if(++Tptr>=BufMax) Tptr=0;
  58.       Tnum--;
  59.     }
  60.     else if(ReadMe==2)
  61.     {
  62.       SM2=1; ReadMe=0;
  63.     }
  64.   }
  65. }

  66. void Timer1() interrupt 1 using 2
  67. {
  68.   TH0=time0>>8; TL0=time0&0xff;
  69.   if(DelayMs>0) DelayMs--;
  70.   else SM2=1;
  71. }

  72. void main()
  73. {
  74.   byte n,i,*p,crc,k;
  75.   word ptr,num;
  76.   IE=0x92;SCON=0xD0; SM2=1; TB8=0;
  77.   TMOD=0x21; PCON=0x80;
  78.   TH1=-2; TL1=-2; TR1=1;
  79.   TH0=time0>>8; TL0=time0&0xff; TR0=1;
  80.   Tptr=0; Tnum=0;  Rptr=0;
  81.   ReadMe=0;    RecvOk=0;MyAddr=0;
  82.   DatB[0]=123;DatB[1]=234;DatB[2]=111; DatB[3]=222;
  83.   DatW[0]=1234;DatW[1]=5678;DatW[2]=7890;DatW[3]=17890;
  84.   DatF[0]=12.34; DatF[1]=123.4; DatF[2]=1234.5;
  85.   while(1)
  86.   {
  87.     DatB[1]=P1;
  88.     if(RecvOk)
  89.     {
  90.        RecvOk=0; CheckCRC();
  91.         if(Rbuf[0]==MyAddr && CRCok==1 && SM2==1)  //对PC的查询命令进行应答
  92.        {
  93.           LED=!LED; LIT=LED;
  94.           Tbuf[0]=ACK; Tbuf[1]=MyAddr; Tbuf[2]=ETX;
  95.           crc=0;  for(i=0;i<3;i++) crc^=Tbuf[i];
  96.           Tbuf[3]=crc;
  97.           Tptr=0; Tnum=4; TI=1;  
  98.           DelayMs=10; ReadMe=1;
  99.           SM2=0;
  100.        }
  101.        else if(SM2==0 && CRCok==1)     //在应答后进行数据传送控制
  102.        {  
  103.           ReadMe=2;
  104.           n=Rbuf[4];
  105.           ptr=Rbuf[3]<<8 | Rbuf[2];  
  106.           if(Rbuf[0]=='R')
  107.           {
  108.              switch(Rbuf[1])
  109.              {
  110.                case DB:num=n;
  111.                        DatB[0]++;
  112.                        p=(byte*)DatB+ptr;
  113.                        for(i=0;i<num;i++)
  114.                        {
  115.                          k=i;
  116.                          Tbuf[3+k]=p[k];
  117.                        }
  118.                        break;
  119.                case DW:num=n/2;
  120.                        DatW[0]++;
  121.                        p=(byte*)DatW+ptr*2;
  122.                        for(i=0;i<num;i++)
  123.                        {
  124.                          k=i*2;
  125.                          Tbuf[3+k]=p[k+1];
  126.                          Tbuf[4+k]=p[k];
  127.                        }
  128.                        break;
  129.                case DF:num=n/4;
  130.                        DatF[0]+=0.01;
  131.                        p=(byte*)DatF+ptr*4;
  132.                        for(i=0;i<num;i++)
  133.                        {
  134.                          k=4*i;
  135.                          Tbuf[6+k]=p[k];
  136.                          Tbuf[5+k]=p[k+1];
  137.                          Tbuf[4+k]=p[k+2];
  138.                          Tbuf[3+k]=p[k+3];
  139.                        }
  140.                        break;
  141.              }
  142.              Tbuf[0]=ACK; Tbuf[1]=n&0xff; Tbuf[2]=n>>8;
  143.              Tbuf[3+n]=ETX;
  144.              crc=0;  for(i=0;i<4+n;i++) crc^=Tbuf[i];
  145.              Tbuf[4+n]=crc;
  146.              Tptr=0; Tnum=n+5; TI=1;
  147.           }
  148.           else if(Rbuf[0]=='W')
  149.           {
  150.              n=Rptr-6;
  151.              switch(Rbuf[1])
  152.              {
  153.                case DB:num=n;
  154.                        p=(byte*)DatB+ptr;
  155.                        for(i=0;i<num;i++)
  156.                        {
  157.                          k=i;
  158.                          p[i]=Rbuf[k+4];
  159.                        }
  160.                        break;
  161.                case DW:num=n/2;
  162.                        p=(byte*)DatW+ptr*2;
  163.                        for(i=0;i<num;i++)
  164.                        {
  165.                          k=i*2;
  166.                          p[k+1]=Rbuf[k+4];
  167.                          p[k]=Rbuf[k+5];
  168.                        }
  169.                        break;
  170.                case DF:num=n/4;
  171.                        p=(byte*)DatF+ptr*4;
  172.                        for(i=0;i<num;i++)
  173.                        {
  174.                          k=4*i;
  175.                          p[k+3]=Rbuf[k+4];
  176.                          p[k+2]=Rbuf[k+5];
  177.                          p[k+1]=Rbuf[k+6];
  178.                          p[k]=Rbuf[k+7];
  179.                        }
  180.                        break;
  181.              }
  182.              Tbuf[0]=ACK; Tbuf[1]=MyAddr; Tbuf[2]=ETX;
  183.              crc=0;  for(i=0;i<3;i++) crc^=Tbuf[i];
  184.              Tbuf[3]=crc;
  185.              Tptr=0; Tnum=4; TI=1;
  186.           }
  187.        }
  188.     }
  189.   }
  190. }


复制代码

评分

参与人数 2黑币 +55 收起 理由
dlinno + 5 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:196538 发表于 2017-5-4 16:10 | 显示全部楼层
学习了 学习了
回复

使用道具 举报

ID:159139 发表于 2017-5-5 00:20 来自手机 | 显示全部楼层
学习一下,非常感谢.。
回复

使用道具 举报

ID:406220 发表于 2018-10-12 16:28 | 显示全部楼层
这个通讯协议是那种类型
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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