找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机带CRC校验的串口通信程序

[复制链接]
跳转到指定楼层
楼主
ID:389262 发表于 2018-8-23 14:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51单片机串口通信程序,带CRC校验

单片机源码:
  1. /**********模拟测试软件指令*******************/
  2. /**********验证Agilent设备通信端口************/
  3. /**********下位机间的信号交流*****************/
  4. /**********验证OK----hg***********************/

  5. #include "stc12c5a60s2.h"
  6. #include "intrins.h"
  7. #define uint  unsigned int
  8. #define uchar unsigned char

  9. #define UCHAR  unsigned char
  10. #define USHORT unsigned int
  11. #define u16    unsigned int
  12. #define UINT16 unsigned int
  13. #define UINT32 long unsigned int
  14. #define UINT   unsigned int

  15. uchar dat11[33]={0};
  16. uchar Rec_number=0;
  17. uchar Rec_data=0;
  18. sbit KEY=P1^7;
  19. sbit LED=P3^2;
  20. sbit MAX485_T_R=P1^6;
  21. uchar flag=0;
  22. uchar crc_data[10]={0xa1,0xa2,0x03,0x44,0x55,0x66,0x98,0x14,0x55,0x62};
  23. void init_io(void)
  24. {
  25. P4M0=0;
  26. P4M1=0;
  27. P4SW=0XFF;
  28. P4=0XFF;
  29. }
  30. /****************/
  31. void init_usart(void)
  32. {
  33. // AUXR=0X40;
  34. TMOD=0X20;
  35. SCON=0X50;
  36. TH1=TL1=0XFD;
  37. TR1=1;
  38. REN=1;
  39. }
  40. /******************/
  41. void send_data(uchar ch)
  42. {
  43. SBUF=ch;
  44. while(TI==0);
  45. TI=0;
  46. }
  47. /******************/
  48. void printf_string(uchar *s)
  49. {
  50. while(*s!='\0')
  51. {
  52.   send_data(*s++);
  53. }
  54. }
  55. /*******************/
  56. /******************************/
  57. bit receive_data(uint times)
  58. {
  59. uint temp=0,temp1=0;
  60.    while(RI==0)
  61.   {
  62.   temp++;
  63.           if(temp>=2000)
  64.           {
  65.           temp=0;
  66.           temp1++;
  67.            if(temp1>times)
  68.             {
  69.                 return 0;
  70.             }
  71.           }
  72.   }
  73.   RI=0;
  74.   Rec_data=SBUF;
  75.   return 1;
  76. }
  77. /******************/
  78. void delay_ms(uint kk)
  79. {
  80. uint jj;
  81. while(kk--)
  82. {
  83.   for(jj=0;jj<510;jj++);
  84. }
  85. }
  86. /***********************/
  87. /******************************************************
  88. *函数名称:CRC16RTU
  89. *输   入:pszBuf  要校验的数据
  90.         unLength 校验数据的长
  91. *输   出:校验值
  92. *功   能:循环冗余校验-16
  93.          (RTU标准-0xA001)
  94. *******************************************************/
  95. UINT16 CRC16RTU( UCHAR * pszBuf, UINT unLength)
  96. {
  97.         UINT16 CRC=0XFFFF;
  98.         UINT32 CRC_count;

  99.         for(CRC_count=0;CRC_count<unLength;CRC_count++)
  100.         {
  101.                 int i;

  102.                 CRC=CRC^*(pszBuf+CRC_count);

  103.                 for(i=0;i<8;i++)
  104.                 {
  105.                         if(CRC&1)
  106.                         {
  107.                                 CRC>>=1;
  108.                                 CRC^=0xA001;
  109.                         }
  110.                         else
  111.                         {
  112.                             CRC>>=1;
  113.                         }
  114.                                
  115.                 }
  116.         }
  117.         return CRC;
  118. }
  119. /******************/
  120. void PC_COMMAND(void)
  121. {
  122.         uchar *a;
  123. //        uchar i;
  124.         a=dat11;
  125.          {
  126.                                  if(receive_data(1))
  127.                                  {
  128.                                         dat11[Rec_number++]=Rec_data;
  129.                 /*                        if(Rec_number==7)
  130.                                         {
  131.                                          if((dat11[0]=='*')&&(dat11[1]=='I')&&(dat11[2]=='D')&&
  132.                                          (dat11[3]=='N')&&(dat11[4]=='?')&&(dat11[5]==0x0D)&&(dat11[6]==0x0A))
  133.                                          {
  134.                                           LED=0;
  135.                                           delay_ms(50);
  136.                                 //          printf_string("HEWLETT-PACKARD,34401A,0,11-5-3\r\n");//模拟
  137.                                         //  delay_ms(1000);
  138.                                           LED=1;
  139.                                          // printf_string("通信完毕\r\n");
  140.                                           delay_ms(10);
  141.                                          }
  142.                                          else if((dat11[0]=='R')&&(dat11[1]=='E')&&(dat11[2]=='A'))
  143.                                          {
  144.                                           if((dat11[3]=='D')&&(dat11[4]=='?')&&(dat11[5]==0X0D)&&(dat11[6]==0X0A))
  145.                                           {
  146.                                             LED=0;
  147.                                          //   printf_string("+8.00000000E-03\r\n");
  148.                                                 delay_ms(10);
  149.                                                 LED=1;
  150.                                           }
  151.                                          }
  152.                                         }
  153.                                         else if(Rec_number==6)
  154.                                         {
  155.                                           if((dat11[0]=='*')&&(dat11[1]=='R')&&(dat11[2]=='S'))
  156.                                           {
  157.                                                    if((dat11[3]=='T')&&(dat11[4]==0x0d)&&(dat11[5]==0x0a))
  158.                                                 {
  159.                                                  LED=0;
  160.                                                  delay_ms(10);
  161.                                         //         printf_string("设备已经复位\r\n");
  162.                                                  LED=1;
  163.                                                  delay_ms(10);
  164.                                                 }
  165.                                           }
  166.                                         }
  167.                                         else if(Rec_number==15)
  168.                                         {
  169.                                            if((dat11[0]=='S')&&(dat11[1]=='Y')&&(dat11[2]=='S'))
  170.                                           {
  171.                                                    if((dat11[3]=='t')&&(dat11[4]=='e')&&(dat11[5]=='m'))
  172.                                                 {
  173.                                                          if((dat11[6]==':')&&(dat11[7]=='R')&&(dat11[8]=='E'))
  174.                                                          {
  175.                                                          if((dat11[9]=='M')&&(dat11[10]=='o')&&(dat11[11]=='t'))
  176.                                                          {
  177.                                                            if((dat11[12]=='e')&&(dat11[13]==0x0d)&&(dat11[14]==0x0a))
  178.                                                            {
  179.                                                                  LED=0;
  180.                                                                  delay_ms(10);
  181.                                                         //         printf_string("设备进入远程模式\r\n");
  182.                                                                  LED=1;
  183.                                                                  delay_ms(10);
  184.                                                            }
  185.                                                          }
  186.                                                          }
  187.                                                
  188.                                                 }
  189.                                           }
  190.                                         } */
  191.                                     if(Rec_number==33)
  192.                                         {
  193.                                            if((dat11[0]=='H')&&(dat11[1]=='E')&&(dat11[2]=='W'))
  194.                                           {
  195.                                                    if((dat11[3]=='L')&&(dat11[4]=='E')&&(dat11[5]=='T'))
  196.                                                 {
  197.                                                          if((dat11[6]=='T')&&(dat11[7]=='-')&&(dat11[8]=='P'))
  198.                                                          {
  199.                                                          if((dat11[9]=='A')&&(dat11[10]=='C')&&(dat11[11]=='K')&&(dat11[12]=='A'))
  200.                                                          {
  201.                                                            if((dat11[13]=='R')&&(dat11[14]=='D')&&(dat11[15]==','))
  202.                                                            {
  203.                                                             if((dat11[16]=='3')&&(dat11[17]=='4')&&(dat11[18]=='4'))
  204.                                                                 {
  205.                                                                  if((dat11[19]=='0')&&(dat11[20]=='1')&&(dat11[21]=='A'))
  206.                                                                  {
  207.                                                                  if((dat11[22]==',')&&(dat11[23]=='0')&&(dat11[24]==','))
  208.                                                                  {
  209.                                                                    if((dat11[25]=='1')&&(dat11[26]=='1')&&(dat11[27]=='-'))
  210.                                                                    {
  211.                                                                      if((dat11[28]=='5')&&(dat11[29]=='-')&&(dat11[30]=='3'))
  212.                                                                          {
  213.                                                                           if((dat11[31]==0X0D)&&(dat11[32]==0X0A))
  214.                                                                           {
  215.                                                                                    LED=0;
  216.                                                                         delay_ms(10);
  217.                                                                     //    printf_string("设备进入100MA测试模式\r\n");
  218.                                                                         LED=1;
  219.                                                                         delay_ms(10);
  220.                                                                                 flag=0;
  221.                                                                           }
  222.                                                                          }
  223.                                                                    }
  224.                                                                  }
  225.                                                        
  226.                                                                  }
  227.                                                                 }
  228.                                                            }
  229.                                                          }
  230.                                                          }
  231.                                                
  232.                                                 }
  233.                                           }
  234.                                         }
  235.                                                 /*        if(Rec_number==17&&REN==1)
  236.                                                         {
  237.                                                           LED=0;
  238.                                                           delay_ms(800);
  239.                                                           LED=1;
  240.                                                           for(i=0;i<17;i++)
  241.                                                          {
  242.                                                            send_data(dat11[i]);
  243.                                                          }
  244.                                                         }*/               
  245.                                  }
  246.                                  else
  247.                                  Rec_number=0;
  248.          }
  249. }
  250. /*****************/
  251. void main(void)
  252. {
  253.   uchar i=0;
  254.   UINT16 crc=0;
  255.   uchar crc_h=0;
  256.   uchar crc_l=0;
  257.   init_io();
  258.   init_usart();
  259.   MAX485_T_R=1;
  260.   while(1)
  261.   {
  262. // PC_COMMAND();
  263. //  if(KEY==0)
  264.    {
  265.      //  delay_ms(10);
  266.          //  if(KEY==0)
  267.            {
  268.            //  while(KEY==0);
  269.                 // delay_ms(10);
  270.                 // while(KEY==0);
  271.                  delay_ms(30);
  272.                  crc=CRC16RTU(crc_data,8);
  273.                  crc_h=crc/0x100;
  274.                  crc_l=crc%0x100;
  275.                  for(i=0;i<8;i++)
  276.                  {
  277.                    send_data(crc_data[i]) ;
  278.                  }
  279.              send_data(crc_h);
  280.                  send_data(crc_l);
  281.                  delay_ms(30);
  282.             /* printf_string("*RST\r\n");
  283.              delay_ms(100);
  284.              printf_string("*IDN?\r\n");
  285.              REN=1;
  286.                  flag=1;
  287.                  MAX485_T_R=0;
  288.                  while(flag==1)
  289.                  {
  290.                    PC_COMMAND();
  291.                  }
  292.                  MAX485_T_R=1;
  293.                  if(flag==0)
  294.                  {
  295.                  delay_ms(300);
  296.                  printf_string("SYStem:REMote\r\n");
  297.                  delay_ms(100);
  298.                  printf_string("CONFigure:CURRent:DC 100MA,DEF\r\n");
  299.          } */
  300.            }
  301.           
  302.    }  

  303.   }
  304. }
复制代码

所有资料51hei提供下载:
51定时器模拟.rar (33.43 KB, 下载次数: 86)



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

使用道具 举报

沙发
ID:20672 发表于 2019-8-11 20:22 | 只看该作者
谢谢分享~~~
回复

使用道具 举报

板凳
ID:554617 发表于 2019-8-12 13:28 | 只看该作者
这个是适合那些型号的单片机
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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