|
制作出来的实物图如下:
单片机源程序如下:
- /*
- 本机器下载频率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)
|
评分
-
查看全部评分
|