找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 83845|回复: 5
打印 上一主题 下一主题
收起左侧

基于单片机和GP2Y1010AU粉尘传感器的空气质量检测仪设计论文

  [复制链接]
跳转到指定楼层
楼主
ID:267736 发表于 2018-1-19 01:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 izhineng 于 2018-1-19 01:22 编辑

空气质量检测仪系统毕业设计

摘要
随着社会的发展,随着工业的发展,其给人们的生活带来很多便利。然而,工业生产过程中会产生很多对人体有害的因素,比如煤炭开采、水泥生产等行业中的粉尘污染。其在各种危害因素中对人体健康的影响最为严重。粉尘对人体的危害最直接、最严重的是引起尘肺病。当粉尘浓度过高时,在高温干燥的时候可能产生爆炸。
本设计采用由STC89C52单片机最小系统、GP2Y1010AU粉尘传感器、ADC0832模数转换器模块、LCD1602液晶模块、电源模块、蜂鸣器报警模块和按键模块模块组成。单片机实时通过ADC0832转换芯片采集GP2Y1010AU粉尘传感器的粉尘的浓度,通过单片机的数据转换处理后在液晶屏上显示空气中的质量,当测量空间中的粉尘浓度大于设置粉尘浓度时,蜂鸣器和发光二极管发出声光报警。粉尘的浓度报警值可以通过按键进行设置。

摘要
ABSTRACT
1、绪论
1.1课题的背景
1.2国内外研究现状  
2、总体方案设计
3、系统方案比较、设计与论证
3.1主控制器模块选择
3.2按键的选择
3.3显示模块的选择
3.4电源选取
4、芯片资料简介
4.1 GP2Y1010AU0F传感器简介
4.1.1内部原理图
4.1.2  主要参数
4.1.3 电光特性
4.1.5输入条件为LED端子
4.1.6 电路接线
4.1.7检出方法
4.2 ADC0832模数转换器简介
4.3LCD显示模块
4.3.1LCD1602的特性及使用说明
4.4 STC89C52单片机的简介
4.4.1 STC89C52单片机主要特性
5、硬件实现及单元电路设计
5.1主控制模块
5.2显示模块电路
5.3报警模块的设计
5.4按键模块的设计
5.5粉尘模块电路设计
5.6电源部分的设计
6、系统软件设计
6.1程序结构分析
6.2系统程序流图
6.2.1 DS18B20初始化程序流程图
6.2.2读温度子程序流程图
7、系统的安装与调试
7.1安装步骤
7.2电路的调试
结论
致谢
参考文献
附录1整体电路原理图
附录2元器件清单
附录3部分源程序

1、绪论
1.1课题的背景
粉尘又称可以入颗粒物,它是能进入呼吸道的,直径为10um的颗粒物,对人的眼睛、鼻腔、上呼吸道都十分有害。同时这种可吸入粉尘能长驱进入肺泡且沉积时间长,可导致心肺病、心血管疾病。粉尘做为病菌的载体,一同散入空气中,极易传播疾病。生产中许多及其工作环境对粉尘浓度也有要求,工厂中的很多粉尘携带有毒化学物质,人们长久呼吸或长久散落皮肤上容易导致癌症的产生。由此可以看出粉尘对人体健康和生产的巨大危害性,煤矿井下管道作业、煤炭生产都要产生大量的粉尘,加之煤炭井下通风条件较差,在炮采,纵采工作面,煤尘浓度可高达1000mg/m3以上。在此环境中工作的工人就会吸入这些细微灰尘,粉尘长时间进入人的呼吸系统,就会造成大量粉尘在肺泡中沉,引起慢性职业病,危机人的身体健康。此外粉尘还是煤矿安全生产的重大隐患,我国《煤矿安全规程》规定:粉尘中游离的sio2含量>10%时,粉尘浓度不得大于2mg/m3:当粉尘中游离sio2<10%时,粉尘浓度不得大于10mg/m3。因此,必须对煤矿井下粉尘进行实时检测,及时了解煤矿井下工人的劳动环境,掌握井下煤尘浓度及变化情况,为安全,防尘,降尘等措施提供必要现场数据。
    因此,空气质量检测仪意义重大是现代生活中不可缺少的必备品。
1.2国内外研究现状   
     在国内大多采用先进的测试技术,有的是β射线原理,其吸收量只与吸收物质的重量有关,而与吸收物质的物化性质无关完全等同于称重法,可直接读粉尘浓度。并且配不同的采样入口装置,可实现对总粉尘、可吸入粉尘、呼吸性粉尘进行监测。使用称重法比较,其相关系数大于97%,相对偏差小于10%。仪器采用的射线源符合核安全标准,可长期稳定工作。
    袖珍式激光粉尘仪是以激光管为光源,采用前向光散射原理设计,具有国际先进水平的最新型粉尘仪。该仪器适用于公共场所可吸入颗粒物浓度的快速测定以及环境保护,劳动卫生等方面粉尘浓度检测、工矿企业生产现场粉尘浓度的监测。
2、总体方案设计
本设计采用由STC89C52单片机最小系统、GP2Y1010AU粉尘传感器、ADC0832模数转换器模块、LCD1602液晶模块、电源模块、蜂鸣器报警模块和按键模块模块组成。单片机实时通过ADC0832转换芯片采集GP2Y1010AU粉尘传感器的粉尘的浓度,通过单片机的数据转换处理后在液晶屏上显示空气中的质量,当测量空间中的粉尘浓度大于设置粉尘浓度时,蜂鸣器和发光二极管发出声光报警。粉尘的浓度报警值可以通过按键进行设置。系统总体框图如图2-1所示:


2-1总体结构框图
3、系统方案比较、设计与论证

该系统主要由粉尘检测模块GP2Y1010AU、按键设置模块、报警模块和液晶显示模块态显电路组成,下面介绍实现此系统功能的方案。

3.1主控制器模块选择

方案1:

采用可编程逻辑器件CPLD              作为控制器。CPLD可以实现各种复杂的逻辑功能、规模大、密度高、体积小、稳定性高、IO资源丰富、易于进行功能扩展。采用并行的输入输出方式,提高了系统的处理速度,适合作为大规模控制系统的控制核心。但本系统不需要复杂的逻辑功能,对数据的处理速度的要求也不是非常高。且从使用及经济的角度考虑我们放弃了此方案。

方案2:

采用STC89C52单片机作为整个系统的核心,用其控制水温测量控制系统,以实现其既定的性能指标。充分分析我们的系统,其关键在于实现水温的自动控制,而在这一点上,单片机就显现出来它的优势——控制简单、方便、快捷。这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。STC89C52单片机具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是STC89C52单片机价格非常低廉。

3.2按键的选择

方案—:

    采用矩阵式键盘,此类键盘采用矩阵式行列扫描方式,优点是当按键较多时可降低占用单片机的I/O口数目,缺点为电路复杂且会加大编程难度。

方案二:

采用独立式按键电路,每个按键单独占有一根I/O接口线,每个I/O口的工作状态互不影响,此类键盘采用端口直接扫描方式。缺点为当按键较多时占用单片机的I/O口数目较多,优点为电路设计简单,且编程相对比较容易。

综合考虑两种方案及题目要求,考虑到系统资源有限,故采用第二种方案。

3.3显示模块的选择

方案1:

用数码管进行显示。数码管由于显示速度快,使用简单,显示效果简洁明了而得到了广泛应用。但是由于要显示温度。及设置菜单,用数码管无法显示如此丰富的内容,因此我们放弃了此方案。
方案 2:
    用LCD液晶进行显示。LCD由于其显示清晰,显示内容丰富、清晰,显示信息量大,使用方便,显示快速而得到了广泛的应用。对于此系统我们选用1602液晶能够很好的满足显示要求,因此我们选择了此方案。
3.4电源选取

     由于本系统采用电池供电,我们考虑了如下几种方案为系统供电。

方案1:

采用5V蓄电池为系统供电。蓄电池具有较强的电流驱动能力以及稳定的电压输出性能。但是蓄电池的体积过于庞大,在小型电动车上使用极为不方便。因此我们放弃了此方案。

方案2

采用3节1.5 V干电池共4.5V做电源,经过实验验证系统工作时,单片机、传感器的工作电压稳定能够满足系统的要求,而且电池更换方便。综上所述采用方案2

4、芯片资料简介4.1 GP2Y1010AU0F传感器简介
GP2Y1010AU0F是一个采用光学传感系统的灰尘传感器。该设备由红外线发光二极管(IRED)和一个光电管成对角布置而成。它通过检测空气中的尘埃的反射光。特别是,它能够有效地检测到像香烟烟雾等非常细的粒子。此外,他可以通过脉冲模拟输出区分房子内的烟雾和灰尘。

4.1.1内部原理图

4.1.2  主要参数

4.1.3 电光特性
4.1.4 LED输入端子输入的条件
参数
符号
数值
单位
脉冲周期
T
101
ms
脉冲宽度
Pw
0.320.02
ms
工作电源电压
VCC
50.5
V
4.1.5输入条件为LED端子

4.1.6 电路接线

引脚定义:

不接电容电阻接线示意图

添加一个电阻和一个电容,接线如下图!

Sensor Pin      Arduino Pin
1         Vled        –>    5V (150ohm resistor)
2         LED-GND     –>    GND
3         LED         –>    Digital pin 2
4         S-GND       –>    GND
5         Vo          –>    Analog pin 0
6         Vcc           –>     5V
4.1.7检出方法
GP2Y1010AU插上电源后,1秒内会稳定、正常的工作,可以进行检出。我们使用的方法是:从输出的电压来做判定。我们首先测出无尘无烟时的电压值。灰尘和烟检出时输出的区别:一般,烟是细微颗粒,密度高,会扩散式的大范围漂移。灰尘粉尘是一个一个的大颗粒,密度低,断断续续式的进入灰尘传感器的检出区域。就如下图所示,烟是连续的表现出较高的输出电压,灰尘是间隔的表现出较高的输出电压。因此,根据传感器的输出电压值在时间上的推移向微机软件的读取,是否无尘无烟/是否有烟/是否有灰尘/,不管是哪种状态,及空气污染程度是多少,都可以检出。
无尘时输出电压的更新:无尘时的输出电压是灰尘、烟的检出有无的判定级别的基准。无尘时的输出电压是根据发光二极管输出的低下、盒子内部灰尘的附着、周围温度等来进行变化的。发光输出低下,无尘时输出电压下降;器件盒子内部的灰尘附着能使无尘输出电压有上升的倾向。一般,发光二极管在长期通电的情况下,输出会降低,导致无尘输出电压及检出感度也会随之降低。此时就要根据标准进行输出电压及感度的补正。另外,也要定期清理器件盒子内部的污染物。

4.2 ADC0832模数转换器简介
ADC0832 是美国国家半导体公司生产的一种8 位分辨率、双通道A/D转换芯片。由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。学习并使用ADC0832 可是使我们了解A/D转换器的原理,有助于我们单片机技术水平的提高。ADC0832 具有以下特点:

· 8位分辨率;

· 双通道A/D转换

· 输入输出电平与TTL/CMOS相兼容

· 5V电源供电时输入电压在0-5V之间

· 工作频率为250KHZ,转换时间为32μS

· 一般功耗仅为15mW

· 8P、14P—DIP(双列直插)、PICC 多种封装

· 商用级芯片温宽为0°C ~ +70°C,工业级芯片温宽为-40°C ~ +85°C

芯片顶视图:


图1

芯片接口说明:
· CS_ 片选使能,低电平芯片使能。
· CH0 模拟输入通道0,或作为IN+/-使用。
· CH1 模拟输入通道1,或作为IN+/-使用。
· GND 芯片参考0 电位(地)。
· DI 数据信号输入,选择通道控制。
· DO 数据信号输出,转换数据输出。
· CLK 芯片时钟输入。
· Vcc/REF 电源输入及参考电压输入(复用)。
ADC0832 与单片机的接口电路:
ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择。
单片机对ADC0832 的控制原理:
正常情况下ADC0832 与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI 并联在一根数据线上使用。当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK 输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第1 个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。在第2、3个脉冲下沉之前DI端应输入2 位数据用于选择通道功能。当此2 位数据为“1”、“0”时,只对CH0 进行单通道转换。当2位数据为“1”、“1”时,只对CH1进行单通道转换。当2 位数据为“0”、 “0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。当2 位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1 作为正输入端IN+进行输入。到第3 个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下沉输出DATD0。随后输出8位数据,到第19 个脉冲时数据输出完成,也标志着一次A/D转换的结束。最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。
ADC0832时序图:
                                       图3
作为单通道模拟信号输入时ADC0832的输入电压是0~5V且8位分辨率时的电压精度为19.53mV。如果作为由IN+与IN-输入的输入时,可是将电压值设定在某一个较大范围之内,从而提高转换的宽度。但值得注意的是,在进行IN+与IN-的输入时,如果IN-的电压大于IN+的电压则转换后的数据结果始终为00H。
4.3LCD1602液晶显示模块4.3.1LCD1602的特性及使用说明
HJ1602A 是一种工业字符型液晶,能够同时显示16x02 即32个字符。(16列2行)。在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比较常用,软硬件都比较简单。
在单片机系统中应用晶液显示器作为输出器件有以下几个优点:
由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。
液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法。
一般1602字符型液晶显示器实物如图3-10和3-11所示:
图3-10 液晶屏正面
图3-11 液晶屏背面
(1)引脚说明:
第1脚:VSS为地电源。
第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平
R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15脚:背光源正极。
第16脚:背光源负极。
(2)1602LCD的RAM地址映射以及标准字库表
LCD1602液晶模块内部的字符发生存储器已经存储了160个不同的点阵字符图形,这些字符图有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母。
它的读写操作、屏幕和光标的操作都是通过指令编程来实现的(说明:1为高电平,0为低电平)。
指令1:清显示,指令码01H,光标复位到地址00H位置。
指令2:光标复位,光标返回到地址00H 。
指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 。S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效 。
指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示。 C:控制光标的开与关,高电平表示有光标,低电平表示无光标。 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁 。
指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标 。
指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线。      N:低电平时为单行显示,高电平时双行显示。 F:低电平时显示5X7的点阵字符,高电平时显示5x10的点阵字符 (有些模块是 DL:高电平时为8位总线,低电平时为4位总线)。
指令7:字符发生器RAM地址设置 。
指令8:DDRAM地址设置 。
指令9:读出忙信号和光标地址。 BF为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙,模块就能接收相应的命令或者数据。
指令10:写数据 。
指令11:读数据 。
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。
1602 内部显示地址如图3-12所示:
                         图3-12 1602内部显示地址
例如第二行第一个字符的地址是40H,那么是否直接写入40H 就可以将光标定位在第二行第 一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1,所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H) 。在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。1602 液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下图所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H 中的点阵字符图形显示出来,我们就能看到字母“A”。
4.4 STC89C52单片机的简介

主控模块模块在整个系统中起着统筹的作用,需要检测键盘,温度传感器等各种参数,同时驱动液晶显示相关参数,在这里我们选用了51系列单片机中的STC89C52单片机作为系统的主控芯片。

51系列单片机最初是由Intel 公司开发设计的,但后来Intel 公司把51 核的设计方案卖给了几家大的电子设计生产商,譬如 SST、Philip、Atmel 等大公司。因此市面上出现了各式各样的均以51 为内核的单片机。这些各大电子生产商推出的单片机都兼容51 指令、并在51 的基础上扩展一些功能而内部结构是与51一致的。

STC89C52有40个引脚,4个8位并行I/O口,1个全双工异步串行口,同时内含5个中断源,2个优先级,2个16位定时/计数器。STC89C52的存储器系统由4K的程序存储器(掩膜ROM),和128B的数据存储器(RAM)组成。

STC89C52单片机的基本组成框图见图3-1。

图3-1 STC89C52单片机结构图
4.4.1 STC89C52单片机主要特性
1. 一个8 位的微处理器(CPU)。
2. 片内数据存储器RAM(128B),用以存放可以读/写的数据,如运算的中间结果、最终结果以及欲显示的数据等,SST89 系列单片机最多提供1K 的RAM。
3. 片内程序存储器ROM(4KB),用以存放程序、一些原始数据和表格。但也有一些单片机内部不带ROM/EPROM,如8031,8032,80C31 等。目前单片机的发展趋势是将RAM 和ROM 都集成在单片机里面,这样既方便了用户进行设计又提高了系统的抗干扰性。SST 公司推出的89 系列单片机分别集成了16K、32K、64K Flash 存储器,可供用户根据需要选用。
4. 四个8 位并行I/O 接口P0~P3,每个口既可以用作输入,也可以用作输出。
5. 两个定时器/计数器,每个定时器/计数器都可以设置成计数方式,用以对外部事件进行计数,也可以设置成定时方式,并可以根据计数或定时的结果实现计算机控制。为方便设计串行通信,目前的52 系列单片机都会提供3 个16 位定时器/计数器。
6. 五个中断源的中断控制系统。现在新推出的单片机都不只5 个中断源,例如SST89E58RD 就有9 个中断源。
7. 一个全双工UART(通用异步接收发送器)的串行I/O 口,用于实现单片机之间或单机与微机之间的串行通信。
8. 片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接。最高允许振荡频率为12MHz。SST89V58RD 最高允许振荡频率达40MHz,因而大大的提高了指令的执行速度。
图3-2 STC89C52单片机管脚图
部分引脚说明:
1.时钟电路引脚XTAL1 和XTAL2:
XTAL2(18 脚):接外部晶体和微调电容的一端;片内它是振荡电路反相放大器的输出端,振荡电路的频率就是晶体固有频率。若需采用外部时钟电路时,该引脚输入外部时钟脉冲。
要检查振荡电路是否正常工作,可用示波器查看XTAL2 端是否有脉冲信号输出。
XTAL1(19 脚):接外部晶体和微调电容的另一端;在片内它是振荡电路反相放大器的输入端。在采用外部时钟时,该引脚必须接地。
2.控制信号引脚RST,ALE,PSEN 和EA:
RST/VPD(9 脚):RST 是复位信号输入端,高电平有效。当此输入端保持备用电源的输入端。当主电源Vcc 发生故障,降低到低电平规定值时,将+5V 电源自动两个机器周期(24个时钟振荡周期)的高电平时,就可以完成复位操作。RST 引脚的第二功能是VPD,即接入RST 端,为RAM 提供备用电源,以保证存储在RAM 中的信息不丢失,从而合复位后能继续正常运行。
ALE/PROG(30 脚):地址锁存允许信号端。当8051 上电正常工作后,ALE 引脚不断向外输出正脉冲信号,此频率为振荡器频率fOSC 的1/6。CPU 访问片外存储器时,ALE 输出信号作为锁存低8 位地址的控制信号。
平时不访问片外存储器时,ALE 端也以振荡频率的1/6 固定输出正脉冲,因而ALE 信号可以用作对外输出时钟或定时信号。如果想确定8051/8031 芯片的好坏,可用示波器查看ALE端是否有脉冲信号输出。如有脉冲信号输出,则8051/8031 基本上是好的。
ALE 端的负载驱动能力为8 个LS 型TTL(低功耗甚高速TTL)负载。
此引脚的第二功能PROG 在对片内带有4KB EPROM 的8751 编程写入(固化程序)时,作为编程脉冲输入端。
PSEN(29 脚):程序存储允许输出信号端。在访问片外程序存储器时,此端定时输出负脉冲作为读片外存储器的选通信号。此引肢接EPROM的OE 端(见后面几章任何一个小系统硬件图)。PSEN 端有效,即允许读出EPROM/ROM 中的指令码。PSEN 端同样可驱动8 个LS 型TTL 负载。要检查一个8051/8031 小系统上电后CPU 能否正常到EPROM/ROM 中读取指令码,也可用示波器看PSEN 端有无脉冲输出。如有则说明基本上工作正常。
EA/Vpp(31 脚):外部程序存储器地址允许输入端/固化编程电压输入端。当EA 引脚接高电平时,CPU只访问片内EPROM/ROM并执行内部程序存储器中的指令,但当PC(程序计数器)的值超过0FFFH(对8751/8051 为4K)时,将自动转去执行片外程序存储器内的程序。输入信号EA 引脚接低电平(接地)时,CPU 只访问外部EPROM/ROM 并执行外部程序存储器中的指令,而不管是否有片内程序存储器。对于无片内ROM 的8031或8032,需外扩EPROM,此时必须将EA 引脚接地。此引脚的第二功能是Vpp 是对8751 片内EPROM固化编程时,作为施加较高编程电压(一般12V~21V)的输入端。
3.输入/输出端口P0/P1/P2/P3:
P0口(P0.0~P0.7,39~32 脚):P0口是一个漏极开路的8 位准双向I/O口。作为漏极开路的输出端口,每位能驱动8 个LS 型TTL 负载。当P0 口作为输入口使用时,应先向口锁存器(地址80H)写入全1,此时P0 口的全部引脚浮空,可作为高阻抗输入。作输入口使用时要先写1,这就是准双向口的含义。在CPU 访问片外存储器时,P0口分时提供低8 位地址和8 位数据的复用总线。在此期间,P0口内部上拉电阻有效。
P1口(P1.0~P1.7,1~8 脚):P1口是一个带内部上拉电阻的8 位准双向I/O口。P1口每位能驱动4 个LS 型TTL 负载。在P1口作为输入口使用时,应先向P1口锁存地址(90H)写入全1,此时P1口引脚由内部上拉电阻拉成高电平。
P2口(P2.0~P2.7,21~28 脚):P2口是一个带内部上拉电阻的8 位准双向I/O口。P口每位能驱动4个LS 型TTL 负载。在访问片外EPROM/RAM 时,它输出高8 位地址。
P3口(P3.0~P3.7,10~17 脚):P3口是一个带内部上拉电阻的8 位准双向I/O口。P3口每位能驱动4个LS型TTL负载。P3口与其它I/O 端口有很大的区别,它的每个引脚都有第二功能,如下:
P3.0:(RXD)串行数据接收。
P3.1:(RXD)串行数据发送。
P3.2:(INT0#)外部中断0输入。
P3.3:(INT1#)外部中断1输入。
P3.4:(T0)定时/计数器0的外部计数输入。
P3.5:(T1)定时/计数器1的外部计数输入。
P3.6:(WR#)外部数据存储器写选通。
P3.7:(RD#)外部数据存储器读选通。
5、硬件实现及单元电路设计5.1主控制模块
主控制最系统电路如图4所示。单片机最小系统包括单片机、复位电路、时钟电路构成。
STC89C52 单片机的工作电压范围:4V-5.5V,所以通常给单片机外界5V直流电源。连接方式为单片机中的40脚VCC接正极5V,而20脚VSS接电源地端。
复位电路就是确定单片机的工作起始状态,完成单片机的启动过程。单片机接通电源时产生复位信号,完成单片机启动确定单片机起始工作状态。当单片机系统在运行中,受到外界环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。一般有上电自动复位和外部按键手动复位,单片机在时钟电路工作以后,在RESET端持续给出2个机器周期的高电平时就可以完成复位操作。本设计采用的是外部手动按键复位电路,需要接上上拉电阻来提高输出高电平的值。
    时钟电路好比单片机的心脏,它控制着单片机的工作节奏。时钟电路就是振荡电路,是向单片机提供一个正弦波信号作为基准,决定单片机的执行速度。XTAL1和XTAL2分别为反向放大器的输入和输出,该反向放大器可以配置为片内振荡器。如采用外部时钟源驱动器件,XTAL2应不接。因为一个机器周期含有6个状态周期,而每个状态周期为2个振荡周期,所以一个机器周期共有12个振荡周期,如果外接石英晶体振荡器的振荡频率为12MHZ,一个振荡周期为1/12us。

图4 单片主控电路
5.2显示模块电路
    显示模块采用LCD1602液晶显示器,能够清晰的在液晶上显示字符和数字,看到能让人感觉到舒服感。液晶的命令操作脚是RS、RW、EN接在单片机的P3^5、P3^6、P3^7脚。,数据脚D0~D7分别接单片机的的P1口。具体电路图如图5所示:

图5驱动电路
5.3报警模块的设计
本设计中声光报警电路采用NPN型S8550三极管驱动,当单片机的P1^3口输出低电平时,三极管的VE>VB>VC>0。三极管的发射结正偏,集电结反偏,三几个饱和导通,此时发光二极管和蜂鸣器发出声光报警,当单片机的P1^3口输出高电平时,三极管截止,声光报警停止工作。具体电路图如图6所示:
图6蜂鸣器工作原理图
5.4按键模块的设计
空气质量检测系统的灰尘参数可以通过按键进行设置。一个参数加键,一个参数减键。通过这两个按键进行设置。具体电路图如图7所示:
图7按键模块电路图
5.5粉尘模块电路设计
夏普光学灰尘传感器(GP2Y1010AU0F)在检测非常细的颗粒,如香烟烟雾,是特别有效的,并且是常用的空气净化器系统。传感器的第一脚接了一个220uF的电解电容和150欧姆的电阻。第二脚接到单片机的P32外部中断0口,第五脚是粉尘浓度的模拟量输出脚,接在模数转换器ADC0832的通道1上。具体电路图如图8所示:
图8粉尘模块电路

5.6电源部分的设计
空气质量检测系统采用3节1.5 V干电池共4.5V做电源,经过实验验证系统工作时,单片机、传感器的工作电压稳定能够满足系统的要求,而且电池更换方便。电源接口电路如图9,其中DC5V为电池接口,SW1为电源开关,R6为二极管的限流电阻,POWER为电源指示灯,C5和C6为电源的滤波电容。
图9电源接口电路
6、系统软件设计6.1程序结构分析

  主程序调用了3个子程序,分别是液晶屏显示程序、PM2.5处理程序、按键设定报警温度程序。温度信号处理程序:对温度芯片送过来的数据进行处理,进行判断和显示。数码管显示程序:向数码管的显示送数,控制系统的显示部分。按键设定程序:可以设定低温和高温报警可精确到0.1度。

6.2系统程序流图

主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,主程序的主要功能是负责温度的实时显示,读出并处理DS18B20的当前温度值,与设定的报警温度比较,其程序流程见图9所示。

通过调用读温度子程序把存入内存储中的整数部分与小数部分开分存放在不的的两个单元中,然后通过调用显示子程序显示出来。


图9 DS18B20温度流程图

6.2.1 DS18B20初始化程序流程图

在DS18B20工作之前需要进行初始化,流程图如下:


                       图10 初始化程序流程图

6.2.2读温度子程序流程图

    读温度子程序的主要功能是从DS18B20中读出温度数据,移入温度暂存器保存。其程序流程图如下:

                          图11 温度子程序流程图


7、系统的安装与调试  7.1安装步骤
1.检查元件的好坏
按电路图买好元件后首先检查买回元件的好坏,按各元件的检测方法分别进行检测,一定要仔细认真。而且要认真核对原理图是否一致,在检查好后才可上件、焊件,防止出现错误焊件后不便改正。
2.放置、焊接各元件
按原理图的位置放置各元件,在放置过程中要先放置、焊接较低的元件,后焊较高的和要求较高的元件。特别是容易损坏的元件要后焊,在焊集成芯片时连续焊接时间不要超过10s,注意芯片的安装方向。 .

7.2电路的调试
首先烧入液晶显示程序,看显示是否正常显示。如果不正常检测LCD1602液晶的各引脚的焊接情况,有没有虚焊,短焊,错焊的情况。显示正常之后,在程序加入粉尘检测程序,看粉尘检测是否正常,然后加入按键进行整机调试,在程序调试时,延时有的过长、有的过短。类似的现象还有很多就不一一列举了。
结论
空气质量检测仪系统采用了单片机STC89C52作为系统控制核心,最大限度的将其具备的资源应用到设计中,既体现了单片机最小系统的应用的灵活性,又实现功能多样的智能化。由于采用了单片机对空气质量的检测尘埃、香烟、油烟等。可以检测出空气中的灰尘的程度,在液晶上进行显示,具有非常重要的市场应用价值。
通过实践的学习,使我对整体的电路设计有了一个更全面的了解,锻炼了重全局考虑局部的能力。深刻体会了理论联系实际的重要性,从老师提出设计要求到完成设计报告,不断的完善自己的设计和电路。在图书馆查资料到写出具体的实施方案、画出电路图都要认真考虑,寻找最优的设计方案。经过多次修改最终于实现了设计要求。
在大学四年的学习和课题研究期间,老师们给予我许多悉心的指导和帮助,教给我知识和为人处世的道理。尤其是这次毕业论文设计,在这里非常感谢老师在设计中给我的建议、支持和帮助,非常感谢老师在我写论文期间对我的引导和启发。在整个论文的选题、理论研究、需求分析、总体设计、详细设计的过程中,自始至终得到了老师的悉心指导和深切关怀。感谢导师对我论文不厌其烦的精心修改,多次耐心地审阅了论文全稿,提出了许多宝贵的意见。还有一只在身边支持的同学,在我遇到问题时,他们都尽心为我解答,如果遇到我们都不熟悉的问题,他们都和我一起动手解决。由于老师的支持和同学的各方配合使我的课题能顺利的完成。

致谢
    本设计是在老师的悉心指导和热情关怀下完成的。老师渊博的学识、严峻的治学态度及随和的为人之道给我留下了难以磨灭的印象,这将使我终身受益。同时,老师在生活上也给了我极大的鼓励和帮助。为此,我要对他致以最衷心的感谢。
    在本科学习的四年中,我与同学建立了深厚的友谊,他们在我遇到困难时无私地伸出援助之手,对他们的帮助我特别感谢。最后,对关心、支持我的亲人和老师致以最衷心的感谢。
参考文献
[1] 李文忠,段朝玉 .短距离无线数据通信[M].北京:北京航空航天大学出版社,2006.
[2]  李艳红,李海华.传感器原理及其应用[M].北京:北京理工大学出版社,2010.
[3]  傅扬烈. 单片机原理与应用教程[M].北京:电子工业出版社,2002.
[4]  谭浩强.C程序设计[M].北京:清华大学出版社,1999 .
[5]  何希才, 薛永毅.传感器及其应用实例[M].北京:机械工业出版社,2004.
[6]  Simon Haykin,Machael Moher,郑宝玉.现代无线通信[M].北京:电子工业出版社, 2006.
[7] 武庆生,仇梅.单片机原理与应用[M].成都:电子科技大学出版社,1998.
[8] 周航慈.单片机应用程序设计技术[M].北京:北京航空航天大学出版社,1991.
[9] 谭浩强.C程序设计北京[M].北京:清华大学出版社,1999 .

附录1整体电路原理图
附录2元器件清单
Comment
Designator
LibRef
Quantity
蜂鸣器
BUUZER
BUZZER
1
电解电容
C1
10uF
1
电解电容
C2
220uF
1
瓷片电容
C3, C4
18pF
2
电解电容
C5
470uF
1
瓷片电容
C6
104
1
排针
DC 5V
Header 2
2P
触点开关
JIA, JIAN,RESET
SW-PB
3
液晶
LCD1602
LCD1602
1
发光二极管
LED1, POWER
SI3317-H
2
灰尘传感器
PM1
Header 6
1
三极管
Q1
S8550
1
排阻
R1
4.7K
1
电阻
R2, R4, R5, R6
2K
5
电阻
R10
150
1
电阻
R3
10K
1
自锁开关
SW1
SW-SPDT
1
单片机座
U1
DIP-40
1
单片机
U1
STC89C52
1
A/D模数转换芯片
U2
ADC0832
1
晶振
Y1
11.0592M
1
附录3部分源程序
单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. sbit TEST  = P3^1;
  5. sbit CS   = P1^2;  //ADC0832引脚定义
  6. sbit Clk  = P1^1;
  7. sbit DATI = P1^0;
  8. sbit DATO = P1^0;

  9. #define LCD_PINDATA P0                //数据端口定义 P2
  10. sbit RS  =  P1^4;                              //RS P0^7
  11. sbit RW  =  P1^5;                              //RW P0^6
  12. sbit E   =  P1^6;                              //E  P0^5

  13. sbit BUZZER = P1^3;              //蜂鸣器驱动端口==P1^2
  14. sbit Reduc  = P1^7;              //按键键输入端口==P1^7
  15. sbit Add = P3^0;              //按键加输入端口==P3^1

  16. uint adc_val;
  17. uchar flag=0;
  18. /************************************************
  19. ** 函数名称 : Delay(uint T)
  20. ** 函数功能 : 延时函数
  21. ** 输    入 : T--延时倍数 大小--0~65535
  22. ** 输    出 : 无
  23. ** 说    明 :
  24. ************************************************/
  25. void Delay(uint T)
  26. {
  27.     uchar i;
  28.     for(T;T>0;T--)
  29.         for(i=200;i>0;i--);
  30. }
  31. /****************************************************************************
  32. 函数功能:AD转换子程序
  33. 入口参数:CH
  34. 出口参数:dat
  35. ****************************************************************************/
  36. unsigned char adc0832(unsigned char CH)
  37. {
  38.               unsigned char dat = 0x00;      //AD值
  39.     unsigned char i,test,adval;
  40.     adval = 0x00;
  41.     test = 0x00;
  42.     Clk = 0;       //初始化
  43.     DATI = 1;
  44.     _nop_();
  45.     CS = 0;
  46.     _nop_();
  47.     Clk = 1;
  48.    _nop_();
  49.               if ( CH == 0x00 )      //通道选择
  50.                  {
  51.                   Clk = 0;
  52.                      DATI = 1;      //通道0的第一位
  53.                      _nop_();
  54.                     Clk = 1;
  55.         _nop_();
  56.         Clk = 0;
  57.                     DATI = 0;      //通道0的第二位
  58.                     _nop_();
  59.                     Clk = 1;
  60.       _nop_();
  61.     }              
  62.     else
  63.     {
  64.        Clk = 0;
  65.                     DATI = 1;      //通道1的第一位
  66.        _nop_();
  67.        Clk = 1;
  68.        _nop_();
  69.                     Clk = 0;
  70.                     DATI = 1;      //通道1的第二位
  71.                   _nop_();
  72.                    Clk = 1;
  73.                    _nop_();
  74.     }
  75.     Clk = 0;
  76.     DATI = 1;
  77.     for( i = 0;i < 8;i++ )      //读取前8位的值
  78.     {
  79.                     _nop_();
  80.                      adval <<= 1;
  81.                      Clk = 1;
  82.                      _nop_();
  83.                      Clk = 0;
  84.                      if (DATO)
  85.                         adval |= 0x01;
  86.                     else
  87.                         adval |= 0x00;
  88.     }
  89.     for (i = 0; i < 8; i++)      //读取后8位的值
  90.     {
  91.         test >>= 1;
  92.         if (DATO)
  93.                          test |= 0x80;
  94.         else
  95.             test |= 0x00;
  96.         _nop_();
  97.         Clk = 1;
  98.                      _nop_();
  99.         Clk = 0;
  100.      }
  101.      if (adval == test)      //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
  102.           dat = test;
  103.       _nop_();
  104.       CS = 1;        //释放ADC0832
  105.       DATO = 1;
  106.       Clk = 1;
  107.       return dat;
  108. }
  109. /************************************************
  110. ** 函数名称 : WriteCOMDATA(uchar LCD_DATA,uchar N)
  111. ** 函数功能 : LCD1602写指令、数据函数
  112. ** 输    入 : LCD_DATA:指令或者数据
  113.                N:指令方式还是数据方式
  114.                                              N=0时,LCD_DATA为指令,N=1时,LCD_DATA为数据
  115. ** 输    出              : 无
  116. ** 说    明 :
  117. ************************************************/
  118. void WriteCOMDATA(uchar LCD_DATA,uchar N)
  119. {
  120.               Delay(10);
  121.               E=1;
  122.               RW=0;
  123.               RS=N;
  124.               LCD_PINDATA=LCD_DATA;
  125.               E=0;
  126. }
  127. /************************************************
  128. ** 函数名称 : void LCD_init(void)
  129. ** 函数功能 : LCD1602初始化操作
  130. ** 输    入 : 无
  131. ** 输    出 : 无
  132. ** 说    明 :
  133. ************************************************/
  134. void LCD_Init(void)
  135. {
  136.     WriteCOMDATA(0x01,0);
  137.               Delay(500);
  138.               WriteCOMDATA(0x38,0);
  139.               Delay(10);
  140.               WriteCOMDATA(0x06,0);
  141.               Delay(10);
  142.               WriteCOMDATA(0x0c,0);
  143.               Delay(10);
  144. }
  145. /************************************************
  146. ** 函数名称 :void WriteChar(uchar Row,uchar Col,uchar Num,uchar *pBuffer)
  147. ** 函数功能 :在任意位置写指定个字符
  148. ** 输    入 :Row : 要写的字符所在的行,只能为1或2;
  149.               Col : 要写的字符所在的列,只能为0---15
  150.               Num : 要写字符的个数
  151.               pbuffer : 要写字符的首地址
  152. ** 输    出 :无
  153. ** 说    明 :
  154. ************************************************/
  155. void WriteChar(uchar Row,uchar Col,uchar Num,uchar *pBuffer)
  156. {
  157.               uchar i;
  158.               if(Row==1)Row=0x80+Col;
  159.               else Row=0xC0+Col;
  160.               WriteCOMDATA(Row,0);
  161.               for(i=Num;i!=0;i--)
  162.               {            
  163.                             WriteCOMDATA(*pBuffer,1);            
  164.                             pBuffer++;
  165.               }
  166. }
  167. /************************************************
  168. ** 函数名称 : Init_Timer0(void)
  169. ** 函数功能 : 定时器0初始化子程序
  170. ** 输    入 : 无
  171. ** 输    出 : 无
  172. ** 说    明 : 对定时器0进行初始化 模式1 16位定时器              0~65536
  173. ************************************************/
  174. void Init_Timer0(void)                              //定时器初始化子程序
  175. {
  176.               TMOD |= 0x01;                //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                                
  177.               TH0=0xFF;                    //定时器赋初值
  178.               TL0=0xA4;                  
  179.               ET0=1;            //使能定时器中断
  180.               TR0=1;            //打开定时器
  181.               EA=1;             //打开总中断
  182. }
  183. /************************************************
  184. ** 函数名称 : void System_init(void)
  185. ** 函数功能 : 系统初始化
  186. ** 输    入 : 无
  187. ** 输    出 : 无
  188. ** 说    明 : 对端口进行初始化及开机状态指示灯提示
  189. ************************************************/
  190. void System_init(void)
  191. {
  192.               P0=0xFF;                //端口初始化
  193.               P1=0xFF;                //端口初始化
  194.               P2=0xFF;                //端口初始化
  195.               P3=0xFF;                //端口初始化
  196. }
  197. /************************************************
  198. ** 函数名称 : void Timer0_isr(void) interrupt 1 using 1
  199. ** 函数功能 : 定时器0中断函数
  200. ** 输    入 : 无
  201. ** 输    出 : 无
  202. ** 说    明 :
  203. ************************************************/
  204. void Timer0_isr(void) interrupt 1 using 1
  205. {
  206.               TH0=0xFF;                               //重新赋值
  207.               TL0=0xA4;
  208.               TR0=0;
  209.               count_100us++;
  210.               //if(count_100us==15)adc_val=adc0832(0);
  211.               if(count_100us<25){TEST=0;flag=1;}
  212.               else if(count_100us<81){TEST=1;flag=0;}
  213.               else count_100us=0;            
  214.               //TEST=~TEST;      //状态指示灯取反
  215.               TR0=1;
  216. }
  217. /************************************************
  218. ** 函数名称 : void main(void)
  219. ** 函数功能 : 主函数
  220. ** 输    入 : 无
  221. ** 输    出 : 无
  222. ** 说    明 :
  223. ************************************************/
  224. void main(void)
  225. {
  226.               uchar count,flag=0;
  227.             
  228.               uchar baojing_val=80;
  229.               uchar disp[16]={"Dus:    Dus_L:  "};
  230.               System_init();                              
  231.               LCD_Init();
  232.               Init_Timer0();                           
  233.               WriteChar(1,0,16,"Air Quality Sys ");  //在第一行显示QQ里面的字符
  234.               while(1)                             
  235.               {                                                                                                   
  236.                             WriteChar(2,0,16,disp); //在第二行显示
  237. //                            count=200;
  238. //                            while(count){if(!flag)adc_val+=adc0832(1)*100/255;count--;}
  239. //                            adc_val=adc_val/200;
  240.                             adc_val=adc0832(1)*100/255;
  241.                             disp[4]=adc_val/10+0x30;
  242.                             disp[5]=adc_val%10+0x30;
  243.                             disp[14]=baojing_val/10+0x30;
  244.                             disp[15]=baojing_val%10+0x30;
  245. //                            Delay(600);
  246.                             if(Reduc==0)
  247.                             {
  248.                                           Delay(400);
  249.                                           //while(Reduc==0);
  250.                                           baojing_val--;
  251.                                           if(baojing_val<=0)baojing_val=0;                           
  252.                             }

  253. ……………………

  254. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整的设计资料51hei提供下载
(仿真+原理图+PCB文件+源码+word格式的论文):

http://www.51hei.com/bbs/dpj-105336-1.html


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:318466 发表于 2018-5-6 15:29 | 只看该作者
楼主能发下完整的电路图吗
回复

使用道具 举报

板凳
ID:318466 发表于 2018-5-6 16:30 | 只看该作者
请问楼主能发下完整的电路图及源程序吗
回复

使用道具 举报

地板
ID:540914 发表于 2019-5-17 19:57 | 只看该作者
这个怎么实现按键控制掉电保存啊
回复

使用道具 举报

5#
ID:547587 发表于 2020-3-18 20:49 | 只看该作者
程序流程明明是粉尘,硬写成了温度c传感器
回复

使用道具 举报

6#
ID:910323 发表于 2021-5-4 15:50 来自手机 | 只看该作者
大打算 发表于 2019-5-17 19:57
这个怎么实现按键控制掉电保存啊

用AT24C02保存
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表