目 录
绪 论 1
1.1课题的目的及意义 1
1.1.1室内空气品质(IAQ)的重要性 1
1.1.2课题研究目的及意义 2
1.2国内外的研究状况 2
1.3本文的主要研究内容及总体方案设计 3
1.3.1本文的主要研究内容 3
1.3.2总体方案设计 3
第二章 室内空气品质基本介绍 4
2.1室内空气品质及认识 4
2.1.1室内空气研究的背景 4
2.1.2室内污染物种类及来源分析 4
2.1.3室内空气品质的几点认识 5
2.2室内空气品质的监测方法及改善空气品质的方法 5
2.2.1室内空气品质监测方法 5
2.2.2改善空气品质方法 6
2.3室内空气品质测试指标的选定 6
第三章室内空气品质监测仪的硬件设计 8
3.1室内空气品质监测仪系统简介 8
3.1.1系统硬件结构及原理 8
3.1.2 AT89S52单片机简介 9
3.1.3 AT89S52单片机与其扩展 10
3.2传感器的选用 10
3.2.1气体传感器 10
3.2.2温湿传感器 14
3.3前置放大滤波电路的设计 17
3.4模数转换电路的设计 20
3.5声光报警电路的设计 21
3.6液晶显示电路设计 21
3.7复位电路设计 22
3.8电源电路设计 23
3.9本章小结 23
第四章 室内空气品质监测仪的软件设计 24
4.1系统软件设计思路 24
4.1.1编程语言的选择 24
4.1.2软件功能需求 24
4.2软件模块设计 26
4.2.1主程序模块 26
4.2.2 AD转换模块 26
4.2.3液晶显示模块 27
4.2.4声光报警模块 28
4.3本章小结 28
第五章 仿真调试 29
5.1 Proteus 软件仿真调试 29
5.1.1显示电路调试 29
5.1.2键盘电路以及气体测量电路调试 29
5.1.3温湿度测量电路调试 30
5.1.4声光报警电路调试 32
5.2 实物调试 33
5.3本章小结. 36
第六章 结论与展望 37
6.1主要结论 37
6.2展望 37
参考文献 38
附 录 39
附录一 原理电路图 39
附录二 PCB板 40
附录三 程序清单 41
致 谢 65
1.3本文的主要研究内容及总体方案设计
1.3.1本文的主要研究内容
本课题主要集中在IAQ的监测、显示、报警三个方面。本文内容安排如下:
第一章:室内空气品质监测课题的提出及意义,介绍国内外的研究状况及确定总体方案。
第二章:监测系统的具体方案的选择 (1)确定监测对象:选择有代表性的监测对象是进行下一步研究的关键;(2)布置采样点:根据选用的传感器的特点,及待测指标的精度要求布置传感器;(3)数据的显示及报警控制系统。
第三章与第四章:室内空气品质监测仪的各个硬件模块的设计,介绍在室内空气品质实验装置基础上设计的具有实际应用价值的室内空气品质监控系统的硬件与软件组成。
第五章:整个系统的仿真调试。
第六章:总结本文研究工作以及在研究方面存在的不足,提出了进一步研究的展望。
1.3.2总体方案设计
本设计集甲醛,苯,氨气以及温湿度监测,显示与报警于一体,利用MCU进行数据采集保证了前台数据的及时、准确,有利于进行全方位的评价。仪器采用锂电池供电,具有良好的便携性和通用性,并且使用LCD点阵式液晶屏显示菜单,有良好的人机对话界面。

图1.1 系统结构框图
第三章 室内空气品质监测仪的硬件设计
3.1室内空气品质监测仪系统简介
基于AT89S52的室内便携式智能空气品质监测仪是以室内空气中有毒有害气体的监测监控为背景,能够实现对室内温度,湿度,甲醛,苯和氨的实时采集处理、显示、报警等功能。仪器采用锂电池供电,具有良好的便携性和通用性,并且使用LCD点阵式液晶屏显示菜单,有良好的人机对话界面。同时设计了声光报警系统,实现在参数超标时及时的报警。室内智能空气品质监测仪体积小,功耗低,操作简单,适合应用于家庭和社区的医疗健康保健,能够实时知道室内空气的质量。
3.1.1系统硬件结构及原理
本文研究的室内便携式智能空气品质监测仪是以ATMEL工公司的一款8位超低功耗单片机AT89S52为控制核心,系统结构如图3.1所示。室内空气中有害气体甲醛、苯、氨分别通过传感器组中的传感器1、传感器2、传感器3输出一个与甲醛、苯、氨浓度相对应的电流信号,该信号经过放大滤波后通过多路转换器分时间段进行采样保持,最后经过A/D转换电路按一定得采样频率将模拟信号转换为数字信号送入单片机进行数据采集以便进行显示处理,温湿传感器直接与单片机相连。本文转载自http://www.biyezuopin.vip/onews.asp?id=13057单片机对采样值进行数字处理后驱动液晶显示器分别显示出被测室内空气中的甲醛、苯、氨的浓度值及温湿度。若被测室内空气中甲醛、苯、氨的浓度某种有超过国家标准或设定的危险值时报警电路对应的发出声光报警信号。

图3.1系统结构图

#include<reg52.h>
#include "intrins.h"
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit rs=P2^6;   // 数据命令选择
sbit rw=P2^5;   //读写选择
sbit e=P2^7;     //使能sbit k1=P3^3; //模式
sbit k2=P2^1; //加
sbit k3=P2^2; //减sbit DHT11_DQ_OUT=P3^2;
sbit led1=P3^6;
sbit led2=P2^7;sbit dq=P2^0;
sbit beep=P1^5;sbit kqjc=P2^3;uint8 mode=0,xian;
char temph=50,templ=20;
char humih=80,humil=20;
uint8 temp,humi;
uint8 flag;   //设定报警标志
uint8 a,c,tempvalue;
uint8 code num[10]="0123456789";uint8 code str1[]="Temp:";  //温度
uint8 code str2[]="Humi:";  //湿度
uint8 code str3[]="Error";
uint8 code str4[]="Success    ";
uint8 code str5[]="%RH";
uint8 code str6[]="TempH:";    //设定温度上限显示
uint8 code str7[]="TempL:";    //设定温度下限显示
uint8 code str8[]="HumiH:";     //设定湿度上限显示
uint8 code str9[]="HumiL:";     //设定湿度下限显示
uint8 str10[]="\n";
uint8 str11[]="Temp:";  //温度
uint8 str12[]="Humi:";
void UsartConfiguration();void delay(uint16 i)
{while(i--);
}void delay_ms(uint16 i)
{while(i--)delay(90);
}void wrc(uint8 c)   //写命令
{delay(1000);rs=0;rw=0;e=0;P0=c;e=1;delay(10);e=0;
}
void wrd(uint8 dat)   //写数据
{delay(1000);rs=1;rw=0;e=0;P0=dat;e=1;delay(10);e=0;rs=0;
}
void lcd_init()    // LCD1602初始化
{delay(1000);wrc(0x38);wrc(0x38);    //功能设置命令,选择8位总线,双行显示  5*7点阵字符wrc(0x38);wrc(0x06);    //光标和显示模式设置  光标右移  整屏不移动wrc(0x0c);  //显示开关控制  开显示  无光标 光标不闪烁wrc(0x01);  //清零指令  固定的
}
//复位DHT11
void DHT11_Rst()
{                 DHT11_DQ_OUT=0;  //拉低DQdelay_ms(20);     //拉低至少18msDHT11_DQ_OUT=1;  //DQ=1 delay(3);       //主机拉高20~40us
}//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
uint8 DHT11_Check()
{   uint8 retry=0;  while (DHT11_DQ_OUT&&retry<100)//DHT11会拉低40~50us{retry++;_nop_();};    if(retry>=100)return 1;else retry=0;while (!DHT11_DQ_OUT&&retry<100)//DHT11拉低后会再次拉高40~50us{retry++;_nop_();};if(retry>=100)return 1;     return 0;
}//DHT11初始化
//返回0:初始化成功,1:失败
uint8 DHT11_Init()
{DHT11_Rst();     return DHT11_Check();
}//从DHT11读取一个位
//返回值:1/0
uint8 DHT11_Read_Bit(void)
{uint8 retry=0;while(DHT11_DQ_OUT&&retry<100)//等待变为低电平 12-14us 开始{retry++;_nop_();}retry=0;while((!DHT11_DQ_OUT)&&retry<100)//等待变高电平   26-28us表示0,116-118us表示1{retry++;_nop_();}delay(1);//等待40usif(DHT11_DQ_OUT)return 1;else return 0;
}//从DHT11读取一个字节
//返回值:读到的数据
uint8 DHT11_Read_Byte(void)
{        uint8 i,dat=0;for (i=0;i<8;i++) {dat<<=1; dat|=DHT11_Read_Bit();}                           return dat;
}//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
uint8 DHT11_Read_Data(uint8 *temp,uint8 *humi)
{        uint8 buf[5];uint8 i;DHT11_Rst();if(DHT11_Check()==0){for(i=0;i<5;i++)//读取40位数据{buf[i]=DHT11_Read_Byte();}if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]){*humi=buf[0];*temp=buf[2];}}else return 1;return 0;
}void ds18b20init()     //18b20的初始化
{dq=1;delay(1);dq=0;delay(80);dq=1;delay(5);dq=0;delay(20);dq=1;delay(35);
}
void ds18b20wr(uint8 dat)     //18b20写数据
{uint8 i;for(i=0;i<8;i++){dq=0;dq=dat&0x01;dat>>=1;delay(8);//在时序上只有这一块对时序要求最准确,他的时间必须大于15usdq=1;delay(1);}
}
uint8 ds18b20rd()         //18b20读数据
{uint8 value,i;for(i=0;i<8;i++)   {dq=0;value>>=1;dq=1;if(dq==1)value|=0x80;delay(8);//在这一块也对时间要求特别准确,整段程序必须大于60us     }return value;
}
uint8 readtemp()              //读取温度内需要复位的
{uint8 b;ds18b20init();     //初始化ds18b20wr(0xcc);   //发送忽略ROM指令ds18b20wr(0x44);   //发送温度转换指令delay(100);ds18b20init();      //初始化ds18b20wr(0xcc);   //发送忽略ROM指令ds18b20wr(0xbe);   //发读暂存器指令a=ds18b20rd();    //温度的低八位b=ds18b20rd();     //温度的高八位b<<=4;           //ssss s***;s为标志位s=0表示温度值为正数,s=1温度值为负数c=b&0x80;       //温度正负标志位确认b+=(a&0xf0)>>4;a=a&0x0f;      //温度的小数部分return b;
}void key_pros()  //按键处理函数
{if(k1==0){delay(1000);if(k1==0){mode++;if(mode==5)mode=0;wrc(0x01);}while(!k1);}if(mode==1)       //对温度上限设定{if(k2==0)       //加{delay(1000);if(k2==0){temph++;if(temph>=80)temph=80;}while(!k2);}if(k3==0)    //减{delay(1000);if(k3==0){temph--;if(temph<=0)temph=0;}while(!k3);}}if(mode==2)       //对温度下限设定{if(k2==0)       //加{delay(1000);if(k2==0){templ++;if(templ>=80)templ=80;}while(!k2);}if(k3==0)    //减{delay(1000);if(k3==0){templ--;if(templ<=0)templ=0;}while(!k3);}}if(mode==3)       //对湿度上限设定{if(k2==0)       //加{delay(1000);if(k2==0){humih++;if(humih>=80)humih=80;}while(!k2);}if(k3==0)    //减{delay(1000);if(k3==0){humih--;if(humih<=0)humih=0;}while(!k3);}}if(mode==4)       //对湿度下限设定{if(k2==0)       //加{delay(1000);if(k2==0){humil++;if(humil>=80)humil=80;}while(!k2);}if(k3==0)    //减{delay(1000);if(k3==0){humil--;if(humil<=0)humil=0;}while(!k3);}}
}void lcd_init_display()       //LCD初始化显示
{uint8 i;for(i=0;i<5;i++){wrc(0x80+i);wrd(str1[i]);  }for(i=0;i<5;i++){wrc(0xc0+i);wrd(str2[i]);  }
}void data_pros()   //数据处理函数
{uint8 i;       uint8 temp_buf[2],humi_buf[2];uint8 temphbuf[2],templbuf[2],humihbuf[2],humilbuf[2];float dio;uint16 k;tempvalue=readtemp();DHT11_Read_Data(&temp,&humi);temp_buf[0]=temp/10+0x30;   temp_buf[1]=temp%10+0x30;humi_buf[0]=humi/10+0x30;  humi_buf[1]=humi%10+0x30;dio=a*0.0625;k=dio*10000;//取小数点后两位有效数字temphbuf[0]=temph/10+0x30;temphbuf[1]=temph%10+0x30;templbuf[0]=templ/10+0x30;templbuf[1]=templ%10+0x30;humihbuf[0]=humih/10+0x30;humihbuf[1]=humih%10+0x30;humilbuf[0]=humil/10+0x30;humilbuf[1]=humil%10+0x30;if(mode==0){lcd_init_display();wrc(0x85);for(i=0;i<6;i++){SBUF = (str1[i]);//将接收到的数据放入到发送寄存器while (!TI);                     //等待发送数据完成TI = 0;       }wrd(num[tempvalue%100/10]);SBUF = (num[tempvalue%100/10]);//将接收到的数据放入到发送寄存器while (!TI);                  //等待发送数据完成TI = 0;wrd(num[tempvalue%100%10]);SBUF = (num[tempvalue%100%10]);//将接收到的数据放入到发送寄存器while (!TI);                  //等待发送数据完成TI = 0;wrd('.');SBUF = ('.');//将接收到的数据放入到发送寄存器while (!TI);                  //等待发送数据完成TI = 0;wrd(num[k/1000]);SBUF = (num[k/1000]);//将接收到的数据放入到发送寄存器while (!TI);                  //等待发送数据完成TI = 0;wrd(0xdf);wrd('C');SBUF = ('C');//将接收到的数据放入到发送寄存器while (!TI);                    //等待发送数据完成TI = 0;for(i=0;i<1;i++){SBUF = (str10[i]);//将接收到的数据放入到发送寄存器while (!TI);                   //等待发送数据完成TI = 0;       }for(i=0;i<6;i++){SBUF = (str2[i]);//将接收到的数据放入到发送寄存器while (!TI);                    //等待发送数据完成TI = 0;       }for(i=0;i<2;i++){wrc(0Xc5+i);wrd(humi_buf[i]);SBUF = (humi_buf[i]);//将接收到的数据放入到发送寄存器while (!TI);                  //等待发送数据完成TI = 0;       } for(i=0;i<3;i++){wrc(0Xc7+i);wrd(str5[i]);SBUF = (str5[i]);//将接收到的数据放入到发送寄存器while (!TI);                     //等待发送数据完成TI = 0;       }for(i=0;i<1;i++){SBUF = (str10[i]);//将接收到的数据放入到发送寄存器while (!TI);                   //等待发送数据完成TI = 0;       }for(i=0;i<1;i++){SBUF = (str10[i]);//将接收到的数据放入到发送寄存器while (!TI);                   //等待发送数据完成TI = 0;       } }if(mode==1)            //温度上限显示{wrc(0x80);for(i=0;i<6;i++){wrd(str6[i]);         }wrd(temphbuf[0]);wrd(temphbuf[1]);           }if(mode==2)            //温度下限显示{wrc(0x80);for(i=0;i<6;i++){wrd(str7[i]);         }wrd(templbuf[0]);wrd(templbuf[1]);           }if(mode==3)            //湿度上限显示{wrc(0x80);for(i=0;i<6;i++){wrd(str8[i]);         }wrd(humihbuf[0]);wrd(humihbuf[1]);           }if(mode==4)            //湿度下限显示{wrc(0x80);for(i=0;i<6;i++){wrd(str9[i]);         }wrd(humilbuf[0]);wrd(humilbuf[1]);           }
}void baojinpros()  //报警处理
{if(tempvalue>=temph||humi>=humih||kqjc==0)    //检测温度或者湿度高于设定上限值 降温湿{led1=1;     //降温湿指示灯led2=0;beep=~beep;delay(10);}if(tempvalue<=templ||humi<=humil)    //检测温度或者湿度低于设定下限值  升温湿{led1=0;led2=1;    //升高温湿指示灯beep=~beep;delay(10);}if((tempvalue>templ&&tempvalue<temph)&&(humi>humil&&humi<humih)){led1=0;led2=0;    beep=0;delay(1000);}
}void main()
{uint8 i=0;led1=0;led2=0;lcd_init();UsartConfiguration();while(DHT11_Init()) //检测DHT11是否纯在{for(i=0;i<5;i++){wrc(0x80+i);wrd(str3[i]); }           }wrc(0x01);lcd_init_display();     //LCD初始化显示i=0;while(1){ i++;key_pros();baojinpros();  //报警处理if(i==15){i=0;data_pros();      //读取一次DHT11数据最少要大于100ms}delay(1000); }
}void UsartConfiguration()
{SCON=0X50;            //设置为工作方式1TMOD=0X20;           //设置计数器工作方式2PCON=0X80;         //波特率加倍TH1=0XF3;               //计数器初始值设置,注意波特率是4800的TL1=0XF3;
//  ES=1;                      //打开接收中断
//  EA=1;                      //打开总中断TR1=1;                  //打开计数器
}











基于单片机的室内空气质量检测系统相关推荐

  1. 基于单片机的室内空气质量检测系统(甲烷甲醛)

    设计简介: 本设计是基于单片机的室内空气质量检测系统,主要实现以下功能: 可通过LCD1602显示当前甲烷和甲醛的值: 可通过按键调整甲醛甲烷的最大值: 可通过MS1100检测甲醛的值: 可通过MQ- ...

  2. 【毕设狗】【单片机毕业设计】基于单片机的室内空气质量检测系统的设计

    软件安装: Keil:点击下载 Proteus:点击下载 AD:点击下载 Visio:点击下载 设计简介: 本设计是基于单片机的室内空气质量检测系统的设计,主要实现以下功能: 实现通过甲烷气体传感器检 ...

  3. ESP32开发之旅——基于ESP32的室内空气质量检测系统

    ESP32开发之旅--基于ESP32的室内空气质量检测系统 前言 成果展示 核心代码 MQTT部分 获取传感器数据部分 连接WiFi部分 结尾 前言 本文主要是我课设项目的一个备忘,部分资料来源于网上 ...

  4. 单片机ch2o程序_基于单片机的室内甲醛浓度检测系统

    基于单片机的室内甲醛浓度检测系统 田秀荣 [期刊名称] <山西电子技术> [年 ( 卷 ), 期] 2014(000)003 [ 摘 要 ] As everyone knows , the ...

  5. 基于51单片机PM2.5空气质量检测系统(源程序+仿真+原理图+PCB+论文)

    资料编号:208 功能介绍:(全套毕设资料齐全) 本电路是由51单片机为控制核心,另外主要通过5个模块的电路设计实现功能,他们分别是LCD显示模块.粉尘传感器.A/D转换.蜂鸣器电路.LED指示电路. ...

  6. stm32毕业设计 空气质量检测系统

    文章目录 1 简介 2 系统设计概述 3 系统总体方案 4 硬件设计方案 4.1 stm32 主控 4.2 温度采集模块 4.3 甲醛浓度检测模块 4.4 PM2. 5 浓度检测模块 4.5 液晶显示 ...

  7. java基于ssm空气质量检测系统源码网站空气质量监测源码

    简介 Java基于ssm的空气质量检测系统,检测设备检测一定范围内的企业空气指数,如果有污染则地图显示红色标记. 演示视频 https://www.bilibili.com/video/BV1GK4y ...

  8. 创新“芯”引擎 | 国民技术N32G457 RT-Thread设计大赛 -基于RT-Thread的远程智能空气质量检测系统

    基于RT-Thread系统的一款远程智能空气质量检测系统:硬件部分由ESP8266WIFI模块,MQ135空气质量检测模块,0.96oled屏幕,N32G457主控板等组成:软件部分实现实时检测空气质 ...

  9. 51单片机空气质量检测系统 甲醛DHT11温湿度烟雾光照报警器WIFI系统

    采用51单片机+ADC0832芯片+DHT11+按键+LCD12864液晶+蜂鸣器+wifi模块+稳压模块+光敏电阻+烟雾传感器+甲醛传感器设计而成. 1.LCD12864液晶实时显示烟雾浓度.当前空 ...

  10. 单片机毕设选题 - 便携式空气质量检测系统(物联网 嵌入式)

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 5 部分核心代码 0 前言

最新文章

  1. linux存储--inode与block详解(七)
  2. shell训练营Day18
  3. ckeditor4 php,CKEditor 4自定义下拉列表
  4. [转]Device Context 设备环境 设备上下文 理解
  5. JavaFX技巧3:使用回调接口
  6. 为自己写程序之JavsScript代码段测试器
  7. 为什么mvc里面的ModelState.IsValid一只都是true
  8. R-大数据分析挖掘(4-R爬虫实现)
  9. Microsoft Office 2021 简体中文正式版下载
  10. Hexo设置背景图片轮播效果
  11. 【视频检测】FlowNet: Learning Optical Flow with Convolutional Networks
  12. model-based强化学习入门
  13. 499服务器响应,微信服务号开发 - Nginx请求返回499 - 问题排查与解决
  14. 三菱PLC伺服步进控制样例,包含原点回归,手动程序,伺服绝对定位,相对定位,伺服电路图接线
  15. LXR和 SourceInsight
  16. anaconda、labelme标注软件安装和使用
  17. 偶然发现,Javascript中双重否定的写法
  18. 计算机操作测试题及答案,计算机操作系统期末考试题及答案-
  19. 实时即未来,车联网项目之电子围栏分析【六】
  20. 布尔教育mysql优化_布尔教育-资源

热门文章

  1. html5好看的注册页面设计,美观大气注册登录页面模板html源码
  2. php代码上传工具,php中文网重磅推出“php程序员工具箱” v0.1版本!
  3. python下载电影_使用python下载VIP电影
  4. 【全网世界区划最全整理输出之第一部分】全世界所有国家的行政区划整理,省市信息,已按照国家,省,市排好序,可直接复制使用,第一部分4006条,总条数:21088
  5. 太阳系行星运行轨道模拟动画-基于htmlConvas
  6. js判断数组中重复元素并找出_JS判断数组里是否有重复元素的方法小结
  7. Swagger注解说明
  8. 如何减小电压跟随器输出电阻_河南安全型耦合器生产厂家-作用_华锐矿机
  9. 千年3步法外挂 千年3脚本 千年3外挂 千年3最新外挂
  10. c语言怎么设置命令行字体大小,C语言入门教程-命令行参数