基于51单片机的PM2.5检测系统(粉尘,温湿度)原理图、流程图、物料清单、仿真图、源代码

请添加图片描述

基于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;
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqtianxingkeji

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值