基于51单片机的PM2.5检测系统(粉尘,温湿度)
设计一款低成本,可用于检测空气中PM2.5浓度的测量仪。
PM2.5测量仪主要由微处理器模块、粉尘传感器、A-D转换电路模块、液晶显示模块、报警模块、键盘等组成
1、判断空气质量等级
2、可以查询历史测量结果(PM2.5,温度,湿度)
3、PM2.5浓度过高时报警
4、具有断电保存功能
4、测量范围0~999ug/m^3;
#include "reg51.h"
#include "intrins.h"
#include"TLC1543.h"
#include "SHT11.h"
#include "lcd1602.h"
#include"i2c.h"
#include"ds1302.h"
sbit beep=P1^7;//蜂鸣器
uint pm25=0;//PM2.5
uint limit=0;//阀值
uchar data1[]="PM:0000 Level:0 ";//PM2.5
uchar data2[]="T:000 C H:00%";//温湿度
/*uchar data3[]="00:00:00";//时间
uchar data4[]="0000 0 000 C 00%";//查询
uchar data5[]="Warning:0000";//阀值 */
uchar moshi=0;//模式指示
uchar sec=0,miao=0;//定时
uchar cixu=0;//测量存储
uchar number=0;
uchar key_scan()//按键检测
{
P3=0xfe;
switch(P3)//检测第1行
{
case 0xee:while(P3!=0xfe);return 1;
case 0xde:while(P3!=0xfe);return 2;
case 0xbe:while(P3!=0xfe);return 3;
case 0x7e:while(P3!=0xfe);return 4;
}
P3=0xfd;
switch(P3)//检测第2行
{
case 0xed:while(P3!=0xfd);return 5;
case 0xdd:while(P3!=0xfd);return 6;
case 0xbd:while(P3!=0xfd);return 7;
case 0x7d:while(P3!=0xfd);return 8;
}
P3=0xfb;
switch(P3)//检测第3行
{
case 0xeb:while(P3!=0xfb);return 9;
case 0xdb:while(P3!=0xfb);return 10;
case 0xbb:while(P3!=0xfb);return 11;
case 0x7b:while(P3!=0xfb);return 12;
}
P3=0xf7;
switch(P3)//检测第4行
{
case 0xe7:while(P3!=0xf7);return 13;
case 0xd7:while(P3!=0xf7);return 14;
case 0xb7:while(P3!=0xf7);return 15;
case 0x77:while(P3!=0xf7);return 16;
}
return 0;
}
void main()
{
uchar i;
Ds1302ReadTime();//初始化DS1302
TIME[0]=0;
Ds1302Init();
cixu=At24c02Read(105);//初始化存储变量
if(cixu>15)
{
cixu=1;
At24c02Write(105,1);
}
number=cixu-1;
limit=At24c02Read(106);//初始化阀值变量
limit=limit*256+At24c02Read(107);
if(limit>999)
{
limit=600;
At24c02Write(106,2);
At24c02Write(107,0x58);
}
data2[5]=0xdf;
//data4[10]=0xdf;
init_1602();
TMOD|=0X01;//初始化定时器
TH0=0X3C;
TL0=0XB0;
ET0=1;
EA=1;
TR0=1;
while(1)
{
i=key_scan();
//模式切换
if(i==1)
moshi=0;
if(i==2)
moshi=1;
if(i==3)
moshi=2;
if(moshi==2)//设置模式
{
if(i==7)//加
{
if(limit<900)
limit+=10;
At24c02Write(106,limit/256);
At24c02Write(107,limit%256);
}
if(i==11)//减
{
if(limit>0)
limit-=10;
At24c02Write(106,limit/256);
At24c02Write(107,limit%256);
}
if(i==8)//加
{
if(limit<900)
limit++;
At24c02Write(106,limit/256);
At24c02Write(107,limit%256);
}
if(i==12)//减
{
if(limit>0)
limit--;
At24c02Write(106,limit/256);
At24c02Write(107,limit%256);
}
}
if(moshi==1)//查询模式
{
if(i==6)//上一个
{
if(number>0)
number--;
}
if(i==10)//下一个
{
if(number<15)
number++;
}
if(i==14)//删除
{
At24c02Write(number*7,0);
At24c02Write(number*7+1,0);
At24c02Write(number*7+2,0);
At24c02Write(number*7+3,0);
At24c02Write(number*7+4,0);
At24c02Write(number*7+5,0);
At24c02Write(number*7+6,0);
}
}
}
}
//定时器中断
void Timer0() interrupt 1
{
uchar i;
uint j;
sec++;
if(sec==10) //定时0.5s
{
sec=0;
pm25=TLC1543_read(0);//PM2.5测量
ReadShtData();//温湿度测量
pm25=pm25/4;//校准
if(moshi==0)
{
data1[0]='P';
data1[1]='M';
data1[2]=':';
data1[3]=pm25/1000+0x30;
data1[4]=pm25%1000/100+0x30;
data1[5]=pm25%100/10+0x30;
data1[6]=pm25%10+0x30;
data1[7]=' ';
data1[8]='L';
data1[9]='e';
data1[10]='v';
data1[11]='e';
data1[12]='l';
data1[13]=':';
data1[14]=pm25/100+0x30;//等级
data1[15]=' ';
data2[0]='T';
data2[1]=':';
data2[2]=sht_temp/100+0x30;
data2[3]=sht_temp%100/10+0x30;
data2[4]=sht_temp%10+0x30;
data2[5]=0xdf;
data2[6]='C';
data2[7]=' ';
data2[8]='H';
data2[9]=':';
data2[10]=sht_humi/10+0x30;
data2[11]=sht_humi%10+0x30;
data2[12]='%';
data2[13]=' ';
data2[14]=' ';
data2[15]=' ';
}
//存储
if(miao<10)
miao++;
else
{
miao=0;
Ds1302ReadTime();//读取时间
At24c02Write(cixu*7,TIME[2]);
At24c02Write(cixu*7+1,TIME[1]);
At24c02Write(cixu*7+2,TIME[0]);
At24c02Write(cixu*7+3,pm25/256);
At24c02Write(cixu*7+4,pm25%256);
At24c02Write(cixu*7+5,sht_temp);
At24c02Write(cixu*7+6,sht_humi);
if(cixu<15)
cixu++;
else
cixu=0;
At24c02Write(105,cixu);
}
//报警
if(pm25>limit)
beep=0;
else
beep=1;
//============================================
if(moshi==2)//设置模式
{
data1[0]='W';
data1[1]='a';
data1[2]='r';
data1[3]='n';
data1[4]='i';
data1[5]='n';
data1[6]='g';
data1[7]=':';
data1[8]=limit/1000+0x30;
data1[9]=limit%1000/100+0x30;
data1[10]=limit%100/10+0x30;
data1[11]=limit%10+0x30;
data1[12]=' ';
data1[13]=' ';
data1[14]=' ';
data1[15]=' ';
}
//=============================================
if(moshi==1)//查询模式
{
i=At24c02Read(number*7);//时
data1[0]=(i>>4)+0x30;
data1[1]=(i&0x0f)+0x30;
data1[2]=':';
i=At24c02Read(number*7+1);//分
data1[3]=(i>>4)+0x30;
data1[4]=(i&0x0f)+0x30;
data1[5]=':';
i=At24c02Read(number*7+2);//秒
data1[6]=(i>>4)+0x30;
data1[7]=(i&0x0f)+0x30;
data1[8]=' ';
data1[9]=' ';
data1[10]=' ';
data1[11]=' ';
data1[12]=' ';
data1[13]=' ';
data1[14]=' ';
data1[15]=' ';
j=At24c02Read(number*7+3);//pm25
j=j*256+At24c02Read(number*7+4);
data2[0]=j/1000+0x30;
data2[1]=j%1000/100+0x30;
data2[2]=j%100/10+0x30;
data2[3]=j%10+0x30;
data2[4]=' ';
data2[5]=j/100+0x30;
data2[6]=' ';
i=At24c02Read(number*7+5);//温度
data2[7]=i/100+0x30;
data2[8]=i%100/10+0x30;
data2[9]=i%10+0x30;
data2[10]=0xdf;
data2[11]='C';
data2[12]=' ';
i=At24c02Read(number*7+6);//湿度
data2[13]=i/10+0x30;
data2[14]=i%10+0x30;
data2[15]='%';
}
//显示
switch(moshi)
{
case 0://测量模式
write_string(1,0,data1);
write_string(2,0,data2);
break;
case 1://查询模式
write_string(1,0,data1);
write_string(2,0,data2);
break;
case 2://设置模式
write_string(1,0," ");
write_string(2,0,data1);
}
}
TH0=0X3C;
TL0=0XB0;
}