基于单片机的酒精浓度测试仪

更新时间:2024-06-09 14:55:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于单片机的酒精浓度测试仪

摘要

本设计实现了对不同浓度酒精的检测和显示,通过适当改进可以用于检测酒后驾车。本文用STC12C5A16AD单片机与MQ-3型气体传感器实现了对酒精浓度的测量,并对测量数据进行显示,同时利用二极管简单显示浓度的高低,在设计允许值时发出报警。

论文主要研究了(1)硬件方面,MQ-3气体传感器技术参数的检测和将它接入到酒精浓度检测模块中;将模拟电压信号放大驱动发光二极管点亮报警;将采集到的模拟电压信号通过单片机控制经A/D转换,得到数字电压信号;用于显示浓度的数码管显示模块。(2)软件方面,主要研究了电压到浓度的线性转换和最终浓度值的数码管显示。(3)对设计的传感器进行了标定。设计的传感器对酒精气体反应灵敏,能在有效范围内测量它的浓度值。并且在检测低浓度酒精时误差较小,最大误差为8.2%满足设计要求。

关键词:MQ-3气体传感器,A/D转换,STC12C5A16AD单片机

- 1 -

基于单片机的酒精浓度测试仪

目录

第一章 绪论 ................................................................................................................................- 3 - 第二章 总体设计 .........................................................................................................................- 4 -

2.1 设计任务 ......................................................................................................................- 4 - 2.2 设计要求......................................................................................................................- 4 - 第三章 硬件设计 .........................................................................................................................- 5 -

3.1 硬件设计原理分析 ......................................................................................................- 5 - 3.2 乙醇信号检测及调理电路 ..........................................................................................- 5 -

3.2.1 MQ-3主要技术指标 ........................................................................................- 6 - 3.2.2 MQ-3结构、外形、测试电路 ........................................................................- 6 - 3.2.3 MQ-3传感器调理电路 ....................................................................................- 8 - 3.3 单片机模块 ..................................................................................................................- 9 -

3.3.1 STC12C5A16AD的功能特性 ......................................................................... - 10 - 3.3.2 STC12C5A16AD的引脚说明 ......................................................................... - 11 - 3.3.3 单片机系统原理图 ........................................................................................ - 12 - 3.4、显示电路................................................................................................................... - 13 -

3.4.1 LCD1602显示模块技术参数 .......................................................................... - 13 - 3.4.2 LCD1602显示模块功能 .................................................................................. - 13 - 3.4.3 LCD1602显示器工作原理 .............................................................................. - 14 - 3.5 阈值存储................................................................................................................... - 15 - 3.6 供电及程序下载电路 ............................................................................................... - 16 - 第四章 软件设计 ....................................................................................................................- 17 - 第五章 Protel硬件开发软件 ................................................................................................ - 18 -

5.1 Protel软件组成 ....................................................................................................... - 18 - 5.2 PCB板设计 .............................................................................................................. - 19 - 第六章 总结与展望 ............................................................................................................... - 22 -

6.1 设计结果................................................................................................................... - 22 - 6.2 设计体会与展望 ......................................................................................................... - 22 - 参考文献 ................................................................................................................................... - 23 - 附录一 ....................................................................................................................................... - 24 - 附录二 ....................................................................................................................................... - 25 - 附录三 ........................................................................................................................................- 26 - 致谢 ............................................................................................................................................ - 37 -

- 2 -

基于单片机的酒精浓度测试仪

第一章 绪论

从工厂企业到居民家庭,酒精泄露的检测、监控以及对酒后驾车的监测对居民的人身和财产安全都是十分重要且必不可少的。同时,随着我国经济的高速发展,人民的生活水平迅速提高,越来越多的人有了自己的私家车,酒后驾车是导致交通事故的一个主要因素,资料显示,我国近几年发生的重大交通事故中,有将近三分之一是由酒后驾车引起的。由于人们安全意识增强,对环境安全性和生活舒适性要求的提高,为了防止机动车辆驾驶人员酒后驾车,现场实时对人体呼气中酒精含量的检测已日益受到重视,酒精浓度测试仪逐渐得到广泛应用。此外,酒精测试仪也可应用于食品加工、酿酒等需要监控空气中酒精浓度的场合。如今,气体传感器向低功耗、多功能、集成化方向的发展,因此,酒精浓度测试仪具有十分广阔的现实市场和潜在的市场要求。

本设计基于STC12C5A16AD单片机设计的酒精气体浓度探测仪,可用来检测酒精气体浓度,酒精气体浓度测试仪在生产生活中有重要的应用,比如,在一些环境要求严格的生产车间,用这种酒精浓度探测仪,可随时检测车间内的酒精气体浓度,当酒精气体浓度高于允许限定值时,发出警报,提醒人们及时通风换气,做到安全生产,此酒精测试仪经过再一步的改进可以使用到酒后驾驶测试上面去,利用该测试仪来告诫驾驶员请勿酒后驾驶。

在这次的设计中,利用了MQ-3型酒精的传感器通过对空气中的酒精浓度测试转换成0~5V的模拟量电压进行输出,把这个0~5V的电压传送到STC12C5A16AD内部自带的A/D转换模块中去,通过模拟量模块的转换输出一个8位0~255的数据给单片机的P1口,再通过单片机进行一些软件程序的处理显示在LCD的液晶上面。

- 3 -

基于单片机的酒精浓度测试仪

第二章 总体设计

2.1 设计任务

本研究设计的酒精浓度测试仪是一款实用性强、安全可靠的气体乙醇浓度检测工具,采用高精度MQ-3乙醇气体传感器对空气中的乙醇浓度进行检测,利用宏晶公司高性能低成本单片机STC12C5A16AD对检测信号进行A/D转换和处理,最后通过液晶屏显示输出。本研究设计的酒精浓度测试仪还具有醉酒阀值设定功能,可以根据法律法规或用户需要设定修改醉酒阀值,并进行保存,根据信号的传输可初步设计其系统设计方框图如图2-1。

传感模拟输出 单片控制输出

LCD显示输出

器 机 图2-1 系统设计方框图

2.2 设计要求

1) 传感器MQ-3的电压模拟输出范围为0~5V;

2) STC12C5A16AD芯片为52内核8位单片机,内部集成了10位多路A/D转换模块;

3) 单片机STC12C5A16AD工作频率为12MHz;

4) LCD显示器用1KΩ的电阻分压使其清晰显示,消除“鬼影”。

- 4 -

基于单片机的酒精浓度测试仪

第三章 硬件设计

3.1 硬件设计原理分析

本硬件由四部分组成:单片机模块,酒精传感器模块,显示模块,存储模块。本系统由单片机STC12C5A16AD控制,其直接控制两个模块:阀值存储模块将与酒精传感器采集到并输送到单片机控制处理后的数字信号相比较,LCD显示模块可以将经过单片机处理过的酒精气体浓度具体量化值显示出来,其硬件系统原理图如图3-1所示。MQ-3乙醇气体传感器输出信号经信号调理电路处理,输出随乙醇浓度变化的电压信号,该电压信号送入单片机系统,经A/D转换,与设定的醉酒阀值进行比较,并显示或报警。

MQ-3传感器模块MQ-3气体传感器信号调理电路模拟电压信号STC12C5A16AD单片机模/数转换电压/酒精浓度转换醉酒阈值阈值比较外部EEPROM酒精浓度显示过阈报警

图3-1 酒精浓度测试仪方框图

3.2 乙醇信号检测及调理电路

MQ-3乙醇气体传感器可以应用用于机动车驾驶人员及其他严禁酒后作业人员的现场检测,也用于其他场所乙醇蒸汽的检测。其技术特点为:

? 对乙醇蒸汽有很高的灵敏度和良好的选择性

- 5 -

基于单片机的酒精浓度测试仪

? 快速的响应恢复特性 ? 长期的寿命和可靠的稳定性 ? 简单的驱动回路

3.2.1 MQ-3主要技术指标

3.2.2 MQ-3结构、外形、测试电路

MQ-3气敏元件的结构和外形如图3-2所示, 由微型Al2O3陶瓷管、SnO2敏感层,测量电极和加热器构成的敏感元件固定在塑料或不锈钢制成的腔体内,加热器为气敏元件提供了必要的工作条件。封装好的气敏元件有6只针状管脚,其中4个用于信号取出,2个用于提供加热电流,表3-3对各个部件进行了详细的描述。

- 6 -

基于单片机的酒精浓度测试仪

图3-2 MQ-3气敏元件的结构外形图

表3-3 MQ-3气敏元件的组成材料表

1 2 3 4 5 6 7 8 9 部件 气体敏感层 电极 测量电极引线 加热器 陶瓷管 防爆网 卡环 基座 针状管脚 材料 二氧化锡 金(Au) 铂(Pt) 镍铬合金(Ni-Cr) 三氧化二铝 100目双层不锈钢(SUB316) 镀镍铜材(Ni-Cu) 胶木 镀镍铜材(Ni-Cu)

MQ-3乙醇气体传感器灵敏度曲线如图3-4所示,其传感原理为气敏电阻的输出阻值随乙醇气体等浓度变化而变化。

- 7 -

基于单片机的酒精浓度测试仪

图3-4 MQ-3乙醇气体传感器灵敏度曲线

3.2.3 MQ-3传感器调理电路

MQ-3乙醇气体传感器及其调理电路原理如图3-5所示。其外形如图3-6所

示。经过调理,检测信号由电阻值转变成电压值,便于后续电路进行A/D转换和处理。

图3-5 传感器及调理模块原理图

- 8 -

基于单片机的酒精浓度测试仪

图3-6 MQ-3传感器模块外形图

该传感器模块具有如下特点,方便与单片机系统接口组成检测仪器。 ? ? ? ?

具有信号输出指示。

双路信号输出(模拟量输出及TTL电平输出) TTL输出有效信号为低电平。

(当输出低电平时信号灯亮,可直接接单片机) 模拟量输出0~5V电压,浓度越高电压越高。

3.3 单片机模块

STC12C5A16AD是宏晶科技生产的新一代8051单片机,包含有中央处理器(CPU)、程序存储器(FLASH)、数据存储器(SRAM)、定时/计数器、UART串口、串口2、I/O接口、高速A/D转换、SPI接口、PCA、看门狗及片内R/C振荡器和外部晶振振荡等模块,几乎包含了数据采集和控制中所需的所有单元模块。

STC12C5A16S2单片机相比传统C51功能更加强大,有些特殊功能寄存器被扩展为专用的特殊寄存器。其引脚图和内部结构如图3-7所示:

- 9 -

基于单片机的酒精浓度测试仪

图3-7 STC12C5A16AD单片机管脚图

3.3.1 STC12C5A16AD的功能特性

(1) 高速:1个时钟/机器周期,增强型8051内核,速度比普通8051快8~12倍。

(2) 宽电压:3.3~5.5V。

(3) 增加外部掉电检测电路,可在掉电时及时将数据保存进EEPROM,正常工作时无需操作EEP。

(4) 增加第二复位功能脚,(高可靠复位,可调复位门槛电压,频率小于12Hz,无需此功能)。

(5) 低功耗设计:空闲模式(可由任意一个中断唤醒);掉电模式(可由外部中断唤醒),可支持下降沿/上升沿和远程唤醒。

(6) 工作频率:0~35MHz,相当于普通8051:0~4205MHz。

(7) 时钟:外部晶体或内部RC振荡器可选,在ISP下载编程用户程序时设置。

(8) 8/16/20/32/40/48/52/56/60/62K字节片内FLASH程序存储器,擦写次数10万次以上。

(9) 1280字节片内RAM数据存储器。

(10) 芯片内EEPROM功能,擦写次数10万次以上。

- 10 -

PDIP40, STC12C5A16AD

基于单片机的酒精浓度测试仪

(11) ISP/IAP,在系统可编程/在在应用可编程,无需编程器/仿真器。 (12) 8通道,10位高速ADC,高速可达25万次/秒,2位PWM还可当2路D/A使用。

(13) 2通道捕获/比较单元(PWM/PCA/CCP),也可用来再实现2个定时器或2个外部中断(支持上升沿/下降沿中断)。

(14) 4个16位定时器,兼容8051的定时器T1/T0,2路PCA实现2个定时器。 (15) 可编程时钟输出功能,T0在P3.4输出时钟,T1在P3.5输出时钟,BRT在P1.0输出时钟。

(16) 硬件看门口(WDT)。 (17) 高速SPI串行通信端口。

(18) 全双异步串行口(UART),兼容普通8051串口。

(19) 先进的指令集结构,兼容普通8051指令集,有硬件乘法/除法指令。 (20) 通用I/O口(37/40/44个),复位后为准双向口/弱上拉(普通8051 I/O口)可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可达到20mA,但整个芯片最大不超过100mA。

3.3.2 STC12C5A16AD的引脚说明

单片机采用40引脚的双列直插封装方式。图3-7为引脚排列图,40条引脚说明如下:

1)主电源引脚Vss和Vcc

2)外接晶振引脚XTAL1和XTAL2

3)控制或与其它电源复用引脚RST,ALE和NA

4)输入/输出引脚P0.0~P0.7,P1.0~P1.7,P2.0~P2.7,P3.0~P3.7 (1)P0口(P0.0~P0.7)是一个漏极开路型准双向I/O口。在访问外部存储器时,它是分时多路转换的地址(低8位)和数据总线,在访问期间激活了内部的上拉电阻。

(2)P1口(P1.0~P1.7)是带内部上拉电阻的8位双向I/O口。在EPROM编程和程序验证时,它接收低8位地址。

(3)P2口(P2.0~P2.7)是一个带内部上拉电阻的8位双向I/O口。在访问外部存储器时,它送出高8位地址。在对EFROM编程和程序验证期间,它接收高8位地址。

(4)P3口(P3.0~P3.7)是一个带内部上拉电阻的8位双向I/O口。在访问外

- 11 -

基于单片机的酒精浓度测试仪

部存储器时,它送出高8位地址。在对EFROM编程和程序验证期间,它接收高8位地址。

3.3.3 单片机系统原理图

该芯片为52内核8位单片机,内部集成了10位多路A/D转换模块,适用于常用检测电路。由STC12C5A16AD组成的单片机系统原理图如图3-8所示。图中AOUT为MQ-3传感器模块输出的检测电压信号,送入ADC7端口进行处理,DOUT为传感器模块输出的数字电平信号,该信号可以根据乙醇气体浓度直接输出报警信号,报警阈值通过模块上的电位器进行调节。

图3-8 单片机系统原理图

图3-8中,按键K2和K3为醉酒阈值调整键,其中K2为“增加”,K3为“减

- 12 -

基于单片机的酒精浓度测试仪

小”按键。L2和L3为报警指示灯,分别可以进行酒后和醉酒两级报警。

3.4、显示电路

1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。主要功能有:40通道点阵LCD驱动;可选择当作行驱动或列驱动;输出能产生20×2个LCD驱动波形输入接受控制器送出的串行数据和控制信号,偏压;通过单片机控制将所测的频率信号读书显示出来。

3.4.1 LCD1602显示模块技术参数

(1) 显示容量:16×2个字符; (2) 芯片工作电压:4.5~5.5V; (3) 最佳工作电压:5.0V; (4) 最佳工作电流:2.0Mv; (5) 字符尺寸:2.95×4.35mm。

3.4.2 LCD1602显示模块功能

LCD1602显示模块具体功能可见表3-9。

表3-9 LCD1602引脚,符号功能说明

引脚 GND VDD VO 标号 1 2 3 状态 接地 电源(5V) 液晶显示偏压信号,液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度) RS 4 输入 寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。 R/W

说明 5 输入 读/写信号,高电平1时进行读操作,低电平0时进- 13 - 基于单片机的酒精浓度测试仪

行写操作 E 6 输入 三态 输入 输入 使能信号,下降沿使能,下降沿能触发锁存数据 数据总线,进行数据输出 背光电源(5V) 背光接地 DB0~DB7 7~14 BLA BLK

15 16 3.4.3 LCD1602显示器工作原理

LCD1602有11个控制指令,见表3-10。其中,DDRAM:显示数据RAM,用来寄存待显示的字符代码;CGROM:字符发生存储器;CGRAM:用户自定义的字符图形RAM。

表3-10 LCD1602控制指令表

指令 清屏 归位 输入方式设置 显示开关控制 光标、画面位移 功能设置 CGRAM地址设置 DDRAM地址设置 读BF和AC值 写数据 读数据 清DDRAM和AC值 AC=0,光标、画面回HOME位 设置光标、画面移动方式 设置显示、光标及闪烁开、关 光标、画面移动,不影响DDRAM 工作方式设置(初始化指令) 设置CGRAM地址。A5~A0=0~3FH DDRAM地址设置 读忙标志BF和和地址计数器AC值 数据写入DDRAM或CGRAM 从DDRAM或CGRAM数据读出 功能

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”,具体寄存器的选择控制表3-11有操作说明。

因为LCD1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片

- 14 -

基于单片机的酒精浓度测试仪

机编程中还可以用字符型常量或变量赋值,如'A’。

表3-11 LCD1602寄存器选择控制表

RS 0 0 0 1 R/W 操作说明 写入指令寄存器(清除屏等) 忙标志以及读取位址计数(DB0~DB6)值 1 1 0 1 写入数据寄存器(显示各字型等) 从数据寄存器读取数据 与单片机接口电路如图3-12所示。其中J2的3脚为背光引脚,R9和R10电阻用于调节背光亮度。J2的4、5、6引脚分别接液晶的RS、E/W和E控制引脚,J2的7—14引脚为数据引脚。

图3-12 LCD与单片机接口电路

3.5 阈值存储

醉酒阈值存储在EEPROM芯片AT24C04中,并可以通过 “增加”、“减少”按键调节并保存。AT24C04是IIC接口的EEPROM芯片,可以用于掉电不易失数据的存储。其电路如图3-13所示。图中A0、A1和A2为芯片的地址引脚,一般接地即可。SCL和SDA为AT24C04和单片机IIC通信的时钟线和数据线。

- 15 -

基于单片机的酒精浓度测试仪

图3-13 EEPROM存储电路

3.6 供电及程序下载电路

本设计采用USB接口供电,电源电压5V。同时,USB接口通过内含PL2303芯片的转换电路对单片机进行程序编写。其电路原理如图10所示。

图10 供电及程序下载电路

- 16 -

基于单片机的酒精浓度测试仪

第四章 软件设计

本设计软件主程序流程图如图4-1所示。当检测到酒精气味时,气体传感器MQ-3两个电极端A-B间电阻将变小,对应与气体传感器负载电阻的分压将变大,输出电压也将变大。

数据初始化定时器初始化A/D转换初始化显示初始化进入后台while循环触发A/D转换换算酒精浓度酒精浓度显示超过阈值吗?否酒精浓度显示是报警有键按下吗?否是按键处理 图4-1主程序流程图

- 17 -

基于单片机的酒精浓度测试仪

第五章 Protel硬件开发软件

Protel是目前国内最流行的通用EDA软件,它是将电路原理图设计、PCB板图设计、电路仿真和PLD设计等多个实用工具软件组合后构成的EDA工作平台,是第一个将EDA软件设计成基于Windows的普及型产品。它集成了软件界面、仿真功能和PLD设计和信号完整性分析,在此基础上Protel 99SE又增加了一些新的功能,用户使用更加方便灵活。Protel的功能十分强大,在电子电路设计领域占有极其重要的地位。它以其强大功能和实用性,逐渐获得广大硬件设计人员的青睐,是目前众多EDA设计软件中用户最多的产品之一。

5.1 Protel软件组成

Protel软件主要由电路原理图设计模块、印制电路板设计模块(PCB设计模块)、电路信号仿真模块和PLD逻辑器件设计模块等组成,各模块具有强大的功能,可以很好的实现电路设计与分析。

(1) 原理图设计模块(Schematic模块)

电路原理图是表示电气产品或电路工作原理的重要技术文件,电路原理图主要由代表各种电子器件的图形符号、线路和结点组成。图4.1所示为一张电路原理图。该原理图是由Schematic模块设计完成的。Schematic模块具有如下功能:丰富而灵活的编辑功能、在线库编辑及完善的库管理功能、强大的设计自动化功能、支持层次化设计功能等。

(2) 印制电路板设计模块(PCB设计模块)

印制电路板(PCB)制板图是由电路原理图到制作电路板的桥梁。设计了电路原理图后,需要根据原理图生设计成印制电路板的制板图,然后在根据制板图制作具体的电路板。印制电路板设计模块具有如下主要功能和特点:可完成复杂印制电路板(PCB)的设计;方便而又灵活的编辑功能;强大的设计自动化功能;在线式库编辑及完善的库管理;完备的输出系统等。

(3) 电路信号仿真模块

电路信号仿真模块是一个功能强大的数字/模拟混合信号电路仿真器,能提供连续的模拟信号和离散的数字信号仿真。它运行在Protel的EDA/Client集成环境下,与Protel Advanced Schematic原理图输入程序协同工作,作为Advanced Schematic的扩展,为用户提供了一个完整的从设计到验证仿真设计环境。

在Protel中进行仿真,只需从仿真用元器件库中放置所需的元器件,连接好

- 18 -

基于单片机的酒精浓度测试仪

原理图,加上激励源,然后单击防真按钮即可自动开始。

5.2 PCB板设计

(1) 定元件的封装

① 打开网络表(可以利用一些编辑器辅助编辑),将所有封装浏览一遍,确保所有元件的封装都正确无误并且元件库中包含所有元件的封装,网络表中所有信息全部大写,一面载入出问题,或PCB BOM不连续。

② 标准元件全部采用公司统一元件库中的封装。

③ ④⑥⑤元件库中不存在的封装,应自己建立元器件库。 (2) 建立PCB板框

① 根据PCB结构图,或相应的模板建立PCB文件,包括安装孔、禁布区等相关信息。

② 尺寸标注。在钻孔层中应标明PCB的精确结构,且不可以形成封闭尺寸标注。

(3) 载入网络表

① 载入网表并排除所有载入问题,具体请看《PROTEL技术大全》。其他软件载入问题有很多相似之处,可以借鉴。

② 如果使用PROTEL,网表须载入两次以上(没有任何提示信息)才可以确认载入无误。

(4) 布局

① 首先要确定参考点。

一般参考点都设置在左边和底边的边框线的交点(或延长线的交点)上或印制板的插件的第一个焊盘。

② 一但参考点确定以后,元件布局、布线均以此参考点为准。布局推荐使用25MIL网格。

③ 根据要求先将所有有定位要求的元件固定并锁定。 ④ 布局的基本原则

A. 遵循先难后易、先大后小的原则。

B. 布局可以参考硬件工程师提供的原理图和大致的布局,根据信号流向规律放置主要原器件。

C. 总的连线尽可能的短,关键信号线最短。

D. 强信号、弱信号、高电压信号和弱电压信号要完全分开。 E. 高频元件间隔要充分。

- 19 -

基于单片机的酒精浓度测试仪

F. 模拟信号、数字信号分开。

⑤ 相同结构电路部分应尽可能采取对称布局。

⑥ 按照均匀分布、重心平衡、版面美观的标准来优化布局。 (5) PCB设计遵循的规则 ① 地线回路规则:

图5-1 地线回路规则

环路最小规则,即信号线与其回路构成的环面积要尽可能小,环面积要尽可能小,环面积越小,对外的辐射越少,接收外界的干扰也越小。针对这一规则,在地平面分割时,要考虑到地平面与重要信号走线的分布,防止由于地平面开槽等带来的问题;在双层板设计中,在为电源留下足够空间的情况下,应该将留下的部分用参考地填充,且增加一些必要的过孔,将双面信号有效连接起来,对一些关键信号尽量采用地线隔离,对一些频率较高的设计,需特别考虑其地平面信号回路问题,建议采用多层板为宜。

② 窜扰控制

窜扰(CrossTalk)是指PCB上不同网络之间因较长的平行布线引起的相互干扰,主要是由于平行线间的分布电容和分布电感的作用。克服窜扰的主要措施是:

A.加大平行布线的间距,遵循3W规则。 B.在平行线间插入接地的隔离线。 C.减少布线层与地平面的距离 ③ 屏蔽保护

- 20 -

基于单片机的酒精浓度测试仪

图5-2 屏蔽保护

对应地线回路规则,实际上也是为了尽量减小信号的回路面积,多用于一些比较重要的信号,如时钟信号,同步信号;对一些特别重要,频率特别高的信号,应该考虑采用铜轴电缆屏蔽结构设计,即将所布的线上下左右用地线隔离,而且还要考虑好如何有效的让屏蔽地与实际地平面有效结合。

④ 走线方向控制规则

相邻层的走线方向成正交结构,避免将不同的信号线在相邻层走成同一方向,以减少不必要的层间窜扰;当由于板结构限制(如某些背板)难以避免出现该情况,特别是信号速率较高时,应考虑用地平面隔离各布线层,用地信号线隔离各信号线。

⑤ 电源与地线层的完整性规则

对于导通孔密集的区域,要注意避免孔在电源和地层的挖空区域相互连接,形成对平面层的分割,从而破坏平面层的完整性,并进而导致信号线在地层 的回路面积增大。

- 21 -

基于单片机的酒精浓度测试仪

第六章 总结与展望

6.1 设计结果

本次设计的酒精浓度检测系统,通过设计相关的硬件电路及进行相应的软件调试,最后实现了实时检测酒精浓度,并的在LCD1602上显示的目的。设计出的电路,完全符合本次实验的设计要求,通过按键可以实现调整门限值,对于检测到的酒精浓度高于设定门限值时,会显示实时酒精浓度值,系统会自动实现灯光报警功能,具体工作图见附录2。

6.2 设计体会与展望

此次酒精测试仪的设计参考了一些网上搜集来得资料,主要是软件方面,在硬件设计上还是花费了一些时间,尤其是对EEPROM的操作上,自上单片机课程以来对于外部访问,尤其是地址操作很不习惯也不熟悉,所以在操作上存在一定的困难。在硬件上对于单片机选型也是一门学问,这次课题设计中必须要用到的两样东西是ADC和串口,那么ATMEL公司的AT89C51系列的单片机不具备自带ADC功能,必须外接ADC0809如此一来在硬件的设计上又增加了新的难度,为了简化电路,提高成功率我选择了STC系列单片机具体型号为STC12C5A16AD,此型号单片机自带8位高速ADC经过软件编程设计即可派上用场,这样大大减轻了设计压力。在一开始的设计电路时本来准备把阀值设定成一个定值输入烧进单片机的程序里,可是后来经过翻阅各种书刊发现各种环境下的阀值是不同的,所以决定用AT24C02来存储阀值,并可以通过两个升降按键来自行调节阀值。

在本次毕业设计中学到的知识,我将它们发挥到其他的学习中去,也将在今后的学习中不断的提高和完善;而在此期间发现的不足,我将努力改善,通过学习实践等方式不断提高,克服那些知识障碍,以求在今后的学习过程中获得更大的进步!

- 22 -

基于单片机的酒精浓度测试仪

参考文献

[1] 张福学.《现代传感器电路》.中国计量出版社,2000.

[2] 万隆, 巴奉丽.《单片机原理及应用技术》.清华大学出版社,2010. [3] 李琳,李爱传.《酒精浓度测试仪的设计》.黑龙江信息科技.2011.04. [4] 汤竟南,沈国琴.《51单片机C语言开发与实例》.人民邮电出版社.2008. [5] 赵春雨.《基于STC单片机的矿用智能甲烷传感器的开发与研究》.自动化应

用.2011.07

[6] 雷伏容,张小林,崔浩.《51单片机常用模块设计查询手册》.清华大学出

版社,2010.

[7] 冉伟刚.《气体酒精浓度监测报警器》. 农业网络信息.2011.10. [8] 吴桂秀.《传感器应用制作入门》.浙江科学技术出版社.2004.

- 23 -

基于单片机的酒精浓度测试仪

附录一

- 24 -

基于单片机的酒精浓度测试仪

附录二

- 25 -

基于单片机的酒精浓度测试仪

附录三

#include \

void DELAY(unsigned int t) { while(t!=0) t--; }

void IICStart(void) {

SCL=0; DELAY(1);

SDA=1; SCL=1; DELAY(1); SDA=0; DELAY(1); SCL=0; }

void IICStop(void) { SDA=0;SCL=1; DELAY(1); SDA=1; DELAY(1); SCL=0; }

void SEND0(void) { SDA=0; SCL=1; DELAY(1); SCL=0; }

void SEND1(void) { SDA=1; DELAY(1); SCL=1; DELAY(1); SCL=0; }

bit Check_Ack(void) {

unsigned char errtime=250;

- 26 -

DELAY(1); SCL=1; DELAY(1); CY=SDA; while(CY) {

errtime--; CY=SDA; if (!errtime) {

IICStop();

return 1; } }

DELAY(1); SCL=0; return 0; }

void Write_byte(unsigned char dat) {

unsigned char i; for(i=0;i<8;i++) { if((dat<

unsigned char Read_byte(void) { unsigned char i,temp=0; for(i=0;i<8;i++) {

SDA=1; SCL=1; DELAY(1); if(SDA==1) { temp=temp<<1;

基于单片机的酒精浓度测试仪

- 27 -

基于单片机的酒精浓度测试仪

temp=temp|0x01; } else temp=temp<<1; SCL=0; } return temp; }

unsigned char rdeeprom(unsigned char addr) {

unsigned char temp=0; bit flag=0; IICStart(); Write_byte(0xa0); Check_Ack(); Write_byte(addr); Check_Ack(); IICStart(); Write_byte(0xa1); Check_Ack(); temp=Read_byte(); SEND1(); IICStop();

return temp; }

void wrteeprom(unsigned char addr,unsigned char dat) {

IICStart(); Write_byte(0xa0); Check_Ack(); Write_byte(addr); Check_Ack(); Write_byte(dat); Check_Ack(); IICStop(); }

#include \#include \void delay() {

- 28 -

int i,j; for(i=0; i<=10; i++) for(j=0; j<=2; j++) ; }

uchar Convert(uchar In_Date) { /*

uchar i, Out_Date = 0, temp = 0; for(i=0; i<8; i++) {

temp = (In_Date >> i) & 0x01; Out_Date |= (temp << (7 - i)); }

return Out_Date; */ return In_Date; }

void enable(uchar del) { P0 = Convert(del); RS = 0; RW = 0; E = 0; delay(); E = 1; delay(); }

void write(uchar del) { P0 = Convert(del); RS = 1; RW = 0; E = 0; delay(); E = 1; delay(); }

基于单片机的酒精浓度测试仪

- 29 -

基于单片机的酒精浓度测试仪

void L1602_init(void) { enable(0x01); enable(0x38); enable(0x0c); enable(0x06); enable(0xd0); }

void L1602_char(uchar hang,uchar lie,char sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); write(sign); }

void L1602_string(uchar hang,uchar lie,uchar *p) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); while(1) { if(*p == '\\0') break; write(*p); p++; } }

//显示整型的温湿度数据用,共占用4位,其中一位符号位 void L1602_int(uchar hang, uchar lie, int num) {

uint temp;

uint gewei,shiwei,baiwei,sign; //首先将4位清空

L1602_char(hang, lie+0, ' '); L1602_char(hang, lie+1, ' '); L1602_char(hang, lie+2, ' '); L1602_char(hang, lie+3, ' ');

- 30 -

基于单片机的酒精浓度测试仪

if (num >= 0) {

sign = 0; } else {

sign = 1; }

temp = abs(num); baiwei = temp / 100;

temp = temp - baiwei*100; shiwei = temp / 10;

gewei = temp - shiwei*10; num = abs(num); if (num>=100) {

if (sign == 1) //负数 { L1602_char(hang, lie, '-'); }

L1602_char(hang, lie+1, baiwei+48); L1602_char(hang, lie+2, shiwei+48); L1602_char(hang, lie+3, gewei+48); }

else if (num>=10) {

if (sign == 1) { L1602_char(hang, lie+1, '-'); } L1602_char(hang, lie+2, shiwei+48); L1602_char(hang, lie+3, gewei+48); } else {

if (sign == 1) { L1602_char(hang, lie+2, '-'); }

L1602_char(hang, lie+3, gewei+48); } }

#include \

- 31 -

基于单片机的酒精浓度测试仪

#include \#include \#include \

#define uchar unsigned char #define uint unsigned int

//声明常量

#define ALCH 80 //醉驾标准80mg/L

//K_MG_MV和K_ZERO为传感器校准系数,要根据每个MQ-3模块校准

#define K_MG_MV 160/66 //传感器灵敏度系数,每毫克/L对应的10毫伏数 #define K_ZERO 15 //传感器零点漂移,约130mV

//定义按键

sbit Key_Up = P3^6; sbit Key_Down = P3^7;

//定义LED报警灯 sbit Led_Warn1 = P3^4; sbit Led_Warn2 = P3^5;

//定义乙醇传感器TTL电平输出引脚 sbit DOUT = P1^4;

//定义标识

volatile bit FlagStartAL = 0; //开始转换标志 volatile bit FlagKeyPress = 0; //有键弹起标志

//全局变量定义

uchar Threshold; //酒精浓度上限报警值 uint ALCounter; //酒精转换计时器 long ALValue; //酒精测量值 float ALtemp; //计算临时变量

uint keyvalue, keyUp, keyDown; //键值

char * pSave; //EEPROM存盘用指针

//函数声明

void Data_Init(); void Timer0_Init(); void Port_Init(); void ADC_Init(); uchar GetADVal(); void KeyProcess(uint );

- 32 -

基于单片机的酒精浓度测试仪

//数据初始化 void Data_Init() {

ALCounter = 0; ALValue = 0; Led_Warn1 = 1; Led_Warn2 = 2; keyvalue = 0; keyUp = 1; keyDown = 1; }

//定时器0初始化,中断时间约2毫秒

//计算:晶振11.0592MHz,定时器时钟11059200/12=921600,每毫秒922个脉冲 // 16位定时器初值65536-1844=63692=0xf8cc void Timer0_Init() {

ET0 = 1; //允许定时器0中断 TMOD = 1; //定时器工作方式选择 TL0 = 0xcc; //

TH0 = 0xf8; //定时器赋予初值,大约为2毫秒中断1次 TR0 = 1; //启动定时器 }

//定时器0中断

void Timer0_ISR (void) interrupt 1 using 0 {

TL0 = 0xcc;

TH0 = 0xf8; //定时器赋予初值

//每1秒钟启动一次AD转换 ALCounter ++;

if (ALCounter >= 500) {

FlagStartAL = 1; ALCounter = 0; } }

void Port_Init() {

P1M0 = 0x80; //10000000,P1.7作为AD输入 P1M1 = 0x80; //

- 33 -

基于单片机的酒精浓度测试仪

}

void ADC_Init() {

uint i;

P1ASF = 0x80; //设P1.7为AD输入 ADC_RES = 0; //清先前的结果

ADC_CONTR|=0x80; //POWER=1,打开ADC电源 for(i=5000;i>0;i--) ; //延时

ADC_CONTR = ADC_CONTR&0xE0; //1110,0000 清ADC_FLAG,ADC_START位和低3位

ADC_CONTR = ADC_CONTR&0xf8|0x07; //设置当前通道号为P1.7 for(i=2500;i>0;i--) ; //延时 }

//进行AD转换,得到当前酒精值 uchar GetADVal() {

uint i;

ADC_CONTR&=0xf7;

for(i=250;i>0;i--); //待输入电压稳定后开始转换 //ADC_RES = 0;

ADC_CONTR |= 0x08; //ADC_Start=1, 启动转换

while((ADC_CONTR&0x10)==0); //等待转换结束ADC_FLAG=1 ADC_CONTR&=0xe7; //清ADC_FLAG和ADC_START位,停止转换 return ADC_RES; }

//存入设定值

void Save_Setting() {

pSave = (char *)&Threshold; //地址低位对应低8位,高位对应高8位 wrteeprom(0, *pSave); //存醉酒阈值低8位 DELAY(300); pSave ++;

wrteeprom(1, *pSave); //存醉酒阈值高8位 DELAY(300); }

//载入设定值

void Load_Setting() {

pSave = (char *)&Threshold;

- 34 -

基于单片机的酒精浓度测试仪

*pSave++ = rdeeprom(0); *pSave = rdeeprom(1);

if ((Threshold>=255)||(Threshold<0)) Threshold = 80; }

//按键处理程序,参数为键值,1为Up键,2为Down键 void KeyProcess(uint num) {

switch (num) {

case 1:

if (Threshold<255) Threshold++; break; case 2:

if (Threshold>1) Threshold--; break; default: break; }

L1602_int(2,9,Threshold); Save_Setting(); }

void main() {

uint i,j;

EA = 0;

Data_Init(); //数据初始化

Timer0_Init(); //定时器0初始化 Port_Init(); //端口初始化 ADC_Init(); //ADC初始化 EA = 1;

L1602_init();

L1602_string(1,1,\ L1602_string(2,1,\ \ //延时

for (i=0;i<1000;i++) for (j=0;j<1000;j++) {;} //清屏

L1602_string(1,1,\ \ L1602_string(2,1,\ \ L1602_string(1,1,\ mg/L\

- 35 -

基于单片机的酒精浓度测试仪

L1602_string(2,1,\ mg/L\ //载入设定值 Load_Setting();

L1602_int(2,9,Threshold); while(1) {

//如果FlagStartAL标志置位,则进行AD转换 if (FlagStartAL == 1) {

//酒精浓度换算,50mg/L=62.5ppm,传感器灵敏度应事先校准

ALValue = 500 * GetADVal() / 256; //8位ADC,首先得到电压值,单位10毫伏 ALValue = ALValue - K_ZERO; //首先减去零点漂移,一般是130mV if (ALValue < 0) ALValue = 0; ALValue = ALValue * K_MG_MV; //将mV转变成mg/L,K_MG_MV系数需要校准

L1602_int(1,9,ALValue); if (ALValue > Threshold) Led_Warn1 = 0; //超过阈值,则 Led_Warn1灯报警,否则报警灯灭。 else Led_Warn1 = 1; FlagStartAL = 0; }

//查询乙醇传感器TTL电平,该指示灯为传感器模块报警 if (DOUT == 0) Led_Warn2 = 0; else Led_Warn2 = 1; //键盘查询,在弹起时响应

if ((Key_Up)&&(keyUp==0)) {FlagKeyPress = 1; keyvalue = 1;}

else if ((Key_Down)&&(keyDown==0)) {FlagKeyPress = 1; keyvalue = 2;} if (FlagKeyPress == 1) {

KeyProcess(keyvalue);

FlagKeyPress = 0; }

if (!Key_Up) keyUp = 0; else keyUp = 1;

if (!Key_Down) keyDown = 0; else keyDown = 1; DELAY(100); } }

- 36 -

基于单片机的酒精浓度测试仪

致谢

非常感谢陈杰老师能在百忙之中抽空给予我本次论文的悉心指导,从定题到解决论文之中的难题到最后的论文完成,陈杰老师总是不厌其烦的给我讲解不懂之处以及提出论文之中的不足。这次论文从定题到定稿其中有不少曲折,我真心感谢陈杰老师的耐心和支持,不断的给我鼓励,并提出板子的不足,使我能有进一步改进设计的正确方向。

这次论文完全是在陈老师的指导下完成的。所以我要借助这次机会衷心祝愿陈老师的事业能蒸蒸日上!

- 37 -

基于单片机的酒精浓度测试仪

- 38 -

本文来源:https://www.bwwdw.com/article/apo6.html

Top