久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1859|回復: 0
打印 上一主題 下一主題
收起左側

單片機+維特COO2傳感器的二氧化碳測量程序與資料 串口輸出數據

[復制鏈接]
跳轉到指定樓層
樓主
制作出來的實物圖如下:



單片機源程序如下:
  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, 下載次數: 18)




評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品一区免费 | 羞羞视频在线网站观看 | 国产精品成人一区二区三区 | 日韩成人免费中文字幕 | 久久亚洲天堂 | 亚洲一区在线日韩在线深爱 | 欧美精品一区二区在线观看 | 亚洲日韩第一页 | 精品91 | 91亚洲国产成人久久精品网站 | 天天天天操 | av中文在线 | 国产成人精品一区二区三区网站观看 | 免费黄视频网站 | 国产精品久久亚洲7777 | 草久网| 精品国产乱码久久久久久丨区2区 | 久久99精品久久久久久琪琪 | 亚洲aⅴ精品 | 欧美亚洲国产成人 | 亚洲一区久久 | 一级欧美一级日韩片 | 日韩有码在线观看 | 国户精品久久久久久久久久久不卡 | 男人天堂999 | 国产亚洲成av人片在线观看桃 | 国产精品毛片一区二区三区 | 亚洲福利视频网 | 亚洲一区国产 | 欧美中文字幕一区 | 日韩精品一二三 | 欧美性受| 男女免费网站 | 久久久久网站 | 一级看片 | 国内自拍第一页 | 亚洲二区在线 | 亚洲国产成人精品久久 | 成人黄色电影在线观看 | 中文字幕成人免费视频 | 欧美日韩亚洲国产 |