赞
踩
目 录
绪 论 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; //拉低DQ delay_ms(20); //拉低至少18ms DHT11_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);//等待40us if(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);//在时序上只有这一块对时序要求最准确,他的时间必须大于15us dq=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; //设置为工作方式1 TMOD=0X20; //设置计数器工作方式2 PCON=0X80; //波特率加倍 TH1=0XF3; //计数器初始值设置,注意波特率是4800的 TL1=0XF3; // ES=1; //打开接收中断 // EA=1; //打开总中断 TR1=1; //打开计数器 }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。