基于51单片机PM2.5空气检测仪的设计与制作

前言

随着社会的进步,工业化水平的提高,人们的生活和工作有了很多便利。然而人们在享有方便生活和工作的同时,不得不面对由于对自然的不合理开发,对自然环境造成的野蛮污染,使生存环境越来越差的现实。所以人类必须采取相应措施,合理利用开发自然资源,与大自然和睦相处。进入21 世纪以来,环境问题越来越严重,而这与人们对生活质量要求的提高形成了矛盾,因此注重环境的保护问题已经慢慢步入了产业化。人类要治理好环境问题,必须要做到“知己知彼”,在做好监控与检测的同时知道病灶所在然后对症下药,从而药到病除。

粉尘是空气质量的重要指标,所以粉尘的检测就很重要,因此粉尘检测仪成为环保监测部门及很多工矿企业的必备品。因此市面上出现了各种各形形色色的测试仪。

粉尘检测仪主要用于检测环境中的粉尘浓度,适用于工矿企业劳动部门生产现场粉尘浓度的测定、环境环保监测部门大气飘尘检测和污染源调查等。

本文所设计的粉尘检测仪围绕单片机为控制核心,完成数据的采集、显示、参数设置、自动报警及智能换风等系统各模块的程序设计,结合各模块的硬件电路实现每个模块的功能,从而实现整个系统的功能。

1.2 选题背景

粉尘又称可吸入颗粒物(inhalable particular matter),它是指能进入呼吸道的,直径为10μm的颗粒物,对人的眼睛、鼻腔、上呼吸道都十分有害。同时这种可吸入粉尘能长驱进入肺泡且沉积时间长,可导致心肺病、心血管疾病。粉尘作为病菌的载体,一同散入空气中,极易传播疾病。生产中许多及其工作环境对粉尘浓度也有要求,工厂中的很多粉尘携带有有毒化学物质,人们长久呼吸或长久散落皮肤上容易导致癌症的产生。由此可以看出粉尘对人类健康和生产的巨大危害性,煤矿井下巷道作业、煤炭生产都要产生大量的粉尘,加之煤矿井下通风条件较差,在炮采、纵采工作面,煤尘浓度可高达1000mg/ m3以上。在此环境中工作的工人就会吸入这些细微粉尘,粉尘长时间进入人的呼吸系统,就会造成大量粉尘在肺泡中沉,引起慢性职业病,危及人的身体健康。此外粉尘还是煤矿安全生产的重大隐患, 我国《煤矿安全规程》规定:“粉尘中游离的sio2含量>10% 时,粉尘浓度不得大于2mg/ m3;当粉尘中游离sio2含量<10% 时, 粉尘浓度不得大于10mg/ m3。因此, 必须对煤矿井下粉尘进行实时检测,及时了解煤

矿井下工人的劳动环境,掌握井下煤尘浓度及变化情况,为安全生产、防尘、降尘等措施提供必要现场数据。

因此,粉尘浓度测试仪意义很重大是生活中不可或缺的必备品。

1.3 国内外发展状态

在国内大多采用更加先进的测试技术,有的是β射线原理,其吸收量只与吸收物质的重量有关,而与吸收物质的物化性质无关完全等同于称重法,可直接读粉尘浓度。并且配不同的采样入口装置,可实现对总粉尘、可吸入粉尘、呼吸性粉尘进行监测。使用称重法比较,其相关系数大于97%,相对偏差小于10%。仪器采用的射线源符合核安全标准,可长期稳定工作。

而有更加先进的技术该测定仪是集粉尘采样、粉尘浓度测定和粉尘粒度分布测定三者于一体的多功能粉尘测定仪。它作为粉尘采样器可采集作业场所空气中的粉尘,将采集到的滤膜样作一些处理,在此仪器上可直接测出粉尘浓度值,粒度分布需用天平称重,可测定采样器采集的滤膜粉尘和其它形式粉尘的粒度分布(分散度)。粒度分布和浓度测定结果可通过液晶显示器显示或微型打印机打印。该仪器具有断电保护功能,断电后仍可储存40 组粉尘粒度分布和200 组粉尘浓度数据。

袖珍式激光粉尘仪是以激光管为光源、采用前向光散射原理设计,具有国际先进水平的最新型粉尘仪。该仪器适用于公共场所可吸入颗粒物(PM10)浓度的快速测定以及环境保护、劳动卫生等方面粉尘浓度检测、工矿企业生产现场粉尘浓度的监测。

1.3.1 粉尘测量方法

    按照粉尘测量方法的不同,粉尘测量方法主要有光学法、采样称重法和静电法三种。

(1) 采样称重法不适合于在线测量。

(2) 静电法易受干扰,国内技术并不成熟。

(3) 光学法又进一步分为浊度法和散射法, 而浊度法是目前国外普遍采用的用来测量烟尘( 粉尘) 浓度的方法, 这种国外仪器在国内许多单位也都得到了成功应用。光学法测量的缺点是需要保持光学镜头的相对清洁。对于烟道中烟尘的测量,实践证明, 通过微正压的清洁保护风, 就可实现对光学镜头的可靠保护。

1.3.2 粉尘检测仪的性能与优点

由现代国内外所使用的各种粉尘检测仪的功能可以大体总结出粉尘检测仪具有以下性能和优点。

(1) 智能采样与去噪数字滤波算法相结合,测量和信号处理灵活性强,因而在一套装置可以进行不同变量和浓度的测量,可排除个别的不正常值,同步计算平均值。

(2) 采用嵌入式单片机内核技术,将计算机嵌入到烟尘粉尘测量对象中, 实现智能化控制,依据烟尘粉尘测量环境要求, 充分考虑了物理环境( 小型) 、电气/ 气氛、环境(可靠)、成本(价廉)的要求; 充分考虑了最小软、硬件配置和相应的接口电路。采用内核技术,提供了一个裸设备与应用程序间的抽象层,可以在更高的层次上读写磁盘;允许多个程序看起来在同时运行, 将处理器在其间共享。

(3) 可选用GPRS 网络技术,以智能烟尘粉尘测量仪软件为平台,通过中文短信的方式,用自动群呼和列队接收办法,形成了崭新的环保监测网络。

(4) 可远程进行参数设置及数据传输, 通过中心控制软件, 方便地输入用户参数、校准仪器, 并可输出存储的测量数据。

1.3.3 研究的意义

该粉尘检测仪是以STC12C5A60S2为核心外接输入键盘设定参考值,经过GP2Y1010AUOF粉尘传感器采集转换数据经过STC12C5A60S2处理然后通过数码管显示出粉尘浓度的简易检测仪,主要用于检测环境中的粉尘浓度,适用于工矿企业劳动部门生产现场粉尘浓度的测定、卫生防疫站公共场所可吸入颗粒物的监测,环境环保监测部门大气飘尘检测和污染源调查等。

1.4 本文主要工作

本文主要是根据光学测尘原理--朗伯特-比尔定律测量光透过被测物质后,由于散射吸收而使光强减弱,通过测定光束通过被测介质前后的光强比之来定量粉尘浓度。将粉尘浓度转换为电信号,然后通过信号放大器将电信号转换为0~5V的电压信号。

该设计主要是将光学测尘原理所得的0~5V的电压模拟信号通过ADC0809转换成八位二进制数字信号,并将数字信号送到单片机STC12C5A60S2中经过处理后将数字信号动态显示在数LED1602液晶显示上,通过键盘来设定粉尘浓度限定值,如果超过限定值单片机驱动蜂鸣器报警以及启动换风机,同时可以通过独立按键控制当前粉尘浓度和设定限定值时的显示切换。看门狗可以根据程序要求实施复位;同时还要将12V开关电源转换成5V给各器件供电。我主要根据系统要求完成数据的采集、显示、参数设置及报警等系统各模块的程序设计,然后再结合各部分的硬件电路完成各模块的功能,从而完成整个系统的功能。

  • PM2.5  粉尘浓度测试仪系统设计方案

   2.1 系统的功能和技术指标

  1. 系统功能:

    单片机PM2.5粉尘检测仪采用51单片机+按键+LCD1602+蜂鸣器+换风机+粉尘传感器设计而成。

1.主控芯片采用增强型51单片机STC12C5A60S2(和51单片机一样),自带AD转换,使用更加方便。

2.使用夏普的GP2Y1010AUOF粉尘传感器,每间隔10S更换一次采集浓度值检测更加准确。

3.有2个按键可以调整报警值,可操作性增强。

4.外接AT24C02,有掉电保存数据功能。

5.当粉尘浓度小于设定值,绿色指示灯会亮,表示当前空气质量良好。

6.当粉尘浓度高于设定值,会自动开启声光报警,换风机人性化工作。

7.LCD1602实时显示粉尘浓度和设定报警浓度,清晰直观。

(2) 主要技术指标:

1、电源电压:5-7V

2、工作温度:-10-65摄氏度

3、消耗电流:20mA最大

4、最小粒子检出值:0.8微米

5、灵敏度:0.5V/(0.1mg/m3)

6、清洁空气中电压:0.9V  典型值

7、工作温度:-10~65℃

8、存储温度:-20~80℃

2.2 工作原理

 2.2.1 粉尘检测原理

测尘原理是用粉尘采样器或呼吸性粉尘采样器抽取采集一定体积的含尘空气,含尘空气通过滤膜时,粉尘被捕集在滤膜上,再利用光学原理测得粒径。

光学测粉尘用到两个原理,朗伯特-比尔(Lambert-Beer)定律和米(Mie)理论。本设计检测原理用基于光学检测法中的浊度法。基于朗伯特-比尔定律测量光透过被测物质后,由于散射吸收而使光强减弱,通过测定光束通过被测介质前后的光强比之来定量粉尘浓度。其原理如下:

一束强度为I0的单色平行光照射在含有粉尘的检测区,由于粉尘对光的吸收和散射,出射光强便会衰减。根据朗伯特-比尔定律,对均匀分布的粉尘,入射光强与出射光强有关:              

式中:Q为消光系数,它与入射光波长λ、粉尘粒子直径d、粉尘物质折射率m有关,可按Mie理论和专用算法程序计算。N为粉尘密度,A是直径为d的粉尘粒子的截面积,W为粉尘的质量浓度;ρ为粉尘的质量密度。若设某种分布的粉尘尘粒直径为d1浓度为w1,则:式中:

,对于某种粉尘的测量系统而言,C是一常数;M为测量时粉尘粒子按粒径的分档数。由公式1-2得:

式(1-3)是在单色入射光情况下得到的。采用多波长入射时,对每一波长λi,都有对应的一个式(1-3),故得方程:式中:

为消光列向量,可以通过实测各波长对应的及

其中:T称为消光系数矩阵。T中个元素

可由计算机预先算出。

为粉尘总的质量浓度分布列向量。求解式1-4便可求得W及粉尘的总质量浓度。不难看出,多波长消光测尘中,是通过测得各种粒径粉尘的质量浓度得到总的粉尘浓度的,因而能实时地反应粉尘分布的影响,为粉尘浓度的高精度测量提供了可能。再者,测量粉尘浓度的同时,还能测粉尘的粒度分布(分散度)。

根据粉尘离子的散射特性,确定最小粒径前置输出端的信号幅值U,然后每个0.1μm定义直径档,并预先设定好各档甄别电平,用其中一种标准粒子输入粉尘测试仪。

2.2.2 系统工作原理

本系统的工作原理是:将电源开关打开,当给一个由测尘原理将粉尘浓度转换得来的0~5V的电压信号时,信号经过ADC0809转换为八位的二进制数进入单片机,经过处理后转变为三位十进制数通过I/O口在LED1602液晶显示上显示出精确数值。数值量随输入电压的扰动而变化。同时键盘设定参考值送入单片机,当采集的当前粉尘浓度小于参考值时黄灯亮,表示当前空气良好;当采集的当前粉尘浓度大于参考值时,单片机驱蜂鸣器报警并同时启动换风机进行改善空气环境,否则显示当前浓度。

2.3程序框图和流程图

    因为软件和硬件是密不可分的,所以由系统的硬件结构图可以得出软件设计的程序框图和流程图。

2.3.1 程序框图设计

根据系统结构图所得出的各模块如图2-1所示。

如图 2-1所示系统所设计的程序分为以下五个部分。

(1) 信号采集的程序:该程序设计主要是将模数转换得来的数字信号输入到单片机内部。

(2) LED 的显示程序:本程序设计主要完成粉尘浓度的数字显示及当前环境情况提醒。

(3) 看门狗的复位程序:该程序设计主要完成程序飞跑或死机时系统的复位。

(4) 键盘输入部分:该部分主要完成浓度参考值的设定和显示切换。

(5) 换风机、声光报警部分:该部分主要完成浓度大于参考值的报警及相应措施。

2.3.2 粉尘检测仪程序主流程图设计

根据硬件系统结构图所设计的程序主流程图如下图2-2所示。

  PM2.5粉尘测试仪系统硬件设计

3.1单片机部分

3.1.1 系统CPU 器件选择

CPU是粉尘检测器的核心,完成数据采集、处理、输出、显示等功能,是整个仪器正常工作的基础,它的选择直接关系到整个系统的工作。选择高速/低功耗/超强抗干扰的新一代8051单片机-STC12C5A60S2,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,适用于强干扰场合。

STC12C5A60S2单片机系统电路如图3-1所示:

单片机最小系统复位、晶振电路简介

(1)复位电路的设计

复位电路是使单片机的CPU或系统中的其他部件处于某一确定的初始状态,并从这上状态开始工作。

 单片机常见的复位电路

通常单片机复位电路有两种:上电复位电路,按键复位电路。上电复位电路:上电复位是单片机上电时复位操作,保证单片机上电后立即进入规定的复位状态。它利用的是电容充电的原理来实现的。按键复位电路:它不仅具有上电复位电路的功能,同时它的操作比上电复位电路的操作要简单的多。如果要实现复位的话,只要按下RESET键即可。它主要是利用电阻的分压来实现的在此设计中,采用的上电自动复位电路。按键复位电路如图3-2所示。

3-2按键复位电路

 复位电路工作原理

上电复位要求接通电源后,单片机自动实现复位操作。上电瞬间RESET引脚获得高电平,随着电容的充电,RERST引脚的高电平将逐渐下降。RERST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。上电与按键均有效的复位电路不仅在上电时可以自动复位,而且在单片机运行期间,利用按键也可以完成复位操作

(2)晶振电路的设计

晶振电路用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行中各信号之间的相互关系。单片机本身就如一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地工作。

通常在引脚XTALlXTAL2跨接石英晶体和两个补偿电容构成自激振荡器,如图4. 4Y1C1、C2。可以根据情况选择6MHz12MHz24MHz等频率的石英晶体,补偿电容通常选择30pF左右的瓷片电容。晶振电路如图3-3所示。

晶振电路如图3-3所示。

3.2 信号采集电路

GP2Y1010AUOF粉尘传感器的结构特征如下3-5图所示。

P2Y1010AUOF粉尘传感器是用光学方法测量悬浮于气相介质或者液相介质中的微小微粒特性的传感器装置,具有光测技术非接触式测量、不扰动被测对象等特点GP2Y1010AUOF粉尘传感器可以感知烟草产生的烟气和花粉,房屋粉尘等1微米以上的微小粒子.体积小,重量轻,便于安装.5V的输入电路,便于信号处理.内藏气流发生器,可以自行吸引外部大气.灰尘传感器保养简单,可以长期保持传感器的特性.

3.3  LED1602液晶显示设计电路

LCD1602A 是一种工业字符型液晶,能够同时显示16x02 即32个字符。(16列2行)。在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比较常用,软硬件都比较简单。

在单片机系统中应用液晶显示器作为输出器件有以下几个优点:

由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。

液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。

液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。

相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。

液晶显示的原理是利用液晶的物理特性, 通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。

3.4 声光报警提示电路LED灯电路

3.4.2LED灯显示电路如图3-9所示。

当电路通电时,DI灯会亮,发出绿光,代表粉尘传感器正在工作。

当测量值少于报警值是D2灯会亮,发出黄光,代表当前空气质量良好。

 LED的特点非常明显,寿命长、光效高、辐射低与功耗低。作为目前全球最受瞩目的新一代光源,LED因其高亮度、低热量、长寿命、无毒、可回收再利用等优点,被称为是21世纪最有发展前景的绿色照明光源。本设计利用不同颜色的LED指示不同的测量信号。

3.4.2蜂鸣器驱动电路:

一般都包含以下几个部分:一个三极管、一个蜂鸣器、一个限流电阻。

蜂鸣器为发声元件,在其两端施加直流电压(有源蜂鸣器)或者方波(无源蜂鸣器)就可以发声,其主要参数是外形尺寸、发声方向、工作电压、工作频率、工作电流、驱动方式(直流/方波)等。这些都可以根据需要来选择。本设计采用有源蜂鸣器。三极管Q1起开关作用,其基极的低电平使三极管饱和导通,使蜂鸣器发声;而基极高电平则使三极管关闭,蜂鸣器停止发声。

3.5换风系统电路

主要原理是:用风机将空气抽入机器,通过内置的滤网过滤空气,主要能够起到过滤粉尘、异味、有毒气体和杀灭部分细菌的作用。

3.6键电路

本设计采用按键接低的方式来读取按键,单片机初始时,因为为高电平,当按键按下的时候,会给单片机一个低电平,单片机对信号进行处理

单片机键盘有独立键盘和矩阵式键盘两种:独立键盘每一个I/O 口上只接一个按键,按键的另一端接电源或接地,这种接法程序比较简单且系统更加稳定;而矩阵式键盘式接法程序比较复杂,但是占用的I/O少。根据本设计的需要这里选用了独立式键盘接法。

3.6.1按键硬件电路如3-10所示:

四   PM2.5粉尘测试仪系统软件设计

 4.1系统程序流程如4-1图所示。

4.2 浓度参考值的键盘设定程序设计

因为不同环境中粉尘浓度不同,粉尘流动量也不一样,人在不同环境中工作所承受的最大粉尘量也不一样,所以在更换环境时要设置不同的粉尘浓度参考值(该环境中能接受粉尘浓度最大值),当浓度超过所设定值时,粉尘检测仪报警,我们根据报警就可以采取相应措施或使人员撤离工作现场或动力降低粉尘浓度。 本模块利用独立按键方式通过三个独立按键累加输入参考值,通过单片机比较采集的数据与参考值来控制蜂鸣器是否报警。同时可以通过独立按键来进行参考值和当前浓度值的显示切换。

4.2.1 键盘扫描的设计

在单片机应用系统中,扫描键盘只是CPU的工作任务之一。在实际应用中要想做到既能及时响应键操作,又不过多的占用CPU的工作时间,就要根据应用系统中的CPU的忙闲情况,选择好键盘的工作方式,本次设计主要是设计的小型系统CPU工作比较空闲,所以用编程扫描方式。

  1. 键盘扫描程序的功能

   (a) 判别键盘上有无键按下。其方法为扫描键盘接入口,若全为“1”,则键盘无键按下,若不全为“1”,则有键按下。

   (b) 去除键的抖动影响。其方法为判断到有键按下后,软件延时一段时间(一般为10ms左右)后,再判断键盘状态,如果仍为按下状态,则认为有一个确定的键按下,否则按键抖动处理。当键盘释放时,判断到有键释放也软件延时一段时间,如果仍为键释放状态,则认为键确实释放了。

   (c) 求按键位置,对各键进行逐个扫描,最后却定按下的键号。

  1. 键盘扫描程序流程图如4-2图所示。

4.3 信号采集部分的程序设计

因为粉尘浓度是连续变化的模拟信号,通过粉尘采集器可以将环境中的粉尘浓度转换为模拟电信号,然后通过信号放大器将转换来的电信号放大成0~5V的电压信号。

4.3.1 数据采集流程图设计

粉尘数据采集模块流程图如图4-3所示。

4.4 蜂鸣器报警部分程序设计

该部分是当采集到的环境中的粉尘浓度大于参考值时,单片机就会驱动蜂鸣器报警,然后采取相应措施降低粉尘浓度或者使人员撤离工作现场。该蜂鸣器是通过P3^3口与单片机相连。

4.5  LED1602液晶显示部分的程序设计

   对于人机交互式单片机系统来说,不仅需要响应用户输入,同时也需要将一些测控信息输出显示。这些显示信息可以提供实时的数据或图形结果,以便于掌握系统的状态并进行分析处理。目前,在单片机中最常用的是LED1602液晶显示屏。其成本低廉、使用简便,可以显示数字或几个特定的字符。

4.5.1显示流程图设计

LED1602液晶显示流程图如下图4-5所示。

  PM2.5粉尘检测仪的测试结果及结论

5.1 调试

调试过程中首先要检测的就是硬件电路的设计原理是否正确、能否达到预期效果以及实现方法是否简便等等;其次在焊接好难有线电路之后,认真检查电路的焊接情况。这次采用的是分块调试的方法,PM2.5粉尘检测电路,控制电路以及单片机控制电路进行调试。在对每个模块的进行调试过程中又采用了由局部到整体,由简单到复杂的调试方法,最后再将各个模块总和成一个整体。

在调试过程中遇到的问题有:

  1. 由于在焊电路之前没有彻底调查过电阻的大小对PM2.5粉尘检测电路的影响,导致一直以为传感器不工作,显示屏是没有数据显示,后来换了合适的电阻,数据也检测出来了;
  2. 在解码程序的编写过程中,经过多次的程序修改与硬件调试,基本上能很好地实现自动报警,智能开启换风机,及时改善空气环境的功能。

解决:对电路进行测试,如对单片机的输出管脚信号进行测试,观察是否存在漏焊,虚焊,或者元件损坏的现象。若无此问题查看烧写的程序是否正确无误,对程序进行认真修改。当显示亮度不好时阻器的阻值,直到看到合适的亮度为止。

经过多次的反复调试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力。同时在软件的编程方面得到更到的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固。

如下为硬件实物图: 

  结论

经过一番努力后,粉尘测试仪设计的终于完成。在设计该粉尘测试仪的过程中,我首先按照粉尘检测仪的功能设计出其大致的电路电路方框图,然后分析各个功能模块:信号采集模块、信号转换模块、LED1602显示模块的。选好材后画出电路原理图,再到编写程序,最后进行仿真,这次课题设计可以说成功完成。说到编写程序是可花了不少功夫,因为该设计需要精确到小数位的个位,这个可给我带来了苦恼,在同学的帮助下最终解决了这个问题。实验结果表明此粉尘测试仪实现后具有读取方便、显示直观、电路简洁等优点,符合电子仪器仪表的发展趋势,具有良好的市场前景。

    在整个设计过程中,充分发挥了人的主观能动性,自主学习,学到了许多没学到的知识。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考查资料,和同学讨论,向老师请教,理清了思路,完成对程序的编写。通过设计提高了对单片机的认识,进一步熟悉和掌握单片机的结构及工作原理。通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术,提高软件设计、调试能力;通过这次设计熟悉以单片机核心的应用系统开发的全过程,掌握硬件电路设计的基本方法和技术,掌握相关电路参数的计算方法。最终较好的完成了设计,达到了预期的目的。

但是由于个人能力的原因,这个没能解决所显示的数字有些闪动的效果,以及焊接技能需要加强锻炼在功能方面是显得非常的简单,只实现了三个最基本的功能,还有许多不足和可以扩展的地方。例如实现粉尘检测系统智能化、人性化等,这些有待以后来弥补,还望各位老师予以指正和修改。

参 考 文 献

[1] 何立民.单片机应用技术选编[M].北京:北京航空航天大学出版社,1993:23-24

[2] 李卫东,李铁军,刘华,曹福德.HG-HC智能烟尘粉尘测量仪[J].仪器仪表学报,2004,

[3] 董爱华,余琼芳.煤矿井下粉尘信号光电检测电路的研究[J] .仪器仪表学报,2003,[5] 董晓红.同步粉尘测试仪的设计与实现[D].成都:四川大学.2004

[4] 梅丽凤,王艳秋,汪琉铎,任国臣.单片机原理及接口技术[M].北京:清华大学出版社,2009:310-321.

[5] 唐娟.粉尘浓度在线监测技术的现状及发展趋势[J].矿业安全与保护,2009:69-74.

[6] 吴泉英.数字式粉尘测试仪中的信号处理[J].苏州城建环保学院学报,1999:89-100

系统程序

主程序
//头文件
#include "STC12c5A.h"
#include "1602.h"
#include "2402.h"

#define uchar unsigned char
#define uint  unsigned int

//定义按键

sbit Key_Up_   = P3^4;
sbit Key_Down  = P3^5;
//定义风扇
sbit fs = P2^0;

//定义蜂鸣器LED报警

sbit DUST_Warn = P3^3;
sbit  LED1 = P2^3;
sbit  LED2 = P2^4;
//定义标识
uchar FlagStart = 0;  
sbit  LED = P3^2;

//全局变量定义,
const char ADC =   0x00;	    //P1^0
	           
uint Counter;
uint DUST_SET;	            //固体颗粒的阈值
float   DUST_Value; 

uchar ADC_Get[10]={0}; 	  //定义AD采样数组
uchar num=0;

//函数声明

void Data_Init();
void Timernit();
void ADC_Init();
0_Init();

void Port_I
uchar GetADVal(uchar);
void KeyProcess(void);

//数据初始化
void Data_Init()
{
   Counter = 0;
   FlagStart=0;
   DUST_Value=0;
   DUST_Warn=1;
   LED=0;
   fs=1;
}

//DS---185页  定时器初始化 定时10ms
void Timer0_Init()
{
	
	//AUXR=0x80; //Time work in 1T mode      
	TMOD = 1;      
	TL0 = (65536-30000)/256;     
	TH0 = (65536-30000)%256;    
	TR0 = 1;
	ET0 = 1;   
	EA = 1;     
}
//定时器0中断
void Timer0_ISR (void) interrupt 1 using 0
{
  uint i,j;	
	TL0 = (65536-30000)/256;     
	TH0 = (65536-30000)%256;   
    	LED=1;					 //开启传感器的LED
	
     for (j=0;j<222;j++);  //0.28ms  //延时0.28ms
	
	ADC_Get[num]=GetADVal(ADC);	  //开启ADC采集
	num++;
	if(num>9)
	{
	  FlagStart=1;
	  num=0;
	  TR0 = 0;   //先关闭定时器0
	  EA = 0; 
	}						   //采集10次,关闭定时器0,进行数据处理
//	for (j=0;j<25;j++);
  	LED=0;     //关闭传感器LED
}

//端口功能设置
void Port_Init()
{
   P1M0 = 0x03;  //DS--88页IO口功能设置,设为开漏11 
   P1M1 = 0x03;  //   
}

void ADC_Init()  //DS-282页
{
   
   P1ASF = 0x03;   //开启通道0,1 
   ADC_RES = 0;              
   ADC_CONTR=ADC_POWER|ADC_SPEEDLL; //每次转换需要420个时钟周期	         
   delay_ms(10);

}

//进行AD转换,得到当前8位AD值
uchar GetADVal(uchar CH)
{
   
   ADC_CONTR=ADC_POWER|ADC_SPEEDLL|CH|ADC_START;
   //delay_ms(1);        
   while(!(ADC_CONTR&ADC_FLAG)); //等待ADC转换结束
   ADC_CONTR &= ~ADC_FLAG;       //关闭ADC     
   return ADC_RES;
}

//中值滤波
//算法:先进行排序,然后将数组的中间值作为当前值返回。
uchar Error_Correct(uchar *str,uchar num) 
{
   unsigned char i=0;
   unsigned char j=0;
   uchar Temp=0;
   
   //排序
   for(i=0;i<num-1;i++)
     {
	  for(j=i+1;j<num;j++)
	   {
	     if(str[i]<str[j])
	   	{
		   Temp=str[i];
		   str[i]=str[j];
		   str[j]=Temp;
		
		}
	   
	   }
	}
    //去除误差,取中间值
    return str[num/2];

}
//存入设定值  将设定值存储在24C02中
void Save_Setting(void)
{
   uchar Save;
   Save =DUST_SET/256;
   IIC_Write(0x00, Save);
   Save =DUST_SET%256;
   delay_ms(10);
   IIC_Write(0x01, Save);	     
   
}

//载入设定值  从24C02中读取设定值
void Load_Setting()
{
   
   DUST_SET=0;
   DUST_SET = IIC_Read(0x00);
   DUST_SET*=256;
   delay_ms(10);
   DUST_SET+= IIC_Read(0x01);
   if ((DUST_SET>=760)||(DUST_SET<=0)) DUST_SET =100;
}

//按键处理程序
void KeyProcess(void)
{
   uchar Temp;
   uint i,j;
   Temp=P3;
   Temp&=0xf0;
   if(Temp!=0xf0)
    {	 
	 //延时
	 //for (i=0;i<500;i++)
      //for (j=0;j<254;j++);
	 Temp=P3;
      Temp&=0xf0;
    	 if(Temp!=0xf0)
	 {
	    switch(Temp)
	   {
	   case 0xE0:  DUST_SET++;   break;		  //	 设定值+
	   case 0XD0:  DUST_SET--;   break;		  //	 设定值-
	   default: break;
	
	   }
	   //值限定
	     
	    if (DUST_SET>=760)
	        DUST_SET =760;
	    if (DUST_SET<=1)
	        DUST_SET =0;
	   Save_Setting();

	 }	 
   }
}
void main()
{
   uchar read; 
   uint DUST;
   EA = 0;          //总中断关闭	     
   Data_Init();     //数据初始化
   Port_Init();     //端口初始化
   IIC_Init();

   LCD_Init(); 	//液晶初始化
   LCD_Clear();//清屏 
   LCD_Write_String(4,0,"Welcome");
   LCD_Write_String(0,1,"PM2.5  Detector");
   delay_ms(2000);
  
   LCD_Clear();//清屏
   delay_ms(10); 
   LCD_Write_String(0,0,"PM2.5:     mg/m3");
   LCD_Write_String(0,1,"Alarm:     mg/m3"); //载入设定值
   
   Load_Setting();
   ADC_Init();        //ADC初始化
   delay_ms(10);
   Timer0_Init();   //定时器0初始化
   num=0;	
   DUST=0;
   FlagStart=0;
   
   while(1)
   {
   	 if(FlagStart==1)       //10次采集完成
	 {
	  DUST=Error_Correct(ADC_Get,10);		//求取10次AD采样的值
	  DUST_Value=(DUST/256.0)*5000;		//转化成电压值MV
	  DUST_Value=DUST_Value*0.172-99.9; //DUST_Value=((DUST)*38)/4-202;//	//固体悬浮颗粒浓度计算 Y=0.172*X-0.0999      X--采样电压V
	  if(DUST_Value<0)	      DUST_Value=0;
	  if(DUST_Value>760)	 DUST_Value=760;	//限位
	  DUST=(uint)DUST_Value;					 //
	  
	  LCD_Show4(6,0,DUST);
	  LCD_Show4(6,1,DUST_SET);			     //显示结果

	  if(DUST>DUST_SET)
	  { 
	  	DUST_Warn=0;
		fs=0;
		LED1=1;
		LED2=0;  
		}      //超过阈值,报警
	  else
	 { DUST_Warn=1;
	 	fs=1;
	  	LED1=0;
	  	LED2=1;
		}

	  KeyProcess();
	  delay_ms(100);
	  TL0 = (65536-30000)/256;     
	  TH0 = (65536-30000)%256; 
	  TR0 = 1;   //开启定时器0
	  EA = 1;
	  FlagStart=0;
	 }	 	
 
   }   
}

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值