历史上的今天
今天是:2024年10月08日(星期二)
2021年10月08日 | 基于51单片机的PM2.5+温湿度检测仪
2021-10-08 来源:eefocus
一.硬件方案
单片机实时通过ADC0832转换芯片采集GP2Y1010AU粉尘传感器的粉尘的浓度,和读取环境的温湿度,通过单片机的数据转换处理后在液晶屏上显示空气中的质量,当测量空间中的粉尘浓度、温度、湿度大于设置值时,蜂鸣器和发光二极管发出声光报警。粉尘的浓度、温度、湿度报警值可以通过按键进行设置。
主要由51单片机(STC89C52/51、AT89C52/51)+LCD1602液晶+ADC0832+蜂鸣器+DHT11温湿度传感器 +按键+GP2Y1010AUOF粉尘传感器+发光二极管设计而成;如图:

二.设计功能
(1)LCD1602液晶第一行显示当前测到PM2.5空气质量值,第二行显示当前温度和湿度值。
(2)使用夏普的GP2Y1010AUOF粉尘传感器实时检测空气中的PM2.5值并通过1602显示出来,检测更加准确。
(3)当粉尘浓度值高于设定值时、温度湿度超出上下限范围,蜂鸣器和指示灯会发出声光报警。
(4)PM2.5值具有等级划分功能。用3个不同颜色的指示灯指示不同范围。绿灯亮表示环境良好,黄灯亮表示轻度污染,红灯亮,表示重度污染。
(5)本系统设置有4个按键,除1个为复位按键外,其他三个按键用来设定浓度报警值的,分别为减键、加键、设置键,设定的参数具有掉电保存,保存在STC单片机的内部,上电无需重新设置。
三.设计原理图
(1)原理图主要采用AD软件进行设计,如图:

(2)Protues仿真图如下:

(3)PCB图如下:

四.软件设计
主程序源码
/************************************************
** 函数名称 : void main(void)
** 函数功能 : 主函数
** 输 入 : 无
** 输 出 : 无
** 说 明 :
************************************************/
void main(void)
{
double PM,pm1,pm2;
int PMVAL=0,HPM=200,PM_count=0,pm1_count=0;
uchar T1_data=0,R1_data=0,T2_data=0,R2_data=0;//温度、湿度变量
uchar shezhi_flag=1,Mode_flag=1,n=1;//设置变量
uchar bueezr_flag=0,count=0,buzzer_time=9;//蜂鸣器报警变量
uint Mode_count=0;
uchar disp[16] ={"PM2.5:0000ug/m3 "};
uchar disp1[16]= {"T :00C RH:00%"};
uchar Tx_Buf[15];
InitUART(); //初始化串口
LCD_Init();
WriteChar(1,0,16,disp); //在第一行显示‘内容’
WriteChar(2,0,16,disp1); //在第二行显示‘内容’
while(1)
{
T1_data=Read_TRH(0,0);//温度
disp1[3]=T1_data/10+0x30;//十位
disp1[4]=T1_data%10+0x30;//个位
R1_data=Read_TRH(1,0);//湿度
disp1[13]=R1_data/10+0x30;//十位
disp1[14]=R1_data%10+0x30;//个位
pm1+=read_data(1);
if(++PM_count>=20)
{
PM_count=0;
pm1=pm1/20;
pm2+=pm1;
pm1=0;
if(++pm1_count>=5)
{
pm1_count=0;
PM=pm2/5;
PM=PM*50/255;
PM-=4;
PM/=5;
PM*=1000;
PMVAL=PM;
PMVAL+=235; PMVAL=PMVAL/9;
if(PMVAL>=9999)PMVAL=9999;
WriteCOMDATA(0x86,0);
if(PMVAL<0)//PMVAL=0;
{WriteCOMDATA(0+0x30,1);PMVAL=abs(PMVAL);}
else WriteCOMDATA(PMVAL/1000+0x30,1);
WriteCOMDATA(PMVAL/100%10+0x30,1);
WriteCOMDATA(PMVAL/10%10+0x30,1);
WriteCOMDATA(PMVAL%10+0x30,1);
PM=pm1=pm2=0;
}
}
/*调用报警函数,温湿度是否在设定范围内*/
//温度值与报警值比较
if(T1_data bueezr_flag=1;//报警标志位置1 } else if(T1_data>T1H) { bueezr_flag=1;//报警标志位置1 } //湿度值与报警值比较 if(R1_data bueezr_flag=1;//报警标志位置1 } else if(R1_data>R1H) { bueezr_flag=1;//报警标志位置1 } //PM值与报警值比较 if(PMVAL>HPM) { bueezr_flag=1; } if(T1_data>T1L&&T1_data bueezr_flag=0; BUZZER=1; } /*******蜂鸣器报警********/ count++;if(count>buzzer_time*10)count=buzzer_time+1; if(count%buzzer_time==0 && bueezr_flag) { BUZZER=~BUZZER;//蜂鸣器取反 发出声音提示 } /*******Mode键设置报警参数********/ if(Mode==0 && Mode_flag) { WriteCOMDATA(0x0F,0);//LCD显示光标 Delay(100); if(Mode==0) { BUZZER=1; bueezr_flag=0; Mode_flag=0; shezhi_flag=1; n=1; while(1) { key(); if(Mode_count>6) { Mode_count=0;shezhi_flag=0; //当下限值大于上限值时,蜂鸣器鸣叫1S提示,参数设置有误 if(T1L>T1H || R1L>R1H) { BUZZER=0;Delay(1000);BUZZER=1; } //否则退出设置页面,返回主页面 else { WriteCOMDATA(0x0C,0);//关闭LCD光标 Delay(10); n=0; break; } } else Mode_count=0; shezhi_flag++; if(shezhi_flag>5)shezhi_flag=1; if(shezhi_flag==1 || shezhi_flag==5)n=1; pm1+=read_data(1); if(++PM_count>=20) { PM_count=0; pm1=pm1/20; pm2+=pm1; pm1=0; if(++pm1_count>=15) { pm1_count=0; PM=pm2/15; PM=PM*50/255; PM-=4; PM/=5; PM*=1000; PMVAL=PM; PMVAL-=480; PMVAL=PMVAL/3; if(PMVAL>=9999)PMVAL=9999; PM=pm1=pm2=0; } } } } } } /********LCD1602显示********/ //WriteChar(1,0,16,disp); //在第一行显示‘内容’ WriteChar(2,0,16,disp1); //在第二行显示‘内容’ } }
上一篇:基于51单片机自动售货机设计
下一篇:基于51单片机的分贝检测仪设计
史海拾趣
|
与各位探讨: RFIC的整体电路结构和集总参数射频电路区别不大,差异是因为在芯片里有些元件需要用工艺可以实现的方式设计。 集成电路有它的特点,例如在IC中,线间距离和线的尺寸都很小,由此在分立电路中不会出现或影响不显著的一些物理效应( ...… 查看全部问答> |
|
关于传感器采样液体微量变化的问题? 想用传感器采样液体的微量变化,然后试了试挂吊瓶,用传感器采样滴液的变化情况,感觉液体在滴啊,但是采样值却是一会大一会小,完全没有规律,一点也没呈现出线性变小的趋势。这是怎么回事? ...… 查看全部问答> |
|
用CETK测试CE下的DirectDraw的性能,测试结果显示330号的FLIP功能测试通过,但为什么DirectDraw的DDEX1测试例子测试不行呢?CE自 用CETK测试CE下的DirectDraw的性能,测试结果显示330号的FLIP功能测试通过,但为什么DirectDraw的DDEX1测试例子测试不行呢?CE自带的DDEX1例子调到了FLIP()函数… 查看全部问答> |
|
基于arm9(EP9302)的开发板运行一个wince系统,读写总线问题: 在wince上写了一个小的测试程序, while循环读取一个虚拟地址(DI)的值, 再把这个值写到另一个虚拟地址(DO)上. 结果是:用示波器测得总线上的写信号正常, 读信号间隔时间有时要几秒钟才 ...… 查看全部问答> |
|
就以SD卡为例子 注册表 [HKEY_LOCAL_MACHINE\\Drivers\\BuiltIn\\SDHC_SMDK2440] \"Order\"=dword:21 \"Dll\"=\"sdhc_sc2440.dll\" \"Prefix\"=\"SDH\" \"DMAChann ...… 查看全部问答> |




