赞
踩
基于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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。