欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3687|回復: 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 單片機教程網

快速回復 返回頂部 返回列表