STC15F2KA60S2芯片粉尘传感器的应用
1.粉尘有什么危害?
什么是粉尘?
总悬浮颗粒物(TSP)—环境空气中空气动力学当量直径小于等于100μm的颗粒物。
• PM10—环境空气中空气动力学当量直径小于等于10μm的颗粒物。
• PM2.5—环境空气中空气动力学当量直径小于等于2.5μm的颗粒物。
粉尘对人体的危害,根据其理化性质、进入人体的量的不同,可引起不同的病变。如呼吸性系统疾病、局部作用、中毒作用等。
职业性呼吸系统疾病有如下4种表现
1.尘肺
2.粉尘沉着症
3.有机粉尘引起的肺部病变
4.呼吸系统肿瘤
2. 目的:
随着经济的发展,大气中的污染物也随之增加了许多。现如今的雾霾天气也越来越严重,这些恶劣的天气与空气中的粉尘有着紧密的关系,当然也与其他的因素有关。为了时刻使人们能够更加直观地了解到自己所处环境中粉尘的浓度,这才引进了基于51单片机的GE粉尘传感器技术,这样才能够对大气进行全方位,实时性地采集与处理。
3.粉尘传感器工作原理
① 光散射方法
② LED发射出光线遇粉尘产生反射光
③ 接收传感器检测到反射光的光强,输出信号
④ 通过光强的大小判断粉尘的浓度。
4.传感器内部设计
• 连续光发射的IR LED
• 可见光滤波器,减少外界光线干扰
• 线性电源控制,稳压器稳定探测器的电压,减少噪声
• MICOM自动控制传感器的灵敏度,消除偏移,信噪比好
• 使用加热电阻形成自然向上气流
5.传感器输出
空气中粉尘浓度的计算方法:
一个规定的周期内所有低脉冲时间之和除以这个周期时间。
6.程序
/************************************************************/
//利用单片机P1.0测试10秒内接收到的低脉冲时长
//计算10秒内空气中平均粉尘浓度,并显示。
/************************************************************/
#include<reg51.h>
unsigned charseven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned intj,k,counter1,counter2,dat1=1,dat2;
unsigned int i;
sbit P1_0 = P1^0; //脉冲输入
bit P1_0_S;
/*******************Timer0中断服务函数**********************/
voidtimer0_isr(void) interrupt 1
{
TH0 = (65536 - 1000) / 255;
TL0 = (65536 - 1000) % 255;
i++;
if(P1_0 == 0){P1_0_S = 1;counter2++;} //检测低电平并计时
if(P1_0 == 1 && P1_0_S == 1)
{P1_0_S = 0;counter1++;} //检测脉冲个数
if(i >= 10000) //10秒到了
{
i = 0;
dat2 = counter2 * 0.1; //求10秒内平均值
counter1 = 0;
counter2 = 0;
if(dat2 <= 130)dat1 = 1; //颗粒物等级显示
else
{
if(dat2 >=250)dat1 = 3;
else dat1 = 2;
}
}
P0 = 0xff; //Proteus仿真需要消隐
switch(j)
{
case 0: P0 = seven_seg[dat2 % 100% 10];
P2 = ~0x01;break;
case 1: P0 = seven_seg[dat2 % 100/ 10];
P2 = ~0x02;break;
case 2: P0 = seven_seg[dat2 % 1000/ 100] & 0x7f;
P2 = ~0x04;break;
case 3: P0 = seven_seg[dat2 %10000 / 1000];
P2 = ~0x08;break;
case 4:
P2 = ~0x00;break;
case 5: P0 = seven_seg[dat1 % 10]; //显示颗粒物污染等级
P2 = ~0x20;break;
}
j++;
if(j >= 6)
j = 0;
}
/*********************Timer0初始化函数***********************/
voidtimer0_init(void)
{
TMOD = 0x01;
TH0 = (65536 - 1000) / 255;
TL0 = (65536 - 1000) % 255;
EA = 1;
ET0 = 1;
TR0 = 1;
}
/**************************主函数****************************/
void main(void)
{
timer0_init();
while(1);
}