基于单片机的空气质量检测仪设计.docx
《基于单片机的空气质量检测仪设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的空气质量检测仪设计.docx(32页珍藏版)》请在冰点文库上搜索。
基于单片机的空气质量检测仪设计
河南理工大学
《单片机应用与仿真训练》设计报告
基于单片机的空气质量检测仪设计
******
学号:
************
专业班级:
电气3456
********
所在学院:
电气工程与自动化学院
2014年5月8日
摘要
随着我国经济的发展,人民生活水平的提高,人们对环境问题及健康问题日益重视,室内空气品质(IAQ)状况受到越来越多的关注。
人的一生中有三分之二的时间是在居室内度过的。
本文研究的室内便携式智能空气品质监测仪是以室内空气中有毒有害气体的监测监控为背景,是以STC工公司的一款8位超低功耗单片机STC90C51为控制核心,能够实现对室内温度,湿度,VOC气体的实时采集处理、显示、报警等功能。
仪器采用锂电池供电,具有良好的便携性和通用性,并且使用LCD1602点阵式液晶屏显示菜单,有良好的人机对话界面。
同时设计了声光报警系统,实现在参数超标时及时的报警。
室内智能空气品质监测仪体积小,功耗低,操作简单,适合应用于家庭和社区的医疗健康保健,能够实时知道室内空气的质量。
关键词:
STC90C51,室内空气品质,LCD显示,温湿度,VOC气体
1概述
1.1前言
气体传感器测定甲醛成为近年来甲醛检测研究的新热点。
早在1983年,压电类甲醛传感器就已问世。
这种传感器可以不需要对样品进行任何处理就可以测定,但易受水分子的影响而使晶体震动频率发生漂移,故基本无实用性。
为适应室内空气甲醛现场快速检测的要求,目前已开发出不少甲醛快速测定仪,这些仪器可直接在现场测定甲醛浓度,操作方便,适用于室内和公共场所空气中甲醛浓度的现场测定,也适用于环境测试舱法测定木质板材中的甲醛释放量。
但这些仪器的工作原理、响应性能、适应范围等都不同。
1.2设计的意义
空气质量的好坏反映了空气污染程度,它是依据空气中污染物浓度的高低来判断的。
来自固定和流动污染源的人为污染物排放大小是影响空气质量的最主要因素之一。
空气质量检测种类包括装修污染、办公室内空气检测、作业场所有害物质检测、食堂油烟检测、锅炉大气及工业窑炉检测及工厂排放工业废气检测。
当今,人类正面临“煤烟污染”、“光化学烟雾污染”之后,又出现了“室内空气污染”为主的第三次环境污染。
美国专家检测发现,在室内空气中存在500多种挥发性有机物,其中致癌物质就有20多种,致病病毒200多种。
危害较大的主要有:
氡、甲醛、苯、氨以及酯、三氯乙烯等。
大量触目惊心的事实证实,室内空气污染已成为危害人类健康的“隐形杀手”,也成为全世界各国共同关注的问题。
据统计,全球近一半的人处于室内空气污染中,室内环境污染已经引起35.7%的呼吸道疾病,22%的慢性肺病和15%的气管炎、支气管炎和肺癌。
本课题主要研究设计基于量化检测的“空气质量检测仪”系统,此系统旨在实现室内空气温度、湿度、有害气体的预警监测,有利于进行全方位的评价室内空气质量,为人类营造一个健康的室内生存空间。
空气质量检测仪体积小,功耗低,操作简单,适合应用于家庭和社区的医疗健康保健,能够实时知道室内空气的质量。
2系统总体方案及硬件设计
2.1系统总体方案
本设计集VOC气体及温湿度监测,显示与报警于一体,利用MCU进行数据采集保证了前台数据的及时、准确,有利于进行全方位的评价。
仪器采用锂电池供电,具有良好的便携性和通用性,并且使用LCD点阵式液晶屏显示菜单,有良好的人机对话界面。
总体方案结构图如下:
图1系统总体结构框图
2.2功能设定
1.显示部分采用LCD1602显示屏,循环显示各项测量值的上下限及实际浓度、实际温度、湿度。
并在按键选择情况下连续显示一个测量值的变化。
2.当有害气体浓度超出安全范围时进行声光报警。
3. 按键操作可进行测量值范围的调整,及手动和自动测量的转换。
2.3系统硬件结构及原理
本文研究的室内便携式智能空气品质监测仪是以STC工公司的一款8位超低功耗单片机STC90C51为控制核心。
室内空气中有害气体通过传感器输出一个与气体浓度相对应的电压信号,该信号经过A/D转换电路按一定得采样频率将模拟信号转换为数字信号送入单片机进行数据采集以便进行显示处理,温湿传感器直接与单片机相连。
单片机对采样值进行数字处理后驱动液晶显示器分别显示出被测室内空气中的VOC气体浓度值及温湿度。
若被测室内空气中VOC气体的浓度有超过国家标准或设定的危险值或温湿度超出设定范围时报警电路对应的发出声光报警信号。
2.41STC90C51主要性能参数
1、与MCS.51产品指令系统完全兼容
2、4k字节在系统编程(ISP)Flash闪速存储器
3、1000次擦写周期
4、4.0-5.5V的工作电压范围
5、全境态工作模式:
0Hz-33MHz
6、三级程序加密锁
7、128×8字节内部RAM
8、32个可编程I/O口线
9、2个16位定时器/计数器
10、6个中断源
11、全双工串行UART通道
12、低功耗空闲和掉电模式
13、中断可从空闲模唤醒系统
14、看门狗(wDT)及双数据指针
15、掉电标识和快速编程特性
16、灵活的在线系统编程
STC90C51芯片管脚如图2-2。
图2STC90C51引脚布置
2.5时钟电路模块
时钟电路由一个晶体振荡器12MHZ和两个30pF的瓷片电容组成。
时钟电路用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行中各信号之间的相互关系。
单片机本身就如一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地工作。
其电路如图2-3所示:
图3时钟电路模块
2.6复位电路模块
复位电路是使单片机的CPU或系统中的其他部件处于某一确定的初始状态,并从这状态开始工作,除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位电路以重新启动。
本设计采用的是按键复位电路。
其电路如图2-4所示:
图4复位电路模块
2.7模数转换电路设计
气体传感器出来的信号是模拟信号,而微处理器STC90C51只能处理数字信号,故需要对模拟信号信号进行转换,将其转换为处理器能识别的数字信号,由于测试电路出来的模拟电压变化范围在0~5V,故选择性价比比较合适的ADC0809进行模数转换。
图5ADC0809管脚示意图
ADC0809与单片机及VOC传感器的接线方式如图2-6:
图6ADC0809接线原理图
2.8声光报警电路设计
为了使本系统对室内空气品质的监测更为直观,采用了如图2-7由2个发光二极管和一个蜂鸣器构成的声光报警电路。
其中VOC气体含量超标时双灯闪烁蜂鸣器报警,温度超标时D1灯亮蜂鸣器报警,湿度超标时D2灯亮蜂鸣器报警。
图7声光报警电路
2.9按键电路设计
考虑到整个测量系统中不同环境对气体浓度及温湿度范围要求不同,故设置了按键功能,用于实现测量范围的调整,参考单片机引脚使用情况,共设置五个独立按键如图2-8,实现功能为设定键可进行设定的进入与退出,同时可实现三种范围的切换,另设左右移位键、上下调值键各两个,与此同时考虑到用户可能需要在一定时间内连续测量一种量,故设计了上调键的第二功能:
当只有上调键按下时完成显示的自动与手动的切换以实现良好的人机对话。
图8按键电路
2.10电路电源设计
本设计采用集成稳压器7805,C29、C30分别为输入端和输出端滤波电容,D1为续流二极管。
当输出电流较大时,7805应配上散热板。
电源电路如图2-9所示:
图9电源电路
2.11本章小结
本章首先介绍了便携式室内空气质量监测仪的硬件结构以及系统功能,该仪器以8位单片机STC90C51作为控制核心,设计并构建了系统的硬件平台,完成了有毒气体浓度信号的采集转换电路、液晶显示电路、声光报警电路等的设计。
该仪器能够实现有毒气体浓度信号和温湿度信号采集与显示及超标声光报警等功能。
本章重点介绍了信号采集模拟电路和以主控制器为中心的数字电路的设计与工作原理。
首先讨论了有毒气体采集模块中传感器选择问题,最后讨论了系统的外围接口电路模块,包括液晶显示,声光报警等,实现了各外围接口电路模块与STC90C51的硬件接口设计。
这一章比较具体的说明了系统硬件设计的内容,通过模块化的设计思想,把一个复杂的单片机系统按照功能划分成一个个单独的电路模型,分别进行设计,最后在集成到一起。
这种方法对于设计复杂的单片机系统很有效。
大大提高系统设计的效率与质量。
3软件设计
3.1系统主程序模块
由主程序流程图可以看出,软件要实现的主要功能是实现对传感器信号的数据采集,然后进行数据的计算、分析、送液晶进行显示及报警功能。
程序开始时,对系统进行初始化。
完成初始化后,CPU等待传感器传入信号及AD转换结束,从而完成当前监测参数的正确显示。
图10主程序流程图
3.2AD转换模块
AD完成转换需要一定的时间,AD应用中我们可以有两种方法来:
1.中断查询法,AD完成模数转换后会向中断输出端输出一个中断请求信号,告诉CPU转换已经完成,CPU可以读取数据。
2.延时等待法,设定一定的时间让CPU处于等待状态,此时间足够AD完成转换,过了等待时间CPU再去读取数据。
综合考虑各方面的因素,本研究采用第一种方法:
延时等待法。
所用的芯片为AD0809,根据所需的要求。
3.3液晶显示模块
本设计所用的显示器件为1602液晶面板,该液晶能显示32个字符,满足显示要求。
1602液晶与CPU是并口通信,由单片机的P2.5、P2.6、P2.7引脚来控制1602的读写数据命令功能,单片机P0口传输数据到1602进行显示。
系统上电LCD初始化,液晶显示首先需要要按照时序给定显示地址,然后传送数据。
上电后液晶显示开始循环显示三个被测量的范围和测量结果。
3.4声光报警模块
声音报警采用的是蜂鸣器,光报警是通过6个发光二极管来显示,3个绿色和三个红色的,当毒气含量没超标时显示绿色,超标时显示红色并启动蜂鸣器,报警子程序执行之前,设定的报警阈值存放在两个变量中,传感器输入AD转换值后,调用比较程序,小于阈值则执行显示程序,若大于阈值进行声光报警。
3.5按键模块
本设计设定按键功能为调整测量数据的安全范围并可进行手动和自动的切换考虑到实现按键功能所用按键数目不多及单片机引脚数量决定选用五个独立式按键,其中设定键用于进入和退出上下限的调整,上下左右四个键在设定键被按下的情况下可以对数值进行调整;同时,当设定键未按下且上调键被按下时进入上调键的第二功能,实现用户手动控制和自动控制的切换。
已满足用户对环境条件检测要求的不同,实现良好的人机交流。
3.6本章小结
在这一章里对室内便携式只能空气品质监测仪的软件设计进行了较详细的介绍。
软件采用了模块化设计的思路,以单片机高级语言C51编程。
在本章开始给出了主程序结构流程图,然后分别对各个子模块的软件流程进行介绍。
4Proteus软件仿真
作为一个设计性的题目,需要在实际电路中检验电路设计和程序编制的正确性。
按照设计的硬件电路图焊接好电路,焊接的导线尽量不要冗长。
对系统软件编写完成之后,可以利用KeilC51仿真软件进行仿真运行调试。
在具体的调试过程中,采取以下方法进行调试:
在KeilC51编译环境中编写、编译软件模块,进行软件仿真调试,对功能模块的软件仿真。
通过KeilC51的调试窗口观察各个寄存器、变量以及并行口输出的结果,监测软件模块运行的状态,在调试过程中不断地调整修改系统的软件程序,使系统实现预定功能。
调试过程中单步运行和断点运行调试只能验证程序正确与否,而不能确定定时精度、CPU的实时响应等问题,故在单步和断点调试之后,又进行了连续调试。
待全部完成后,应反复运行调试多次,对系统的稳定性和操作是否符合原始设计要求、安排的操作是否合理等都要进行详细的观察,必要时作适当的修正。
调试完成后将程序导入protues中进行仿真,观察系统运行结果。
仿真结果如下:
图11proteus仿真
5课程设计体会
通过这次课程设计,对我个人而言,凝聚了许多努力和汗水,也经受住了严峻的考验。
这是是我第一次接触传感器的使用,对我来说这是一个全新的任务。
由于基础过于薄弱,专业知识有限,浮躁的心理让我一开始举步维艰,满脑子想的就是放弃。
万事开头难,从研究课题,搜集材料,到正式投入设计,我花费了很多时间和精力。
对于这次全新的设计,老师给了我很大的自由空间,可以充分发挥自己的创造思维。
但是,对于很多新的尝试,我还是有所拘束。
可能是性格使然吧,每当遇到问题,设计处于混沌状态时,烦躁焦虑接踵而来,让我迷失了方向。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在本次课程设计中,提高了自己搜资料的能力。
由于平常对这种设计接触的很少,在设计格式上花了很多时间,但通过这次设计,为以后的毕业设计奠定了基础。
参考文献
[1]余永权.单片机原理及应用[M].北京:
电子工业出版社,1998.12
[2]余锡存、曹国华.单片机原理及接口技术[M].第二版.西安:
西安电子科技大学出版社,2007.12
[3]诸邦田.电子电路实用抗干扰技术[M].北京:
人民邮电出版社,1994.5
[4]曲喜新.电子元件材料手册[M].北京:
电子工业出版社,1989.4
[5]汪吉鹏、马云峰.微机原理与接口技术[M].北京:
高等教育出版社,2001.7
[6]田崴.电工技术(电工学1)[M].北京:
高等教育出版社,2010.12
[7]孙立功.电子技术(电工学2)[M].北京:
高等教育出版社,2010.12
[8]马玉春.串行通信协议的研究及应用[J].计算机应用研究.2004
[9]胡汉才.单片机原理及其接口技术[M].清华大学出版社,1996.
[10]楼然苗,李光飞.51系列单片机设计实例[M].北京航空航天大学出版社,2003.
[11]赵亮,侯国锐.单片机C语言编程与实例[M].人民邮电出版社,2003.
[12]张毅刚.单片机原理及应用[M].北京:
高等教育出版社,2003.
[13]何立民.单片机与嵌入式系统应用[M].北京航空航天出版社,2003.
[14]谭浩强.C程序设计(第三版)[M].清华大学出版社,2005.
[15]清源科技.Protel99SE电路原理图与PCB设计及仿真[M].机械工业出版社,2007.
附1源程序代码
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineDataP0//数据端口
/*****1602管脚定义*****/
sbitRS=P2^6;
sbitRW=P2^5;
sbitE=P2^7;
/******AD管脚定义*****/
sbitSTA=P3^0;
sbitOE=P3^1;
sbitEOC=P3^2;
sbitCLK=P3^3;
/*****按键管脚定义******/
sbitkey_U=P2^0;
sbitkey_D=P2^1;
sbitkey_L=P2^2;
sbitkey_R=P2^3;
sbitkey_S=P2^4;
/******报警用管脚******/
sbitbeep=P3^4;
sbitled1=P3^5;
sbitled2=P3^6;
unsignedcharnum=0;//记录设定键按下次数
unsignedchark_flag=0;//记录设置键按下次数(用于调用)
unsignedcharwei=0;//光标位置
unsignedcharc_num=0;//记录切换键按下次数
unsignedcharc_flag=0;//记录切换键按下次数(用于调用)
unsignedcharvoc_ad;//AD读取数据
unsignedcharflag;//DHT11函数用到
/****************************/
sbitDHT=P3^7;
ucharWEN1[]="wen:
16.00-28.00";//温度第一行数据
ucharWEN2[]="00.00";//温度第二行数据
ucharSHI1[]="shi:
30.00-70.00";//湿度第一行数据
ucharSHI2[]="00.00";//湿度第二行数据
ucharVOC1[]="voc:
0.00-2.70";//湿度第一行数据
ucharVOC2[]="0.00";//湿度第二行数据
unsignedcharshiZ,shiX,wenZ,wenX,check;
unsignedchartr_shiZ,tr_shiX,tr_wenZ,tr_wenX;
/*********延时*******************************/
voiddelay_1ms(uintx)
{
uchari;
while(x--)
for(i=0;i<120;i++);
}
voiddelay_10us()
{
unsignedchari;
i--;
i--;
i--;
i--;
i--;
i--;
}
voidDelayUs(unsignedcharus)//--延时函数
{
unsignedcharuscnt;
uscnt=us>>1;/*12MHz频率*/
while(--uscnt);
}
/*******1602显示*******************************************/
/**********写命令**********/
voidlcd_write_com(ucharc)
{
delay_1ms(5);//操作前短暂延时,保证信号稳定
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/**********写数据*************/
voidlcd_write_dat(ucharc)
{
delay_1ms(5);//操作前短暂延时,保证信号稳定
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/**********LCD初始化********/
voidlcd_init()
{
delay_1ms(15);
lcd_write_com(0x38);//displaymode
lcd_write_com(0x38);//displaymode
lcd_write_com(0x38);//displaymode
lcd_write_com(0x06);//显示光标移动位置
lcd_write_com(0x0c);//显示开及光标设置
lcd_write_com(0x01);//显示清屏
}
/*********显示单个字符**********/
voidShowChar(ucharpos,ucharc)
{
unsignedcharp;
if(pos>=0x10)
p=pos+0xb0;//是第二行则命令代码高4位为0xc
else
p=pos+0x80;//是第二行则命令代码高4位为0x8
lcd_write_com(p);//写命令
lcd_write_dat(c);//写数据
}
/*********显示字符串**********/
voidShowString(ucharline,char*ptr)
{
unsignedcharl,*p;
p=ptr;
l=line<<4;
while((*p)!
='\0')
{
ShowChar(l++,*(p));
p++;
}
}
/*********温度显示函数***********/
voidWENdisp(void)
{
ShowString(0,WEN1);
_nop_();
ShowString(1,WEN2);
}
/*********湿度显示函数***********/
voidSHIdisp(void)
{
ShowString(0,SHI1);
_nop_();
ShowString(1,SHI2);
}
/*********VOC调用的显示函数***********/
voidVOCdisp(void)
{
ShowString(0,VOC1);
_nop_();
ShowString(1,VOC2);
}
/***********报警用函数************/
voidBeep(unsignedchari,j)//i用于确定亮灯方式,j用于确定蜂鸣器是否报警
{
unsignedcharm;
led1=led2=1;
for(m=0;m<250;m++)
{
switch(i)
{
case0:
break;
case1:
led1=led2=0;break;//低电平点亮
case2:
led1=0;break;
case3:
led2=0;break;
}
beep=j;
delay_1ms
(2);
led1=led2=1;
beep=0;
delay_1ms
(2);
}
}
voidvoc_warning()
{
unsignedcharvoc_t;
unsignedcharvoc_h;
voc_t=('0'+VOC2[6])*10+('0'+VOC2[8]);
voc_h=('0'+VOC1[9])*10+('0'+VOC1[11]);
if(voc_t>voc_h)
{
Beep(1,1);
}
elseBeep(0,0);
}
voidwen_warning()
{
unsignedcharwen_t;
unsignedcharwen_h;
unsignedcharwen_l;
wen_t=('0'+WEN2[6])*10+('0'+WEN2[7]);
wen_l=('0'+WEN1[4])*10+('0'+WEN1[5]);
wen_h=('0'+WEN1[10])*10+('0'+WEN1[11]);
if(wen_t>wen_h||wen_t{
Beep(2,1);
}
elseB