一种基于51单片机的粉尘监测系统的设计—定稿 - 图文 下载本文

届 别 2016届 ..

学 号

毕业设计

基于51单片机的PM2.5检测系统的设计与实现

姓 名 系 别、 专 业 电子信息与电气工程学院

电子信息科学与技术专业 导 师 姓 名、职 称

完 成 时 间 2016年5月10日

目 录

摘 要 ...................................................... I Abstract ................................................... II 1 绪论 ..................................................... 1 1.1 课题背景 ................................................ 1 1.2 国内外研究现状 .......................................... 1 2 系统仿真软件及总体设计方案 ................................ 1 2.1 Keil4软件开发坏境....................................... 1 2.2 软件烧录工具 ............................................ 2 2.3程序结构分析 ............................................. 4 2.4 整体的设计方案 .......................................... 4 2.5电源模块 ................................................. 4 3 主要元器件简介 .....................................................................................................4 3.1 GP2Y1010AU0F传感器简介 ................................. 5 3.2 ADC0832模数转换器简介 .................................. 8 3.3 LCD1602液晶显示屏...................................... 10 3.4 STC89C52单片机的简介 .................................. 12 4 系统单元电路模块设计 ..................................... 15 4.1主控制模块 .............................................. 15 4.2显示模块电路 ............................................ 16 4.3关于报警模块的设计...................................... 16 4.4按键模块的设计 .......................................... 17 4.5粉尘模块电路设计........................................ 17 4.6电源部分的设计 .......................................... 18 5 系统测试与实现 ........................................... 19 5.1系统程序流图 ............................................ 19 5.2 仿真电路 ............................................... 20 5.3 软件跟硬件结合 ......................................... 21 5.4 测试结果分析 ........................................... 23 5.5 系统实现 ............................................... 23 6、总结 .................................................... 24 致 谢 ...................................................... 25

参考文献 ................................................... 26 附录1:系统整体电路原理图 ................................. 27 附录2:系统设计部分源程序 ................................. 28

摘 要

现在社会发展的越来越快,随着工业的发展,虽然给人们的生活带来很多便利。但是,在生产过程产生很多对人体有害的因素工业生产过程中会,例如煤炭灰开采、水泥生产等行业中的粉尘污染。

我的设计采用由LCD1602液晶模块、STC89C52单片机最小系统、ADC0832模数转换器模块、GP2Y1010AU粉尘传感器、电源模块、蜂鸣器报警模块和按键模块模块组成。单片机是通过ADC0832转换芯片采集GP2Y1010AU粉尘传感器的粉尘的浓度,通过单片机的数据转换处理后在液晶屏上显示空气中的质量,测量空间中的粉尘浓度如果大于当时设置粉尘浓度时,蜂鸣器就会产生报警的声音和发光二极管发出声光报警。当然,粉尘的浓度报警值我们可以通过按键来进行设置。

关键字:GP2Y1010AU0F传感器;粉尘检测;空气质量

I

Abstract

With the development of society and industry, which brings a lot of convenience to people's life. However, it will produce a lot of harmful factors in the process of industrial production, such as coal mining, cement production and other industries in the dust pollution. In a variety of risk factors on human health effects of the most serious. The dust harm to human body is the most direct, the most serious is the cause of pneumoconiosis.When the dust concentration is too high, the high temperature drying time may explode.

The design used by STC89C52 MCU minimum system, gp2y1010au dust sensor, ADC0832 ADC module, LCD1602 LCD module, power supply module, buzzer alarm module and a key module. Single-chip microcomputer real-time through the ADC0832 conversion chip acquisition gp2y1010au dust sensor dust concentration, through the single-chip microcomputer data conversion processing in the LCD screen display in the air quality, when the spatial measurement of dust concentration is higher than the set of dust concentration, buzzer and light-emitting diodes emit sound and light alarm. The dust concentration alarm value can be set through the buttons.

Key words: GP2Y1010AU0F detection sensors;Dust detection;dust and air quality

II

1 绪论

1.1 课题背景

粉尘又称可吸入颗粒物,它是能被呼吸道粘连,直径有10um的颗粒物状,对人的眼睛、上呼吸道、鼻腔都非常有害。粉尘和烟雾它是做为病菌的载体,如果一旦分散到空气中,就会很容易传播各种疾病。人们长久呼吸或长久散落皮肤上会容易导致癌症。由此可以看出粉尘对人体健康和生产的会产生巨大危害性,煤矿井下管道作业、煤炭生产都要产生大量的粉尘,加上煤炭井下没有通风的条件,煤尘浓度可高达1000mg/m3以上。在这环境中工作中,工人会吸入大量的粉尘,如果粉尘长时间进入人的呼吸系统,大量粉尘会在肺泡中沉积,会引起慢性职业病,严重的危机人的身体健康。因此,我们必须对煤矿井下粉尘进行实时检测和采取应急的措施,及时了解煤矿井下工人的劳动环境和安全,并且掌握井下煤尘浓度及变化情况,以及采取应急措施来改变粉尘的浓度,为安全,防尘,降尘等措施提供必要现场数据和采取措施降低浓度。

1.2 国内外研究现状

在我国内大多采用先进的测试粉尘技术,有的是β射线原理,其吸收量只与吸收物质的重量相关,而与吸收物质的物化性质无关,可直接读粉尘浓度。

2 系统仿真软件及总体设计方案

2.1 Keil4软件开发坏境

Keil4 C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开

发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil4 软件开发环境如图1所示:

1

图1 Keil4软件开发环境

我用的是keil4软件开发坏境,该软件能够开发和调试软件,我用的是C语言作为开发语言,该语言是我们大学上的一门专业课语言,所以我的开发语言是C语言。

2.2 软件烧录工具

在keil4软件开发完成并且编译没有错误的情况下,为了要实现软件与硬件同时工作,软件来控制硬件来达到PM2.5检测系统与实现,这样就能达到毕业设计的目的,软件烧录我用的是STC_ISP软件,运用这个软件就能把我自己设计的工程软件烧录到STC51单片机里,在把单片机芯片放到我自己焊的硬件中,就能达到测试的效果,STC_ISP软件如图2所示,还有烧录的单片机如图3所示:

2

图2 STC_ISP烧录软件

图3 烧录工具

3

2.3程序结构分析

主程序对所用到的外设资源进行初始化,还调用了LCD显示程序、键值设定

程序、对ADC0832以及粉尘传感器数据处理程序3个子程序,LCD显示程序都需要更新数值,键值动作变化或者粉尘浓度数据有改变时。在本章主要介绍主程序流程,和对ADC0832以及粉尘传感器数据处理子程序流程。

2.4 整体的设计方案

毕业设计采用ADC0832模数转换器模块、LCD1602液晶模块、STC89C52单片机最小系统、GP2Y1010AU粉尘传感器、电源模块、蜂鸣器报警模块和按键模块模块等模块组成。单片机实时通过ADC0832转换芯片采集GP2Y1010AU粉尘传感器的粉尘的浓度,通过单片机的数据转换处理后在液晶屏上显示空气中的质量,当测量空间中的粉尘浓度大于设置粉尘浓度时,蜂鸣器和发光二极管发出声光报警。粉尘的浓度报警值可以通过按键进行设置。系统总体框图如图4所示:

图4 总体结构框图

粉尘传感器 ADC0832 单片机 STC89C52最小系统 LCD显示 按键模块 电源模块 蜂鸣器报警

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

2.5电源模块

采用5V蓄电池为系统提供电源。蓄电池是具有稳定的电压输出性能以及较强的电流驱动能力。可以运用电脑和充电宝,用起来也比较方便也很实惠。

3 主要元器件简介

4

3.1 GP2Y1010AU0F传感器简介

一、GP2Y1010AU0F物理特性

GP2Y1010AU0F是一个采用光学传感系统的灰尘传感器。该设备由一个光电管成对角和红外线发光二极管(IRED)布置而成。它通过检测空气中的灰尘的反射光。特别是,它能够灵敏有效地检测到像香烟烟雾等非常细小的粒子。出此之外,它也还可以通过脉冲冲模拟输出来分别区分屋子内的烟雾和灰尘。其内部原理图如图5所示:

图5 GP2Y1010AU0F内部原理图

其中IRED代表红外发光二极管,Dust through hole代表通孔的粉尘,Dust or Smoke particle代表粉尘或烟雾粒子,amplifier circuit代表放大电路,For sensitive adjustment代表对于敏感的调整; 其主要参数如表1所示:

表1 GP2Y1010AU0F主要参数

主要参数 灵敏度

技术条件 0.5V/(0.1mg/m3) 5

备注

输出电压 供电电流 体积规格 兼容性 供应电压Vcc 输入终端电压 适应温度

其电光特性如表2所示:

0.9(TYP) 11mA 46.0*30.0*17.6 兼容 -0.3~+0.7 -0.3~Vcc -10~65 无灰尘 单位 mm 无铅ROHS指令 单位 V Vled单位 V 单位 ℃ 表2 GP2Y1010AU0F 光电特性

最小 灵敏度 K 1*2*3 0.35 输出电压 Voc 1*2*3 0 输出电压范围 Voh Rl=4.7K 3.4 LED端子电流 I (led) LED端子=0V - 消耗电流 Icc RL=无穷大 -

参数 符号 工作条件 典型值 0.5 0.9 - 10 11 最大 0.65 单位 V/(0.1mg/m3) 1.5 V - V 20 mA 20 mA 其中灵敏度是由输出电压变化量规定时粉尘浓度有0.1毫克/立方米指定。 LED输入端子输入的条件如表3所示:

表3 LED输入端子输入条件

参数 脉冲周期 脉冲宽度 工作电源电压

其引脚定义和实物图如图6所示:

符号 T Pw VCC 数值 10?1 0.32?0.02 5?0.5 单位 ms ms V

6

图6 GP2Y1010AU引脚定义和实物图

二、GP2Y1010AU0F检出方法

GP2Y1010AU0F插上电源或者接上干电池后,1秒内就会稳定、正常的工作,可以进行检出。我们使用的方法是:从输出的电压来进行分析和判定。首先测出无尘无烟时的电压值并且保存下来。灰尘和烟检出时输出的区别:一般,烟是细小的颗粒,密度很高,狂撒速度非常的快。灰尘粉尘是一个一个的大颗粒,密度非常低,陆陆续续式的进入灰尘传感器的检出区域并且进行检测。就如图7所示,

图7 GP2Y1010AU0F检测灰尘和烟雾输出电压波形比较

7

3.2 ADC0832模数转换器简介

ADC0832功能与引脚简介

ADC0832 是双通道A/D转换芯片,也一种8 位分辨率。因为它体积非常小,兼容性也比较强,性价比高。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 ADC0832实物引脚图如图8所示:

图8 ADC0832实物引脚图

芯片引脚接口说明:

· CS_ 片选使能,低电平芯片使能。

· CH0 模拟输入通道0,或作为IN+/-使用。 · CH1 模拟输入通道1,或作为IN+/-使用。

8

· GND 芯片参考0 电位(地)。 · DI 数据信号输入,选择通道控制。 · DO 数据信号输出,转换数据输出。

· Vcc/REF 电源输入及参考电压输入(复用)。 ADC0832 与单片机的接口电路如图9所示:

图9 ADC0832 与单片机的接口电路图

ADC0832 是八位分辨率A/D转换芯片,可以适应一般的模拟量转换要求。芯片的模拟电压输入在0~5V之间。 单片机对ADC0832 的控制原理

一般情况,DO端与DI端在通信时并不会同时有效的与单片机的接口是双向的,所以电路设计可以把DO和DI 并联在一起,在同一根数据线上使用输入输出数据,能够方便的传输数据。

在进行A/D转换时,应该先将CS使能端拉到低电平,而且要保持低电平直到转换最后完全结束。首先在第一个时钟脉冲的下沉之前,DI端必须从低电平拉到高电平,这个是启始信号。在第二、三个脉冲下沉之前,DI端应该输入二位数据,目的用于选择通道功能。 ADC0832时序图如图10所示:

9

图10 ADC0832时序图

3.3 LCD1602液晶显示屏

LCD1602 能够同时显示16x02 即32个字符,是一种字符型液晶显示屏。在日常生活中,液晶显示器在我们的生活中常常能够使用到。液晶显示模块也已经作为很多很多的电子产品的必要设备。

液晶显示器每一个点在接受信号后就会一直保持着那个状态和颜色。 一般1602字符型液晶显示器实物如图11,图12所示:

图11 液晶屏正面

10

图12 液晶屏背面

LCD1602引脚:

第1脚:VSS为地电源。 第2脚:VDD接5V正电源。

第3脚:VL是液晶显示器对比度调整端,当接地时,对比度就是最高了,当接正电源时,对比度就是最弱的,我们使用时就可以通过一个10K的电位器调整对比度,避免产生“鬼影”。

第4脚:RS是寄存器选择,当处于高电平时,是选择数据寄存器,当处于低电平时,就是选择指令寄存器。

第5脚:R/W是读写信号线,当处于高电平时,是进行读操作,当处于低电平时,是进行写操作。

第6脚:E端为使能端,当E端由高电平跳变到低电平时,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。

LCD1602的RAM地址映射以及标准字库表的内部的字符发生存储器就有一百六十个不同的字符,每一个字符都是由一个特定固定的代码组成。

11

指令1:清显示。

指令2:光标复位,光标返回到地址00H 。

指令3:S:低电平则表示无效,高电平表示为有效。

指令4:显示开关控制。A:控制光标是否闪烁,高电平表示闪烁,低电平表示不闪烁 。B:控制整体显示的开与关,高电平表示的开显示,低电平表示的关显示。

指令5:光标或显示移位 S/C:低电平时移动光标,高电平时移动显示的文字。

指令6:字符发生器RAM地址设置 。 指令7:DDRAM地址设置 。 指令8:读出光标地址和忙信号。 指令10:写数据 。 指令11:读数据 。

1602内部显示地址如图13所示:

图13 1602内部显示地址

3.4 STC89C52单片机的简介

STC89C52模块模块在整个系统中起着非常重要的作用,我们需要检测键盘,温度传感器等各种参数,同时也要驱动液晶显示的数据及相关参数,所以我闲着

12

了在这里我们选用了STC89C52单片机作为系统芯片。

Intel 公司是最早对51系列的单片机进行开发设计的,Intel 公司后来将51核的设计方案提供给Philip、Atmel、SST等这些电子设计生产商,这些公司根据Intel 公司提供的相关设计方案的基础之上,生产了多种以51为内核的单片机。这些主要电子产品制造商已经介绍了微控制器兼容的51指令,并在51基于扩展的一些功能和内部结构是一致的51。

STC89C52一共有40个引脚,1个全双工异步串行口,4个8位并行I/O口,2个16位定时/计数器同时内含5个中断源,2个优先级。

STC89C52的存储器系统由4K的程序存储器(掩膜ROM),和128B的数据存储器(RAM)组成。

STC89C52单片机的基本组成框图见图14。

XTAL2时钟电路XTAL1RAM128BSFR 21个定时个/计数器2VccCPUROM/EPROM/Flash 4KB总线控制中断系统5个中断源2个优先级串行口全双工1个4个并行口VssRSTEAPSENALEP0P1P2P3

图14 STC89C52单片机结构图

单片机STC89C52主要特性如下:

1. 一个8 位的微处理器(CPU)。

2. 片内数据存储器RAM(128B),用以存放可以读/写的数据。

3. 单片机的发展趋势主要是将RAM 和ROM 都集成在其单片机当中,这样不仅让用户进行设计时方便及快捷的同时又提升对其系统的抗干扰性。

4. 四个8 位并行I/O 接口P0~P3,每个口不仅用作输入,仍可以用作输出。 5. 两个定时器/计数器,每个定时器/计数器都可以设置成计数方式,对外部事件进行计数,同样也可以设置成定时方式,为了实现计算机控制可以根据计数

13

或定时的结果。为方便设计串行通信,提供3 个16 位定时器/计数器目前就是52 系列单片机。

6. 目前新推出的单片机都不只5 个中断源,比如SST89E58RD 就有9 个中断源。五个中断源的中断控制系统。

7. 为了提高其指令的执行速度,最高允许振荡频率为12MHz。最高允许振荡频率达40MHz,

图3-2 STC89C52单片机管脚图

STC89C52单片机部分引脚说明

1.时钟电路引脚XTAL1 和XTAL2:

XTAL2(18 脚):接外部晶体和微调电容的一端;该引脚输入外部时钟脉冲才能采用外部时钟电路。

可用示波器查看XTAL2 端是否有脉冲信号输出才能检查振荡电路是否正常工作。

XTAL1(19 脚):接外部晶体和微调电容的另一端;在片内它是振荡电路反相放大器的输入端。在采用外部时钟时,该引脚必须接地。

2.控制信号引脚RST,ALE,PSEN 和EA:

RST/VPD(9 脚):RST 是复位信号,输入端高电平作为有效。RST 引脚的第二功能是VPD,就可以接入RST 端,可以为RAM 提供备用电源,为了不让存储在RAM 中的信息丢失和删除,然而合复位后方可继续正常运行。

14

ALE/PROG(30 脚):地址锁存允许信号端。当8051 上电正常工作后,ALE 引脚就不断地向外输出正脉冲信号。

PSEN(29 脚):程序存储允许输出信号端。

EA/Vpp(31 脚):当EA 引脚处于高电平时候,CPU访问片内EPROM/ROM且执行其内部程序存储器中的指令代码。

P0口(P0.0~P0.7,39~32 脚):P0口是一个 位准双向I/O口。

P1口(P1.0~P1.7,1~8 脚):P1口是一个带内部上拉电阻的,8 位准双向I/O口。

P2口(P2.0~P2.7,21~28 脚):P2口是一个带内部上拉电阻的8 位准双向I/O口。

P3口(P3.0~P3.7,10~17 脚):P3口是一个带内部上拉电阻的8 位准双向I/O口。P3口每个引脚都有第二功能,如下:

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#)外部数据存储器读选通。

4 系统单元电路模块设计

4.1主控制模块

主控制最小系统电路如图15所示。单片机最小系统由复位电路、单片机、时钟电路构成。

单片机的工作电压范围:给单片机外界5V直流电源,其范围在4V-5.5V,单片机中连接方式通常是20脚VSS接电源地端,而40脚VCC接正极5V。确定单片机的工作起始状态就是复位电路,从而顺利完成单片机的启动过程。完成单片机启动确定单片机起始工作状态就是单片机接通电源时产生复位信号。

15

4.2显示模块电路

4.3关于报警模块的设计

声光报警停止工作。具体电路图如图17所示:

图15 单片主控制电路

D0~D7分别接单片机的的P1口。具体电路图如图16所示:

图16 显示模块电路

出低电平时,三极管的VE>VB>VC>0。三极管的集电结反偏,发射结正偏,此时发

液晶的命令操作脚是RS、RW、EN接在单片机的P3^5、P3^6、P3^7脚,数据脚

本设计中声光报警电路采用NPN型S8550三极管驱动,当单片机的P1^3口输

光二极管和蜂鸣器发出声光报警,当单片机的P1^3口输出高电平时,三极管截止,

16

图17 报警模块电路图

4.4按键模块的设计

可以通过按键进行设置空气质量检测系统的灰尘参数。其中一个参数加键,另一个则是参数减键。通过这两个按键(参数加键、参数减键)进行设置。具体电路图如图18所示:

图18 按键模块电路图

4.5粉尘模块电路设计

灰尘传感器是作为经常用的空气净化器系统,能偶检测非常细小的颗粒,比如香烟的烟雾,是非常有效果的。传感器的第一脚接了一个220uF的电解电容和150欧姆的电阻。第二脚接到单片机的P32外部中断0口,第五脚是粉尘浓度的模拟量输出脚,接在模数转换器ADC0832的通道1上。具体电路图如图19所示:

17

图19粉尘模块电路

4.6电源部分的设计

采用3节1.5 V干电池共4.5V做温湿度测量控制系统的电源,经过实验验证系统工作时,能够满足系统的要求就是单片机、传感器的工作电压稳定,而且电池更换方便。电源接口电路如图20,其中DC5V为电池接口,SW1为电源开关,R6为二极管的限流电阻,POWER为电源指示灯,C5和C6为电源的滤波电容。

图20 电源接口电路

18

5 系统测试与实现

5.1系统程序流图

主程序的主要功能是对定时器,LCD1602,ADC0832,GP2Y1010AU0F,I/O口资源等所用到的资源进行初始化、对传感器及ADC0832、对按键动作的处理的实时电压值进行换算处理并显示。主程序流程见图21所示。

图21 主程序流程图

对ADC0832以及粉尘传感器数据处理程序

该部分子程序主要过程:GP2Y1010AU0F通过对当前环境中的粉尘浓度检测会有相应的电压值变化(模拟信号),从而通过ADC0832的转化可以得到相关的数字信号,对已得到的数字电压值以及GP2Y1010AU0F检出方法,通过数值计算可以得到当前环境粉尘浓度,误差比较小。其程序流程图如图22所示:

19

开始对粉尘传感器和ADC初始化单片机对ADC转化后的数字信号进行换算粉尘传感器将浓度转化成模拟电压值送至ADC得到最终值并送至LCD显示

结束

图22 传感器数值处理程序流程图

5.2 仿真电路

为了测试软件,我们一般软件开发要进行仿真电路,这样有方便又能够检测电路是否能够达到的效果,避免在硬件上的错误,该仿真电路就是通过所有用的单元电路设计组合到一起,再通过仿真软件ISIS来进行仿真,看能否软件上能达到效果,一个毕业设计首先是要软件上没有错误,才能在硬件上面跑,这样做出来的产品就不会有什么错误,在仿真软件找到自己要的元器件,根据电路图在进行仿真从而达到检测的效果,我的仿真电路如图23所示:

20

图23 仿真软件

5.3 软件跟硬件结合

软件是一个产品的控制指挥系统,这个是非常重要的,你要做的什么动作都要通过软件设计从而能够达到你想要的效果,通过运动C语言在Keil4软件开发坏境中,设计出了检测PM2.5检测系统并且编译没有错误,再通过仿真软件也能实现同样的功能,软件已经做好,接下来就要跟硬件结合到一起。通过单片机把程序烧录到单片机的芯片,再把芯片安装到硬件上面,该硬件是自己动手焊接的,如图24 焊接图所示,并且能产生正确的效果,如图25 实物效果图所示:

21

如图24 焊接图

如图25 实物效果图

22

5.4 测试结果分析

根据实物测试结果分析,如图 实物效果图所示,该图就是测试室内环境的PM值,现在是38ug/m3,测试的结果是best,没有超过刚开始设置范围200ug/m3,所以现在空气的质量是健康无害的,该结果是通过ADC0832硬件测试的结果再通过模数转换再通过软件分析从而能够在液晶显示屏上看到我们测试的数据结果,该结果准确无误。

5.5 系统实现

系统最后实现的功能就是基于51单片机的PM2.5检测系统的设计与实现,系统通过软件和硬件最后能实现检测,该系统主要由粉尘传感器,按键,电源,STC89C52,LED显示灯,蜂鸣器报警等组成,软件是通过单片机烧录到STC89C52中,最后通过组装,反复验证,最后能够达到总个系统的实现与功能的实现。

23

6、总结

空气质量检测仪系统控制核心采用了单片机STC89C52,最大限度的将其具备的资源应用到设计中,不仅体现了单片机最小系统的应用过程中的灵活性,同样也实现功能多样的智能化。采用了单片机对空气质量的检测尘埃、香烟、油烟等,可以检测出空气中的灰尘的程度,在液晶上进行显示具有非常重要的市场应用价值。

虽然存在着系统功能单一等缺点,相信在以后的实践中能一步一步完善。 自己在图书馆和上网查资料到写出具体的实施方案、画出电路图都要认真考虑,最后做出了自己想做出来的产品,并且能够实现理想的功能,从而顺利的完成毕业设计。

24

致 谢

首先感谢学校给我提了良好的学习环境和实践环境,在即将毕业之际,心中不舍之情难以言表,同时我相信在学校学习和生活的四年光阴是我一生中最难忘的经历!

在此论文撰写过程中,感谢金桂老师在我做毕业设计过程中所给予的帮助。让我深切体会到探求知识的过程虽然困难重重,但同时也是充实快乐的。同时,在此次设计过程中,在我们院实验创新基地有丰富实践经验的同学给予了极大的指导和帮助,有许多技术上的难题都是通过请教他们或者书本从而得以解决,在此非常感谢他们。在这四年的大学生活中,老师教会我们很多,也得到了老师的肯定,谢谢老师们,你们辛苦啦。

25

参考文献

[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] 郭天祥.51单片机C语言教程[M].北京:电子工业出版社,2009.36-92 [10] 王新贤.通用集成电路速查手册第二版.[M] 山东科学技术出版社,22-57

26

附录1:系统整体电路原理图

27

附录2:系统设计部分源程序

#include\ //添加LCD1602头文件 #include\添加ADC0832头文件 //#include\

sbit BUZZER = P1^3; //蜂鸣器驱动端口==P1^2

sbit Reduc = P1^7; //按键键输入端口==P1^7 sbit Add = P3^0; //按键加输入端口==P3^1

sbit vled = P3^2;

void Delay1us(uint t) //@12MHz {

while(t--)_nop_(); }

uint read_data(uchar N) {

uint val=0; vled=0;

Delay1us(20); val=adc0832(N); vled=1;

Delay1us(400); return val; }

/************************************************ ** 函数名称 : void main(void) ** 函数功能 : 主函数 ** 输 入 : 无 ** 输 出 : 无 ** 说 明 :

************************************************/ void main(void) {

double PM,pm1,pm2;

int PMVAL=0,HPM=200,PM_count=0,pm1_count=0;

28

uchar bueezr_flag=0,bueezr_count=0,buzzer_time=25;//蜂鸣器报警变量 LCD_Init();

WriteChar(1,0,16,\ WriteChar(2,0,16,\while(1) { Delay(120); pm1+=read_data(1); if(++PM_count>=40) { PM_count=0; pm1=pm1/40; pm2+=pm1; if(++pm1_count>=3) { PM=pm2/3; PM=PM*50/255; PM-=4; PM/=5; PM*=1000; PMVAL=PM; PMVAL+=235; if(PMVAL>=9999)PMVAL=9999; if(PMVAL<=0)PMVAL=0; WriteCOMDATA(0x83,0); WriteCOMDATA(PMVAL/1000+0x30,1); WriteCOMDATA(PMVAL/100+0x30,1); WriteCOMDATA(PMVAL/10+0x30,1); WriteCOMDATA(PMVAL+0x30,1); PM=pm1=pm2=0; } } //PM值与报警值比较 if(PMVAL>HPM) { bueezr_flag=1; } else { bueezr_flag=0;

29

BUZZER=1; } if(PMVAL>=100) WriteChar(1,12,4,\ else if((PMVAL<100)&&(PMVAL>=50)) WriteChar(1,12,4,\ else if(PMVAL<50) WriteChar(1,12,4,\ /*******蜂鸣器报警********/

bueezr_count++;if(bueezr_count>buzzer_time*10)bueezr_count=buzzer_time+1; if(bueezr_count%buzzer_time==0 && bueezr_flag) { BUZZER=~BUZZER;//蜂鸣器取反 发出声音提示 } if(!Reduc) { Delay(100); HPM--; WriteCOMDATA(0xC7,0); WriteCOMDATA(HPM/1000+0x30,1); WriteCOMDATA(HPM/100+0x30,1); WriteCOMDATA(HPM/10+0x30,1); WriteCOMDATA(HPM+0x30,1); } if(!Add) { Delay(100); HPM++; WriteCOMDATA(0xC7,0); WriteCOMDATA(HPM/1000+0x30,1); WriteCOMDATA(HPM/100+0x30,1); WriteCOMDATA(HPM/10+0x30,1); WriteCOMDATA(HPM+0x30,1); } } }

/************************************************ * 编写时间: 2016.05.09

30

* 作 者: liuweiliang

* 程序功能: LCD1602头文件

* 使用说明: 在需要使用LCD1602显示时添加此头文件“LCD1602.h” ************************************************/ #ifndef __LCD1602_H__ #define __LCD1602_H__ #include\ //添加延时函数头文件 #define LCD_PINDATA P0 //数据端口定义 P2 sbit RS = P1^4; //RS P0^7 sbit RW = P1^5; //RW P0^6 sbit E = P1^6; //E P0^5

/************************************************

** 函数名称 : WriteCOMDATA(uchar LCD_DATA,uchar N) ** 函数功能 : LCD1602写指令、数据函数 ** 输 入 : LCD_DATA:指令或者数据 N:指令方式还是数据方式 N=0时,LCD_DATA为指令,N=1时,LCD_DATA为数据 ** 输 出 : 无 ** 说 明 :

************************************************/ void WriteCOMDATA(uchar LCD_DATA,uchar N) {

Delay(1); E=1; RW=0; RS=N;

LCD_PINDATA=LCD_DATA; E=0; }

/************************************************ ** 函数名称 : void LCD_init(void) ** 函数功能 : LCD1602初始化操作 ** 输 入 : 无 ** 输 出 : 无 ** 说 明 :

************************************************/ void LCD_Init(void) {

WriteCOMDATA(0x01,0); Delay(500);

31

WriteCOMDATA(0x38,0); Delay(10);

WriteCOMDATA(0x06,0); Delay(10);

WriteCOMDATA(0x0c,0); Delay(10); }

/************************************************

** 函数名称 :void WriteChar(uchar Row,uchar Col,uchar Num,uchar *pBuffer) ** 函数功能 :在任意位置写指定个字符

** 输 入 :Row : 要写的字符所在的行,只能为1或2; Col : 要写的字符所在的列,只能为0---15 Num : 要写字符的个数

pbuffer : 要写字符的首地址 ** 输 出 :无 ** 说 明 :

************************************************/

void WriteChar(uchar Row,uchar Col,uchar Num,uchar *pBuffer) {

uchar i;

if(Row==1)Row=0x80+Col; else Row=0xC0+Col; WriteCOMDATA(Row,0); for(i=Num;i!=0;i--) { WriteCOMDATA(*pBuffer,1); pBuffer++; } }

#endif#include\ //添加延时函数头文件 #include sbit CS = P1^2; sbit Clk = P1^1; sbit DATI = P1^0; sbit DATO = P1^0;

/****************************************************************************

函数功能:AD转换子程序 入口参数:CH 出口参数:dat

32

****************************************************************************/

unsigned char adc0832(unsigned char CH) {

unsigned char dat = 0x00; //AD值 unsigned char i,test,adval; adval = 0x00; test = 0x00;

Clk = 0; //初始化 DATI = 1; _nop_(); CS = 0; _nop_(); Clk = 1; _nop_();

if ( CH == 0x00 ) //通道选择 {

Clk = 0;

DATI = 1; //通道0的第一位 _nop_(); Clk = 1; _nop_(); Clk = 0;

DATI = 0; //通道0的第二位 _nop_(); Clk = 1; _nop_(); } else {

Clk = 0;

DATI = 1; //通道1的第一位 _nop_(); Clk = 1; _nop_(); Clk = 0;

DATI = 1; //通道1的第二位 _nop_(); Clk = 1; _nop_();

33

}

Clk = 0; DATI = 1;

for( i = 0;i < 8;i++ ) //读取前8位的值 {

_nop_();

adval <<= 1; Clk = 1; _nop_(); Clk = 0; if (DATO) adval |= 0x01; else

adval |= 0x00; }

for (i = 0; i < 8; i++) //读取后8位的值 {

test >>= 1; if (DATO)

test |= 0x80; else

test |= 0x00; _nop_(); Clk = 1; _nop_(); Clk = 0; }

if (adval == test) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉 dat = test; _nop_();

CS = 1; //释放ADC0832 DATO = 1; Clk = 1; return dat; }

#include\ sbit v_led = P3^2;

34

uint count_100us;

/************************************************ ** 函数名称 : Init_Timer0(void)

** 函数功能 : 定时器0初始化子程序 ** 输 入 : 无 ** 输 出 : 无

** 说 明 : 对定时器0进行初始化 模式1 16位定时器 0~65536 ************************************************/ void Init_Timer0(void) //定时器初始化子程序 {

TMOD |= 0x01; //使用模式1,16位定时器,使用\符号可以在使用多个定时器时不受影响

TH0=0xFF; //定时器赋初值 TL0=0xA4;

ET0=1; //使能定时器中断 TR0=1; //打开定时器 EA=1; //打开总中断 }

/************************************************ ** 函数名称 : Timer0_isr(void) interrupt 1 using 1 ** 函数功能 : 定时器中断程序 ** 输 入 : 无 ** 输 出 : 无

** 说 明 : 定时器计数到65536溢出执行中断函数 定时器重新赋值及状态指示灯取反 ************************************************/ //void Timer0_isr(void) interrupt 1 using 1 //{

// TH0=0xFF; //重新赋值 // TL0=0xA4; // count_100us++;

// if(count_100us<30)TEST=0; // else if(count_100us<90)TEST=1; // else count_100us=0;

// //TEST=~TEST; //状态指示灯取反 //}

/************************************************ * 文件功能: 延时函数头文件 * 使用说明: 在需要使用延时函数时添加此头文件“delay.h” ************************************************/

35

#ifndef __DELAY_H__ #define __DELAY_H__ #include //#include

#define uchar unsigned char #define uint unsigned int

/************************************************ ** 函数名称 : Delay(uint T) ** 函数功能 : 延时函数

** 输 入 : T--延时倍数 大小--0~65535 ** 输 出 : 无 ** 说 明 :

************************************************/ void Delay(uint T) {

uchar i;

for(T;T>0;T--)

for(i=200;i>0;i--); }

#endif

36