|
制作出來的實物圖如下:
WEITE_COO2.jpg (149.4 KB, 下載次數: 48)
下載附件
裝置
2022-12-1 16:38 上傳
Snap_2021.10.22 17.12.16_06.png (208.6 KB, 下載次數: 46)
下載附件
傳感器
2022-12-1 16:38 上傳
串口解碼數據--9600bps.png (82.21 KB, 下載次數: 49)
下載附件
2022-12-1 16:38 上傳
重要:串口1接收到數據--準備解碼.png (75.8 KB, 下載次數: 44)
下載附件
2022-12-1 16:38 上傳
單片機源程序如下:
- /*
- 本機器下載頻率11.0592M
- 將維特空氣質量串口接到串口2
- 串口1輸出原始數據--------------
- */
- //-------------------------------------------------------------------------
- #include <STC15W408AS.H>
- #include <intrins.H>
- #include <math.H>
- #include <TM1637.C>
- #include <STC15W_UART.H>
- #include <STC15W_UART2.H>
- #include <string.H>
- //-------------------------------------------------------------------------
- unsigned char COO2[6];
- unsigned char TVOC[6];
- unsigned int T0_nnn=0;
- unsigned int T0_mmm=0;
- unsigned char T0_time_out_flag=0;
- unsigned int COO2_int=0;
- unsigned int TVOC_int=0;
- unsigned int abc=0;
- //----------------------------------------------------------------------------------------------------
- void Config_Timer0() //1000微秒@11.0592.000MHz
- {
-
-
- //----------------------------------------------------------------
- // T0X12 T1X12 UART_MX06 T2R T2_C/T T2X12 EXT_RAM S1ST2
- // 1 0 0 0 0 0 0 0
-
- // 0 12分頻; T1 12分頻
- // 1 1T模式
-
- AUXR |= 0x80; //定時器時鐘1T模式
-
-
- //EXT_RAM ==0 允許使用內部1024字節RAM
-
- //---------------------------------------------------------------
- //GATE C/T M1 M0 GATE C/T M1 M0
- // 0 0 0 0 0 0 0 0
- // T1 T0 模式0
- // 自動重裝16位模式
-
- TMOD &= 0xF0; //設置定時器模式,自動重裝初值*****************
-
-
- //--------12T下定時器計算方法----------------------------------
-
- // 24M
- //65536-1000------------
- // 12(分頻)
-
- // 24M
- //65536-1000------------ = 41536=0XA240H,明白了沒有?
- // 1 (1分頻)
-
- // 24M
- //65536-500------------ = 53536=0XD120H,明白了沒有?
- // 1 (1分頻)
-
- // 24M
- //65536-600------------ = 51136=0XC7C0H,明白了沒有?
- // 1 (1分頻)
-
-
- TL0 = 0xCD; //設置定時初值
- TH0 = 0xD4; //設置定時初值
-
- TF0 = 0; //清除TF1標志
- TR0 = 0; //定時器1開始計時
-
- ET0=0;
-
- //---------- * * * * *---------PT0------------------------
- // PS PT1 PX1 PT0 PX0
- //IP= 0X02;
-
- EA=1;
-
- }
- void Delay1000us() //@11.0592MHz
- {
- unsigned char i, j;
- _nop_();
- _nop_();
- _nop_();
- i = 11;
- j = 190;
- do
- {
- while (--j);
- } while (--i);
- }
- void Get_Value(unsigned char flag)//CCS811數據解析
- {
- unsigned char *p;
- unsigned char get_char=0;
- p=Receive_DATA;
-
- if(flag==1)
- {
-
-
- p=(unsigned char*)strstr((char *)Receive_DATA,"CO2:")+4;
- while(*p!='p') //ppm
- {
-
- if ((*p>='0') && (*p<='9'))
- {
-
- /* 假如是'416'
- '4'----0+4=4
- '1'----40+1=41
- '6'----410+6=416
- */
-
-
-
- COO2_int=COO2_int*10;
- get_char=*p;
- get_char=get_char-0x30;
- COO2_int=COO2_int+(get_char);
- //SEND_CHAR_TO_SBUF(*p);
- //SEND_CHAR_TO_SBUF('-');
- //SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING(COO2_int));
- //SEND_STRING_TO_SBUF("\r\n");
- //經過檢驗是對的
-
- }
-
-
- p++;
-
-
- }
- p=(unsigned char*)strstr((char*)Receive_DATA,"TVOC:")+4;
- while(*p!='p') //ppb
- {
- if(*p>='0'&&*p<='9')
- {
-
- TVOC_int=TVOC_int*10+(*p-'0');
- //經過檢驗是對的
- //SEND_CHAR_TO_SBUF(*p);
- }
- p++;
- }
- if(strstr((char*)Receive_DATA,"CO2 = ")!=NULL && strstr((char*)Receive_DATA,"TVOS = ")!=NULL)
-
-
- flag=0;
- }
- }
- /*
-
- //存儲在數組中的樣子--------------------------------
- CO2:410ppm,TVOC:1ppb
- 0123456789ABCDEFGH
-
- ///解碼COO2--------------------------------------------------------------------------------------------
- First_pos=Find_pos_Substr(Receive_DATA,"CO2:");
- //輸出第一個數字
- //SEND_STRING_TO_SBUF("First_pos=");
- //SEND_STRING_TO_SBUF((unsigned char *)(CONVERT_INT_TO_DECIMAL_STRING(First_pos)));
- //SEND_STRING_TO_SBUF("\r\n");
-
- End_pos=Find_pos_Substr(Receive_DATA,"ppm");
- //SEND_STRING_TO_SBUF("end_pos=");
- //SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING(End_pos));
- //SEND_STRING_TO_SBUF("\r\n");
-
- //SEND_STRING_TO_SBUF("COO2_uncode_data=");
-
- i=0;
- for(j=(First_pos+4);j<(End_pos);j++)
- {
- COO2[i]=Receive_DATA[j];
- SEND_CHAR_TO_SBUF(COO2[i]);
- Delay1000us();
- i++;
-
- }
- //SEND_STRING_TO_SBUF("\r\n------------------------\r\n");
-
- digital_num1= End_pos-(First_pos+4);
- ///解碼TVOC-----------------------------------------------------------------------------------------
- First_pos=Find_pos_Substr(Receive_DATA,"TVOC:");
- //輸出第一個數字
- //SEND_STRING_TO_SBUF("First_pos=");
- //SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING(First_pos));
- //SEND_STRING_TO_SBUF("\r\n");
-
- End_pos=Find_pos_Substr(Receive_DATA,"ppb");
- //SEND_STRING_TO_SBUF("end_pos=");
- //SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING(End_pos));
- //SEND_STRING_TO_SBUF("\r\n");
-
- //SEND_STRING_TO_SBUF("TVOC_uncode_data==");
-
-
- i=0;
- for(j=(First_pos+5);j<(End_pos);j++)
- {
- TVOC[i]=Receive_DATA[j];
- SEND_CHAR_TO_SBUF(TVOC[i]);
- Delay1000us();
- i++;
-
- }
- //SEND_STRING_TO_SBUF("\r\n------------------------\r\n");
-
- //計算出現數字的長度長度--------------
- digital_num2= End_pos-(First_pos+5);
-
-
-
- if (digital_num1>3)
- {
- COO2[0]= COO2[0]-'0';
- COO2[1]= COO2[1]-'0';
- COO2[2]= COO2[2]-'0';
- COO2[3]= COO2[3]-'0';
- COO2_int=COO2[0]*1000+COO2[1]*100+COO2[2]*10+COO2[3];
- }
- if (digital_num1==3)
- {
- COO2[0]= COO2[0]-'0';
- COO2[1]= COO2[1]-'0';
- COO2[2]= COO2[2]-'0';
-
- COO2_int=COO2[0]*100+COO2[1]*10+COO2[2];
- }
- if (digital_num1==2)
- {
- COO2[0]= COO2[0]-'0';
- COO2[1]= COO2[1]-'0';
-
- COO2_int=COO2[0]*10+COO2[1];
- }
- if (digital_num1==1)
- {
- COO2[0]= COO2[0]-'0';
-
- COO2_int=COO2[0];
- }
- //--------------------------------------------
-
- if (digital_num2>3)
- {
- TVOC[0]= TVOC[0]-'0';
- TVOC[1]= TVOC[1]-'0';
- TVOC[2]= TVOC[2]-'0';
- TVOC[3]= TVOC[3]-'0';
- TVOC_int=TVOC[0]*1000+TVOC[1]*100+TVOC[2]*10+TVOC[3];
- }
- if (digital_num2==3)
- {
- TVOC[0]= TVOC[0]-'0';
- TVOC[1]= TVOC[1]-'0';
- TVOC[2]= TVOC[2]-'0';
-
- TVOC_int=TVOC[0]*100+TVOC[1]*10+TVOC[2];
- }
- if (digital_num2==2)
- {
- TVOC[0]= TVOC[0]-'0';
- TVOC[1]= TVOC[1]-'0';
- TVOC_int=TVOC[0]*10+TVOC[1];
- }
- if (digital_num2==1)
- {
- TVOC[0]= TVOC[0]-'0';
- TVOC_int=TVOC[0];
- }
- */
- void main()
- {
-
- unsigned char j=0;
- unsigned char i=0;
-
- unsigned char q1;
- unsigned char q2;
- unsigned char q3;
- unsigned char q4;
- unsigned char First_pos=0;
- unsigned char End_pos=0;
- unsigned char digital_num1=0;
- unsigned char digital_num2=0;
- unsigned char get_char=0;
-
- // P17 16 15 14 13 12 11 10
- // 0 0 0 0 0 0 0 0
- // 0 0 0 0 0 0 0 0 //
- P1M1 = P1M1 & 0x00; //
- P1M0 = P1M0 | 0x00; //
-
-
- // 0 0 0 0 0 0 0 0
- // 0 0 0 0 0 0 0 0
- P2M1 = P2M1 & 0x00; //
- P2M0 = P2M0 | 0x00; //
- //配置P3口為準雙向口**********************************************
- //發現將
- // 0 0 0 0 0 0 0 1
- // 0 0 0 0 0 0 0 0
- P3M1 = P3M1 & 0x00; //
- P3M0 = P3M0 | 0x00; //
-
- //配置P5口**********************************************
-
- // 0 0 0 0 0 0 0 0
- // 0 0 1 0 0 0 0 0
- P5M1 = P5M1 & 0x00;
- P5M0 = P5M0 | 0x00;
-
- //--------------------------------------------------------------
- Config_Timer0();
- TR0=1;
- //************************* *********************************
- UART_INIT();
- UART2_INIT();
-
- //*************************************************************
-
- //**********************************************************
-
- SEND_STRING_TO_SBUF("start....\r\n");
-
- //--------------------------------------------------------------------------
- q1=16;
- q2=16;
- q3=0;
- q4=0;
-
- TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(0,q1);
- TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(1,q2);
- TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(2,q3);
- TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(3,q4);
- //--------------------------------------------------------------------------
- while(1)
- {
-
-
- //無壓力顯示 ,左邊位顯示00,右邊空
- if (Receive_Frame_Finish_FLAG==1)
- {
-
- //串口助手得到的數據是正確的
- SEND_STRING_TO_SBUF("---------------------\r\n");
- SEND_STRING_TO_SBUF("get_Data_From_S2==");
- SEND_STRING_TO_SBUF(Receive_DATA);
- SEND_STRING_TO_SBUF("\r\n");
- //將串口2得到的數據存放在全局變量 COO2_int和TVOC_int
- COO2_int=0;
- TVOC_int=0;
- Get_Value(1);
- SEND_STRING_TO_SBUF("get_COO2_From_S2==");
- SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING(COO2_int));
- SEND_STRING_TO_SBUF("\r\n");
-
- SEND_STRING_TO_SBUF("get_TVOC_From_S2==");
- SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING(TVOC_int));
- SEND_STRING_TO_SBUF("\r\n");
- Receive_Frame_Finish_FLAG=0;
- }
- //3秒時間到,顯示溫度,-------------------
- if (T0_time_out_flag==1)
- {
-
- if (COO2_int>1000)
- {
-
- COO2[0]=COO2_int/1000;
- COO2[1]=(COO2_int%1000)/100;
- COO2[2]=(COO2_int%100)/10;
- COO2[3]=COO2_int%10;
- q1=COO2[0];
- q2=COO2[1];
- q3=COO2[2];
- q4=COO2[3];
- }
- if ((COO2_int>=100) && (COO2_int<1000))
- {
-
- COO2[0]=COO2_int/100;
- COO2[1]=(COO2_int%100)/10;
- COO2[2]=COO2_int%10;
-
- q1=16;
- q2=COO2[0];
- q3=COO2[1];
- q4=COO2[2];
- }
- if ((COO2_int>=10) && (COO2_int<100))
- {
-
-
- COO2[0]=COO2_int/10;
- COO2[1]=COO2_int%10;
- q1=16;
- q2=16;
-
- q3=COO2[0];
- q4=COO2[1];
- }
- if ((COO2_int>=1) && (COO2_int<10))
- {
-
- COO2[0]=COO2_int%10;
- q1=16;
- q2=16;
-
- q3=16;
- q4=COO2[0];
- }
-
- TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(0,q1);
- TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(1,q2);
- TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(2,q3);
- TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(3,q4);
- //T0_time_out_flag==2,定時器計時的時間就是溫度持續的時間
- T0_time_out_flag=2;
- }
- if (T0_time_out_flag==3)
- {
-
-
- if ((TVOC_int>=1) && (TVOC_int<10))
- {
-
- TVOC[0]=TVOC_int%10;
- q1=16;
- q2=16;
- q3=16;
- q4=TVOC[0];
- }
- if ((TVOC_int>=10) && (TVOC_int<100))
- {
-
- TVOC[0]=TVOC_int/10;
- TVOC[1]=TVOC_int%10;
- q1=16;
- q2=16;
-
- q3=TVOC[0];
- q4=TVOC[1];
- }
- if ((TVOC_int>=100) && (TVOC_int<1000))
- {
-
- TVOC[0]=(TVOC_int/100);
- TVOC[1]=(TVOC_int%100)/10;
- TVOC[2]=TVOC_int%10;
- q1=16;
- q2=TVOC[0];
-
- q3=TVOC[1];
- q4=TVOC[2];
- }
- if (TVOC_int>1000)
- {
-
- TVOC[0]=(TVOC_int/1000);
- TVOC[1]=(TVOC_int%1000)/100;
- TVOC[2]=(TVOC_int%100)/10;
- TVOC[3]=TVOC_int%10;
- q1=TVOC[0];
- q2=TVOC[1];
-
- q3=TVOC[2];
- q4=TVOC[3];
- }
-
- // T0_time_out_flag==0,就是濕度持續的時間---------------
- T0_time_out_flag=0;
- TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(0,q1);
- TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(1,q2);
- TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(2,q3);
- TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(3,q4);
- }
-
-
-
-
-
-
-
- }
- }
- void Timer0_int() interrupt 1
- {
- // T0_time_out_flag==0 就是濕度持續的時間-----------------
- if (T0_time_out_flag==0)
- {
- T0_nnn++;
-
- if (T0_nnn>1000)
- {
- T0_nnn=0;
- T0_time_out_flag=1;
-
- }
- }
- // T0_time_out_flag==2 就是溫度持續的時間-----------------
- if (T0_time_out_flag==2)
- {
- T0_mmm++;
-
- if (T0_mmm>3000)
- {
- T0_mmm=0;
- T0_time_out_flag=3;
- }
- }
- }
復制代碼
芯片資料.7z
(5.84 MB, 下載次數: 18)
2022-12-1 17:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|