《基于单片机的室内甲醛检测仪的设计毕业设计.doc》由会员分享,可在线阅读,更多相关《基于单片机的室内甲醛检测仪的设计毕业设计.doc(22页珍藏版)》请在三一办公上搜索。
1、基于单片机的室内甲醛检测仪的设计摘要:甲醛对人体危害极大,对此研究并设计了一种用于室内具有检测及超限报警功能的甲醛智能测试仪。其设计方案基于STC89C52单片机,选择英国达特公司的甲醛传感器。系统将传感器输出的电流经放大后信号通过A/D转换电路调理后,经由单片机进行数据处理,最后由LCD显示甲醛浓度值。关键词:甲醛、STC89C52、传感器、A/D、LCD1602液晶1.引言1.1甲醛的特性及危害甲醛是一种无色,有强烈刺激性气味的气体。易溶于水、醇和醚。甲醛在常温下是气态,通常以水溶液形式出现。其37%的水溶液称为福尔马林,医学和科研部门常用于标本的防腐保存。在我国有毒化学品优先控制名单中甲
2、醛列居第二位。甲醛已被世界卫生组织确定为致癌和致畸形物质。1甲醛能与蛋白质结合,吸入高浓度甲醛后会出现呼吸道的严重刺激和水肿、眼刺痛、头痛,也可发生支气管哮喘皮肤直接接触甲醛,可引起皮炎、色斑、坏死。经常吸入少量甲醛,能引起慢性中毒,出现粘膜充血、皮肤刺激症、过敏性皮炎、指甲角化和脆弱等。全身症状有头痛、乏力、心悸、失眠、体重减轻以及植物神经紊乱等。21.2甲醛的来源1.室内装修所用的合成板材,如胶合板、细木工板、高密度板、刨花板。这些板材中甲醛起胶合剂、防腐剂的作用,主要用于加强板材的硬度、防虫、防腐。板材中残留的和未参与反应的甲醛逐渐向周围环境释放,是室内空气中甲醛的主要来源。2.用合成板
3、材制造的家具,厂家为了追求利润使用不合格的板材,再粘贴面材料时使用不合格的胶水,造成家具中甲醛含量超标。3.含有甲醛成分并有可能向外界散发的各类装饰材料,如壁纸、地毯、油漆。2.总体设计方案2.1系统设计基本要求本次设计的主要内容是设计一种基于单片机的室内甲醛检测仪,主要利用单片机和放大电路对甲醛传感器的输出信号进行采集处理。设计基本要求:1.快速检测功能:当将仪器至于封闭环境时能快速测出甲醛浓度并显示。2.超标报警功能:当甲醛浓度超出国标时给予报警提示。2.2系统设计思路随着现代电子技术的迅速发展,传感技术已形成一个独立的新兴的高科技领域。传感器的高度自动化、微型化与集成化,减少了对使用者环
4、境和技术的要求,其便携式的特点尤其适合于野外、现场分析的需要。本设计拟采用英国达特公司生产的CH20甲醛传感器,传感器的贵金属电极与挥发的甲醛气体发生反应,产生与挥发的甲醛浓度成正比的电信号。由于甲醛传感器产生的电信号十分微弱,不能直接与控制电路相连接使用,我们将其首先经过一个放大电路,将信号放大,再经过模数转换器将模拟信号转换成数字信号,在单片机电路的作用下,通过LCD将空气中甲醛含量的浓度用数字显示出来。创新点:1.使化学检测转化为电信号检测。2.应用单片机来显示最后结果,成本低。3.设备便于携带,操作简单。4.实现单片机控制的智能化。3 系统硬件电路设计3.1主控器 AT89C52实物图
5、: AT89C52是51系列单片机的一个型号,它是ATMEL公司生产的。AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。 AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT8
6、9C52可以按照常规方法进行编程,但不可以在线编程(S系列的才支持在线编程)。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。兼容MCS51指令系统 8k可反复擦写(1000次)Flash ROM 32个双向I/O口 256x8bit内部RAM 3个16位可编程定时/计数器中断,时钟频率0-24MHz 2个串行中断 可编程UART串行通道 2个外部中断源 共6个中断源 2个读写中断口线 3级加密位 全双工增强型UART。 3个16位定时/计数器,T0、T1(标准80C51)和增加的T2(捕获和比较)。 全静态工作方式:024MHz。 3.
7、2 模数转换电路 ADC0809 3.2.1 ADC0809的性能特性 ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。它是逐次逼近式A/D转换器,可以和单片机直接接口。ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。 ADC0809各脚功能如下:D7-D0:8位数字量输出引脚。IN0-IN7:8位模拟量输入引脚。VCC:+
8、5V工作电压。GND:地。REF(+):参考电压正端。REF(-):参考电压负端。START:A/D转换启动信号输入端。ALE:地址锁存允许信号输入端。(以上两种信号用于启动A/D转换)EOC:转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。OE:输出允许控制端,用以打开三态数据输出锁存器。CLK:时钟信号输入端(一般为500KHz)。A、B、C:地址输入线。CBA选择的通道000IN0001IN1010IN2011IN3100IN4101IN5110IN6111IN73.2.2 ADC0809数据操作原理 ADC0809是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼
9、近式A/D模数转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。 ADC0809对输入模拟量要求:信号单极性,电压范围是05V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。 地址输入和控制线:4条 ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进入转换器进行转换。A,B和C为地址输入线,用于选通IN0IN7上的一路模拟量输入。通道选择表如下表所示。ST为转换启
10、动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE1,输出转换得到的数据;OE0,输出数据线呈高阻状态。D7D0为数字量输出线。 CLK为时钟输入信号线。因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ,VREF(),VREF()为参考电压输入。 33 甲醛检测电路的设计3.3.1 甲醛传感器工作原理 其实物图如下: 主要参数如下:一、 尺寸
11、:32mm X22mm X27mm 长X宽X高二、 主要芯片:LM393、MQ-138甲醛传感器三、 工作电压:直流5伏四、 特点:1、具有信号输出指示。;2、双路信号输出(模拟量输出及TTL电平输出);3、TTL输出有效信号为低电平。(当输出低电平时信号灯亮,可直接接单片机); 4、模拟量输出05V电压,浓度越高电压越高;5、对醛、醇、酮芳族化合物具有很高的灵敏度;对醛、醇、酮、芳族化合物具有很高的灵敏度对醛、醇、酮、芳族化合物具有很高的灵敏度;对醛、醇、酮、芳族化合物具有很高的灵敏度;对醛、醇、酮、芳族化合物具有很高的灵敏度;6、具有长期的使用寿命和可靠的稳定性;7、快速的响应恢复特性;3
12、.3.2 甲醛传感器与ADC0809模数转换器的接口电路3.4 显示电路的设计实物图如下:LCD1602液晶操作原理:工业字符型液晶,能够同时显示16x02即32个字符。(16列2行)注:为了表示的方便 ,后文皆以1表示高电平,0表示低电平。1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。1602LCD是指显示的内容为16X2
13、,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。LCD1602引脚图1602采用标准的16脚接口,其中:第1脚:VSS为电源地第2脚:VCC接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读
14、操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。第714脚:D0D7为8位双向数据端。第1516脚:空脚或背灯电源。15脚背光正极,16脚背光负极。其与单片机的连线情况如下:3.5系统报警电路设计当电路检测到甲醛浓度超过国标的限制时,将产生一个信号给报警电路。使报警电路报警从而提醒工作人员注意,超限报警电路如图7所示。它是有AT89C52单片机控制的,当传感器检测到的浓度超过程序设定的浓度值时,P0.4就会出现一个高电平,经过一个达林顿管以后,P0.4又出现一个低电平,电路接通,蜂鸣器开始发声。图7报警电路4系统软件部分
15、设计对于单片机的开发应用中,逐渐引入了高级语言,C语言就是其中的一种。汇编语言的可控性较高级语言来说更具优越性。程序编写语言比较常见的有C语言、汇编语言。汇编语言的机器代码生成效率高,控制性好,但就是移植性不高。C语言编写的程序比用汇编编写的程序更符合人们的思考习惯。还有很多处理器都支持C编译器,这样意味着处理器也能很快上手。且具有良好的模块化、容易阅读、维护等优点,且编写的模块程序易于移植8。基于C语言和汇编语言的优缺点,本系统采用C语言编写方法。1. 主程序流程图: 5 误差分析及改进方法由于实验室条件限制,无法购买先进的甲醛检测设备进行校准,因此会出现无法校验和误差较大的现象,且本次设计
16、采用的是8位的AD转换芯片ADC0809,精度在应用中算是中等,这方面在以后改进中可以加以校验、提升。6 设计总结通过本次课程设计,使我收获很多,从最初的对元器件的初步认识,再到图书馆以及网上找了很多有关元器件的使用方法,把本次课程设计所有用到的元器件都有一个比较系统的认识,然后就根据本次设计要求设计出实现该功能的原理图。本次课程设计通过亲自上网找资料,亲自去电子市场购买元器件以及亲自焊接实物及调试整个过程,从遇到问题,到分析问题,再到解决问题整个过程亲自体会了一遍,使我深深地体会到了要做出一样成功的作品有多么的不容易。它需要严谨的治学态度,细心耐心的钻研精神。致谢本次课程设计是在肖慧荣老师的
17、悉心指导下完成的。老师严谨的治学态度,精益求精的工作作风,诲人不倦的高尚师德,严以律己、宽以待人的崇高风范,平易近人的人格魅力对我影响深远。不仅使我树立了远大的学术目标、掌握了基本的研究方法,还使我明白了许多待人接物与为人处世的道理。在此,谨向肖老师表示崇高的敬意和衷心的感谢! 参考文献1潘政华.浅论甲醛对人体健康的影响及治理措施J.现代农业,2011.2石靖芳.手术室人员职业危险因素分析及防护J.齐齐哈尔医学院学报,2009. 3田清华.基于电化学敏感电极的甲醛测试仪的研D.燕山大学,2007.4宏晶科技STC12C5A60S2系列单片机数据手册S.2010.5长沙太阳人电子有限公司SMC1
18、602A数据手册S.2006.6DART公司甲醛传感器数据手册S.2004.7葛化敏,叶小岭.基于MSP430F449的甲醛检测仪设计J -工业仪表与自动化装置, 2009(3).8马忠梅等.单片机的C语言应用程序设计M.北京航空航天大学出版社,1997.9刘刚等.Multisim在漏电开关保护技术设计中的应用J.计算机仿真,2010. 附录一:总原理图附录二:总程序#include #include #include ds18b20.h#define uchar unsigned char#define uint unsigned int/ adc0809模块接线#define uchar
19、unsigned char sbit STR=P00; /单片机P1.0接模块STR引脚, 启动转换信号sbit EOC=P01; /单片机P1.1接模块EOC, 转换结束信号,高电平有效sbit OE=P02; /单片机P1.2接模块OE,输出允许信号,高电平有效sbit CLK=P03; /单片机P1.3接CLK ,ADC0809时钟,输入50-800KHZ的频率 /一般选用500K#define adc0809_data P3/ ADC0809模块的D0-D7分别接P3.0-P3.7/*地址选择 A 接H B 接H C 接L选择通到IN3,当然也可以通过软件设置地址 REF+ 接VCC
20、REF- 接GND这样 AD=256*(VIN-(VREF-)/(VREF+)-(VREF-) (VREF+)=5V; (VREF-)=0V; AD=256*VIN/5所以IN3口的电压VIN=AD*5/256;*/uchar AD_DATA1; /保存IN0通道转换后的数据uint addata2;/=LCD1602接口连接方法=/*- |DB0-P0.0 | DB4-P0.4 | RW-P2.6 | |DB1-P0.1 | DB5-P0.5 | RS-P2.5 | |DB2-P0.2 | DB6-P0.6 | E-P2.7 | |DB3-P0.3 | DB7-P0.7 | -*/=*/ #
21、define LCM_Data P1 /LCD1602数据接口#define Busy 0x80 /用于检测LCM状态字中的Busy标识sbit LCM_RW = P26; /读写控制输入端,LCD1602的第五脚sbit LCM_RS = P25; /寄存器选择输入端,LCD1602的第四脚sbit LCM_E = P27; /使能信号输入端,LCD1602的第6脚/-蜂鸣器发声引脚定义-sbit buzz=P04;/*函数声明*void WriteDataLCM(uchar WDLCM);/LCD模块写数据void WriteCommandLCM(uchar WCLCM,BuysC); /
22、LCD模块写指令uchar ReadStatusLCM(void);/读LCD模块的忙标void DisplayOneChar(uchar X,uchar Y,uchar ASCII);/在第X+1行的第Y+1位置显示一个字符void LCMInit(void);/LCD初始void delayms(uint ms);/1MS基准延时程序void delay(uchar i); /延时函数2void DisplayListChar(uchar X,uchar Y,uchar delayms, uchar code *DData);void judge_xianshi(void);/显示处理程序
23、void baojing();/报警函数 void init();/系统初始化设置void AD();/读取AD数据uchar flag1;/*主程序*main() uint temp; init();/系统初始化设置 LCMInit(); while(1) AD(); if(AD_DATA0102) baojing(); judge_xianshi(); delayms(100); /*系统初始化*/ void init() buzz=0; EA=1; /开总中断 TMOD=0x02; /设定定时器 T0工作方式 TH0=216; /利用T0中断产生CLK信号 TL0=216; TR0=1;
24、 /启动定时器T0 ET0=1; STR=0; OE=0; void judge_xianshi() addata2=AD_DATA0*100;/把数据扩大100,为下面求取小数位后2位做准备 /DisplayListChar(0,1,0, Lixinguang);/在液晶的第一行显示字符Lixinguang DisplayListChar(0,0,0, AD=); /在液晶的第二行第0位开始显示AD= DisplayOneChar( 0, 3, AD_DATA0/100+0x30); /显示AD数据的百位 DisplayOneChar( 0, 4, AD_DATA0/10%10+0x30);
25、/显示AD数据的十位 DisplayOneChar( 0, 5, AD_DATA0%10+0x30);/显示AD数据的各位 DisplayListChar(0,7,0, Vin=); /在液晶的第二行第8位开始显示Vin=/根据VIN=AD*5/256,求取IN3通到输入的电压 DisplayOneChar( 0, 11, AD_DATA0/51+0x30);/显示输入电压的整数位 DisplayListChar(0,12,0, .);/显示小数点 DisplayOneChar( 0, 13, addata2/51/10%10+0x30);/显示输入电压小数后1位 DisplayOneChar
26、( 0, 14, addata2/51%10+0x30);/显示输入电压小树后2位 DisplayListChar(0,15,0, V);/*报警函数 */ void baojing() int i; for (i=0;i3;i+) buzz=1; delayms(200); buzz=0; delayms(200); buzz=0; /*AD转换函数*/ void AD() STR=0; /ADDR这样如果不是通道0,可以在这边加一条其他地址的程序 delay(10); STR=1; /启动AD转换 delay(10); STR=0; while(0=EOC);/等待转换结束 OE=1; A
27、D_DATA0=adc0809_data; /读取AD数据,数据范围为0-255 OE=0; /*T0中断服务程序*/ void t0(void) interrupt 1 using 0 CLK=CLK; /*= 按指定位置显示一串字符:第 X 行,第 y列 注意:字符串不能长于16个字符=*/void DisplayListChar(uchar X,uchar Y,uchar ms, uchar code *DData) unsigned char ListLength; ListLength = 0; X &= 0x1; Y &= 0xF; /限制X不能大于15,Y不能大于1 while
28、(DDataListLength!=0) /若到达字串尾则退出 if (Y = 0xF) /X坐标应小于0xF DisplayOneChar(X, Y, DDataListLength); /显示单个字符 ListLength+; Y+; delayms(ms);/延时显示字符串 else break;/跳出循环体 /*= LCM初始化=*/void LCMInit(void) LCM_Data = 0; WriteCommandLCM(0x38,0); /三次显示模式设置,不检测忙信号 delayms(5); WriteCommandLCM(0x38,0); delayms(5); Writ
29、eCommandLCM(0x38,0); delayms(5); WriteCommandLCM(0x38,1); /显示模式设置,开始要求每次检测忙信号 WriteCommandLCM(0x08,1); /关闭显示 WriteCommandLCM(0x01,1); /显示清屏 WriteCommandLCM(0x06,1); / 显示光标移动设置 WriteCommandLCM(0x0C,1); / 显示开及光标设置 delayms(100);/=LCD1602显示子程序=/ 写数据函数: E =高脉冲 RS=1 RW=0/=*/void WriteDataLCM(uchar WDLCM)
30、ReadStatusLCM(); /检测忙 LCM_Data = WDLCM; LCM_RS = 1; LCM_RW = 0; LCM_E = 0; /若晶振速度太高可以在这后加小的延时 LCM_E = 0; /延时 LCM_E = 1;/*= 写指令函数: E=高脉冲 RS=0 RW=0=*/void WriteCommandLCM(uchar WCLCM,BuysC) /BuysC为0时忽略忙检测 if (BuysC) ReadStatusLCM(); /根据需要检测忙 LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0; LCM_E = 0; LCM_E =
31、 0; LCM_E = 1;/*= 正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1; DB7: 0 LCD控制器空闲,1 LCD控制器忙。 读状态=*/uchar ReadStatusLCM(void) LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; while (LCM_Data & Busy); /检测忙信号 return(LCM_Data);/*=功 能: 在1602 指定位置显示一个字符:第一行位置015,第二行1631说 明: 第 X 行,第 y 列 注意:字符串不能长于16个字符=*/void DisplayOneChar( uchar X, uchar Y, uchar ASCII) X &= 0x1; Y &= 0xF; /限制Y不能大于15,X不能大于1 if (X) Y |= 0x40; /当要显示第二行时地址码+0x40; Y |= 0x80; / 算出指令码 WriteCommandLCM(Y, 0); /这里不检测忙信号,发送地址码 WriteDataLCM(ASCII);/*= 设定延时时间:x*1ms=*/void delayms(uint Ms) uint i,TempCyc; for(i=0;i0;j-) ;