找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1042|回复: 0
收起左侧

单片机+维特COO2传感器的二氧化碳测量程序与资料 串口输出数据

[复制链接]
ID:246649 发表于 2022-12-1 16:45 | 显示全部楼层 |阅读模式
制作出来的实物图如下:

装置

装置


传感器

传感器
串口解码数据--9600bps.png 重要:串口1接收到数据--准备解码.png
单片机源程序如下:
  1. /*
  2.               本机器下载频率11.0592M

  3.                   将维特空气质量串口接到串口2

  4.                   串口1输出原始数据--------------
  5. */                                                         

  6. //-------------------------------------------------------------------------
  7. #include <STC15W408AS.H>
  8. #include <intrins.H>
  9. #include <math.H>
  10. #include <TM1637.C>
  11. #include <STC15W_UART.H>
  12. #include <STC15W_UART2.H>
  13. #include <string.H>
  14. //-------------------------------------------------------------------------


  15. unsigned char COO2[6];
  16. unsigned char TVOC[6];

  17. unsigned int T0_nnn=0;
  18. unsigned int T0_mmm=0;
  19. unsigned char T0_time_out_flag=0;

  20. unsigned int COO2_int=0;
  21. unsigned int TVOC_int=0;

  22. unsigned int abc=0;
  23. //----------------------------------------------------------------------------------------------------


  24. void Config_Timer0()                 //1000微秒@11.0592.000MHz
  25. {
  26.          
  27.                
  28.                 //----------------------------------------------------------------
  29.                 // T0X12  T1X12  UART_MX06 T2R    T2_C/T    T2X12  EXT_RAM  S1ST2
  30.                 //   1           0        0       0              0                  0      0       0
  31.                
  32.                 // 0  12分频; T1 12分频
  33.                 // 1   1T模式
  34.         
  35.                 AUXR |= 0x80;                //定时器时钟1T模式        
  36.                
  37.         
  38.                 //EXT_RAM ==0 允许使用内部1024字节RAM
  39.             
  40.                 //---------------------------------------------------------------
  41.                 //GATE  C/T  M1  M0   GATE  C/T   M1    M0
  42.                 //  0         0         0         0                0         0           0     0
  43.                 //        T1 T0 模式0
  44.                 // 自动重装16位模式
  45.         
  46.                 TMOD &= 0xF0;                //设置定时器模式,自动重装初值*****************
  47.         
  48.         
  49.             //--------12T下定时器计算方法----------------------------------
  50.                
  51.                 //                           24M
  52.                 //65536-1000------------
  53.                 //                           12(分频)
  54.         
  55.                 //                           24M
  56.                 //65536-1000------------  =        41536=0XA240H,明白了没有?
  57.                 //                           1 (1分频)
  58.         
  59.                 //                           24M
  60.                 //65536-500------------  =        53536=0XD120H,明白了没有?
  61.                 //                           1 (1分频)
  62.         
  63.                 //                           24M
  64.                 //65536-600------------  =        51136=0XC7C0H,明白了没有?
  65.                 //                           1 (1分频)
  66.         
  67.         
  68.                 TL0 = 0xCD;                //设置定时初值
  69.                 TH0 = 0xD4;                //设置定时初值        
  70.         
  71.                 TF0 = 0;                //清除TF1标志
  72.                 TR0 = 0;                //定时器1开始计时
  73.         
  74.                 ET0=0;
  75.         
  76.                 //---------- *   *   *   *    *---------PT0------------------------
  77.                 //                        PS        PT1         PX1  PT0   PX0
  78.                 //IP=        0X02;
  79.         
  80.                 EA=1;
  81.                   

  82. }





  83. void Delay1000us()                //@11.0592MHz
  84. {
  85.         unsigned char i, j;

  86.         _nop_();
  87.         _nop_();
  88.         _nop_();
  89.         i = 11;
  90.         j = 190;
  91.         do
  92.         {
  93.                 while (--j);
  94.         } while (--i);
  95. }



  96. void Get_Value(unsigned char flag)//CCS811数据解析
  97. {

  98.         unsigned char *p;
  99.         unsigned char get_char=0;

  100.         p=Receive_DATA;
  101.         
  102.         if(flag==1)
  103.         {
  104.                
  105.                
  106.                 p=(unsigned char*)strstr((char *)Receive_DATA,"CO2:")+4;
  107.                 while(*p!='p')        //ppm
  108.                 {
  109.                         
  110.                         if ((*p>='0') &&  (*p<='9'))
  111.                         {
  112.                                 
  113.                                 /*  假如是'416'  

  114.                                      '4'----0+4=4
  115.                                          '1'----40+1=41
  116.                                          '6'----410+6=416
  117.                                 */

  118.                                 

  119.                                 
  120.                                 
  121.                                 COO2_int=COO2_int*10;
  122.                                 get_char=*p;
  123.                                 get_char=get_char-0x30;
  124.                                 COO2_int=COO2_int+(get_char);

  125.                                 //SEND_CHAR_TO_SBUF(*p);
  126.                                 //SEND_CHAR_TO_SBUF('-');
  127.                                 //SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING(COO2_int));
  128.                                 //SEND_STRING_TO_SBUF("\r\n");
  129.                                 //经过检验是对的
  130.                                 

  131.                         }
  132.                         
  133.                         
  134.                         p++;
  135.                         
  136.                                        
  137.                 }

  138.                 p=(unsigned char*)strstr((char*)Receive_DATA,"TVOC:")+4;
  139.                 while(*p!='p')          //ppb
  140.                 {
  141.                         if(*p>='0'&&*p<='9')
  142.                         {
  143.                                 
  144.                                 TVOC_int=TVOC_int*10+(*p-'0');
  145.                                 //经过检验是对的
  146.                                 //SEND_CHAR_TO_SBUF(*p);
  147.                         }
  148.                         p++;               
  149.                 }

  150.                 if(strstr((char*)Receive_DATA,"CO2 = ")!=NULL && strstr((char*)Receive_DATA,"TVOS = ")!=NULL)
  151.                                 
  152.                
  153.                 flag=0;


  154. }


  155. }


  156. /*

  157.          
  158.                                                 //存储在数组中的样子--------------------------------
  159.                                                 CO2:410ppm,TVOC:1ppb
  160.                                                 0123456789ABCDEFGH
  161.                                                 

  162.                                                  ///解码COO2--------------------------------------------------------------------------------------------
  163.                                                  First_pos=Find_pos_Substr(Receive_DATA,"CO2:");
  164.                                                  //输出第一个数字
  165.                                                  //SEND_STRING_TO_SBUF("First_pos=");
  166.                                                  //SEND_STRING_TO_SBUF((unsigned char *)(CONVERT_INT_TO_DECIMAL_STRING(First_pos)));
  167.                                                  //SEND_STRING_TO_SBUF("\r\n");
  168.                                                 
  169.                                                  End_pos=Find_pos_Substr(Receive_DATA,"ppm");
  170.                                                  //SEND_STRING_TO_SBUF("end_pos=");
  171.                                                  //SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING(End_pos));
  172.                                                  //SEND_STRING_TO_SBUF("\r\n");
  173.                                                 
  174.                                                  //SEND_STRING_TO_SBUF("COO2_uncode_data=");
  175.                                                                                                   
  176.                                                  i=0;
  177.                                                  for(j=(First_pos+4);j<(End_pos);j++)
  178.                                                  {
  179.                                                      COO2[i]=Receive_DATA[j];
  180.                                                          SEND_CHAR_TO_SBUF(COO2[i]);                                                         
  181.                                                          Delay1000us();
  182.                                                          i++;
  183.                                                          
  184.                                                  }
  185.                                                  //SEND_STRING_TO_SBUF("\r\n------------------------\r\n");
  186.                                                 
  187.                                                  digital_num1= End_pos-(First_pos+4);



  188.                                                  ///解码TVOC-----------------------------------------------------------------------------------------
  189.                                                  First_pos=Find_pos_Substr(Receive_DATA,"TVOC:");
  190.                                                  //输出第一个数字
  191.                                                  //SEND_STRING_TO_SBUF("First_pos=");
  192.                                                  //SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING(First_pos));
  193.                                                  //SEND_STRING_TO_SBUF("\r\n");
  194.                                                 
  195.                                                  End_pos=Find_pos_Substr(Receive_DATA,"ppb");
  196.                                                  //SEND_STRING_TO_SBUF("end_pos=");
  197.                                                  //SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING(End_pos));
  198.                                                  //SEND_STRING_TO_SBUF("\r\n");
  199.                                                 
  200.                                                  //SEND_STRING_TO_SBUF("TVOC_uncode_data==");
  201.                                          

  202.                                                 
  203.                                                  i=0;
  204.                                                  for(j=(First_pos+5);j<(End_pos);j++)
  205.                                                  {
  206.                                                      TVOC[i]=Receive_DATA[j];
  207.                                                          SEND_CHAR_TO_SBUF(TVOC[i]);                                                         
  208.                                                          Delay1000us();
  209.                                                          i++;
  210.                                                          
  211.                                                  }
  212.                                                  //SEND_STRING_TO_SBUF("\r\n------------------------\r\n");
  213.                                                                                           
  214.                                                  //计算出现数字的长度长度--------------
  215.                                                  digital_num2= End_pos-(First_pos+5);

  216.                                                 
  217.                                                 
  218.                                                 
  219.                                                  if (digital_num1>3)
  220.                                                  {
  221.                                                          COO2[0]= COO2[0]-'0';
  222.                                                          COO2[1]= COO2[1]-'0';
  223.                                                          COO2[2]= COO2[2]-'0';
  224.                                                          COO2[3]= COO2[3]-'0';
  225.                                                          COO2_int=COO2[0]*1000+COO2[1]*100+COO2[2]*10+COO2[3];
  226.                                                  }

  227.                                                  if (digital_num1==3)
  228.                                                  {
  229.                                                          COO2[0]= COO2[0]-'0';
  230.                                                          COO2[1]= COO2[1]-'0';
  231.                                                          COO2[2]= COO2[2]-'0';
  232.                                                 
  233.                                                          COO2_int=COO2[0]*100+COO2[1]*10+COO2[2];
  234.                                                  }

  235.                                                  if (digital_num1==2)
  236.                                                  {
  237.                                                          COO2[0]= COO2[0]-'0';
  238.                                                          COO2[1]= COO2[1]-'0';
  239.                                                 
  240.                                                          COO2_int=COO2[0]*10+COO2[1];
  241.                                                  }
  242.                                                  if (digital_num1==1)
  243.                                                  {
  244.                                                          COO2[0]= COO2[0]-'0';
  245.                                                 
  246.                                                          COO2_int=COO2[0];
  247.                                                  }

  248.                                                  //--------------------------------------------
  249.                                                 
  250.                                                  if (digital_num2>3)
  251.                                                  {
  252.                                                          TVOC[0]= TVOC[0]-'0';
  253.                                                          TVOC[1]= TVOC[1]-'0';
  254.                                                          TVOC[2]= TVOC[2]-'0';
  255.                                                          TVOC[3]= TVOC[3]-'0';
  256.                                                          TVOC_int=TVOC[0]*1000+TVOC[1]*100+TVOC[2]*10+TVOC[3];
  257.                                                  }

  258.                                                  if (digital_num2==3)
  259.                                                  {
  260.                                                          TVOC[0]= TVOC[0]-'0';
  261.                                                          TVOC[1]= TVOC[1]-'0';
  262.                                                          TVOC[2]= TVOC[2]-'0';
  263.                                                         
  264.                                                          TVOC_int=TVOC[0]*100+TVOC[1]*10+TVOC[2];
  265.                                                  }

  266.                                                   if (digital_num2==2)
  267.                                                  {
  268.                                                          TVOC[0]= TVOC[0]-'0';
  269.                                                          TVOC[1]= TVOC[1]-'0';
  270.                                                          TVOC_int=TVOC[0]*10+TVOC[1];
  271.                                                  }

  272.                                                   if (digital_num2==1)
  273.                                                  {
  274.                                                          TVOC[0]= TVOC[0]-'0';
  275.                                                          TVOC_int=TVOC[0];
  276.                                                  }


  277. */



  278. void main()
  279. {
  280.                

  281.                 unsigned char j=0;
  282.                 unsigned char i=0;
  283.                
  284.                 unsigned char q1;
  285.                 unsigned char q2;
  286.                 unsigned char q3;
  287.                 unsigned char q4;

  288.                 unsigned char First_pos=0;
  289.                 unsigned char End_pos=0;

  290.                 unsigned char digital_num1=0;
  291.                 unsigned char digital_num2=0;

  292.                 unsigned char get_char=0;
  293.                

  294.                 // P17 16  15  14  13  12  11 10
  295.                 //  0        0        0        0        0        0        0  0
  296.                 //        0        0        0        0        0        0        0  0   //
  297.                 P1M1 = P1M1 & 0x00;  //
  298.                   P1M0 = P1M0 | 0x00;  //

  299.         
  300.         
  301.                 //  0        0        0        0        0        0        0  0
  302.                 //        0        0        0        0        0        0        0  0   
  303.                 P2M1 = P2M1 & 0x00;  //
  304.                   P2M0 = P2M0 | 0x00;  //

  305.                 //配置P3口为准双向口**********************************************
  306.                 //发现将
  307.                 //  0        0        0        0        0        0        0  1
  308.                 //        0        0        0        0        0        0        0  0
  309.                 P3M1 = P3M1 & 0x00;  //
  310.                   P3M0 = P3M0 | 0x00;  //

  311.         
  312.                 //配置P5口**********************************************
  313.         
  314.                 //  0        0        0        0        0        0        0  0
  315.                 //        0        0        1        0        0        0        0  0
  316.                 P5M1 = P5M1 & 0x00;  
  317.                   P5M0 = P5M0 | 0x00;  
  318.         
  319.                 //--------------------------------------------------------------
  320.                 Config_Timer0();
  321.                 TR0=1;
  322.             //*************************        *********************************
  323.                   UART_INIT();

  324.                   UART2_INIT();
  325.                
  326.                 //*************************************************************
  327.                
  328.                 //**********************************************************
  329.         

  330.                 SEND_STRING_TO_SBUF("start....\r\n");

  331.            
  332.            //--------------------------------------------------------------------------
  333.                    q1=16;
  334.                 q2=16;        
  335.                 q3=0;
  336.                 q4=0;
  337.                                        
  338.                 TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(0,q1);
  339.                 TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(1,q2);
  340.                 TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(2,q3);
  341.                 TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(3,q4);

  342.                 //--------------------------------------------------------------------------

  343.        while(1)
  344.        {
  345.                         
  346.                         
  347.                         //无压力显示 ,左边位显示00,右边空
  348.                         if (Receive_Frame_Finish_FLAG==1)
  349.                     {
  350.                                                    
  351.                                                  //串口助手得到的数据是正确的
  352.                                                  SEND_STRING_TO_SBUF("---------------------\r\n");
  353.                                                  SEND_STRING_TO_SBUF("get_Data_From_S2==");
  354.                                                  SEND_STRING_TO_SBUF(Receive_DATA);
  355.                                              SEND_STRING_TO_SBUF("\r\n");

  356.                                                  //将串口2得到的数据存放在全局变量 COO2_int和TVOC_int
  357.                                                  COO2_int=0;
  358.                                                  TVOC_int=0;
  359.                                                  Get_Value(1);

  360.                                                  SEND_STRING_TO_SBUF("get_COO2_From_S2==");
  361.                                                  SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING(COO2_int));
  362.                                              SEND_STRING_TO_SBUF("\r\n");
  363.                                                 
  364.                                                  SEND_STRING_TO_SBUF("get_TVOC_From_S2==");
  365.                                                  SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING(TVOC_int));
  366.                                              SEND_STRING_TO_SBUF("\r\n");
  367.                                               Receive_Frame_Finish_FLAG=0;

  368.                         }


  369.                     //3秒时间到,显示温度,-------------------
  370.                          if (T0_time_out_flag==1)
  371.                          {
  372.                                 
  373.                                            if (COO2_int>1000)
  374.                                          {
  375.                                                 
  376.                                                  COO2[0]=COO2_int/1000;
  377.                                                  COO2[1]=(COO2_int%1000)/100;
  378.                                                  COO2[2]=(COO2_int%100)/10;
  379.                                                  COO2[3]=COO2_int%10;

  380.                                                  q1=COO2[0];
  381.                                                  q2=COO2[1];        
  382.                                                  q3=COO2[2];
  383.                                                  q4=COO2[3];
  384.                                          }

  385.                                          if  ((COO2_int>=100) && (COO2_int<1000))
  386.                                          {
  387.                                                 
  388.                                                  COO2[0]=COO2_int/100;
  389.                                                  COO2[1]=(COO2_int%100)/10;
  390.                                                  COO2[2]=COO2_int%10;
  391.                                                 
  392.                                                  q1=16;
  393.                                                  q2=COO2[0];        
  394.                                                  q3=COO2[1];
  395.                                                  q4=COO2[2];
  396.                                          }

  397.                                          if ((COO2_int>=10) && (COO2_int<100))
  398.                                          {
  399.                                                 
  400.                                                 
  401.                                                  COO2[0]=COO2_int/10;
  402.                                                  COO2[1]=COO2_int%10;
  403.                                                  q1=16;
  404.                                                  q2=16;        
  405.                
  406.                                                  q3=COO2[0];
  407.                                                  q4=COO2[1];
  408.                                          }

  409.                                          if ((COO2_int>=1) && (COO2_int<10))
  410.                                          {
  411.                                                 
  412.                                                  COO2[0]=COO2_int%10;
  413.                                                  q1=16;
  414.                                                  q2=16;        
  415.                
  416.                                                  q3=16;
  417.                                                  q4=COO2[0];
  418.                                          }
  419.                                 
  420.                                          TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(0,q1);
  421.                                          TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(1,q2);
  422.                                          TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(2,q3);
  423.                                          TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(3,q4);

  424.                                           //T0_time_out_flag==2,定时器计时的时间就是温度持续的时间
  425.                                          T0_time_out_flag=2;

  426.                          }


  427.                          if (T0_time_out_flag==3)
  428.                          {
  429.                                 
  430.                                  
  431.                                          if ((TVOC_int>=1) && (TVOC_int<10))
  432.                                          {
  433.                                                 
  434.                                                  TVOC[0]=TVOC_int%10;
  435.                                                  q1=16;
  436.                                                  q2=16;        
  437.                                                  q3=16;
  438.                                                  q4=TVOC[0];
  439.                                          }

  440.                                          if ((TVOC_int>=10) && (TVOC_int<100))
  441.                                          {
  442.                                                 
  443.                                                  TVOC[0]=TVOC_int/10;
  444.                                                  TVOC[1]=TVOC_int%10;
  445.                                                  q1=16;
  446.                                                  q2=16;        
  447.                
  448.                                                  q3=TVOC[0];
  449.                                                  q4=TVOC[1];
  450.                                          }

  451.                                          if ((TVOC_int>=100) && (TVOC_int<1000))
  452.                                          {
  453.                                                 
  454.                                                  TVOC[0]=(TVOC_int/100);
  455.                                                  TVOC[1]=(TVOC_int%100)/10;
  456.                                                  TVOC[2]=TVOC_int%10;

  457.                                                  q1=16;
  458.                                                  q2=TVOC[0];        
  459.                
  460.                                                  q3=TVOC[1];
  461.                                                  q4=TVOC[2];
  462.                                          }

  463.                                           if (TVOC_int>1000)
  464.                                          {
  465.                                                 
  466.                                                  TVOC[0]=(TVOC_int/1000);
  467.                                                  TVOC[1]=(TVOC_int%1000)/100;
  468.                                                  TVOC[2]=(TVOC_int%100)/10;
  469.                                                  TVOC[3]=TVOC_int%10;
  470.                                                  q1=TVOC[0];
  471.                                                  q2=TVOC[1];        
  472.                
  473.                                                  q3=TVOC[2];
  474.                                                  q4=TVOC[3];
  475.                                          }

  476.                                          
  477.                                            // T0_time_out_flag==0,就是湿度持续的时间---------------
  478.                                      T0_time_out_flag=0;


  479.                                          TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(0,q1);
  480.                                          TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(1,q2);
  481.                                          TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(2,q3);
  482.                                          TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(3,q4);



  483.                          }
  484.                         
  485.                                 
  486.                                 
  487.                                  
  488.         
  489.                
  490.                                  
  491.         }           



  492. }



  493. void Timer0_int() interrupt 1
  494. {

  495.           //  T0_time_out_flag==0 就是湿度持续的时间-----------------
  496.           if (T0_time_out_flag==0)
  497.           {

  498.                         T0_nnn++;
  499.         
  500.                         if (T0_nnn>1000)
  501.                         {
  502.                             T0_nnn=0;
  503.                                 T0_time_out_flag=1;
  504.                         
  505.                         }

  506.       }  

  507.           //  T0_time_out_flag==2 就是温度持续的时间-----------------
  508.           if (T0_time_out_flag==2)
  509.           {

  510.                     T0_mmm++;
  511.         
  512.                         if (T0_mmm>3000)
  513.                         {
  514.                             T0_mmm=0;
  515.                                 T0_time_out_flag=3;
  516.                         }



  517.           }


  518. }

复制代码

芯片资料.7z (5.84 MB, 下载次数: 17)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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