一、前言
近年来,我国越来越多的人有了自己的私家车,而酒后驾车造成的交通事故也频繁发生。为此,我国将酒驾列入刑法范围内,所以需要设计一智能仪器能够检测驾驶员体内酒精含量。本课程设计研究的是一种以气敏传感器和单片机A/D转换器为主,检测驾驶员呼出气体的酒精浓度,并具有声光报警功能的空气酒精浓度监测仪。其可检测出空气环境中酒精浓度值,并可根据不同的环境设定不同的阈值,对超过的阈值进行声光报警来提示危害。
本课题分为两部分:硬件设计部分和软件设计部分。硬件部分为利用MQ3气敏传感器测量空气中酒精浓度,并转换为电压信号,经A/D转换器转换成数字信号后传给单片机系统,由单片机及其相应外围电路进行信号的处理,显示酒精浓度值以及超阈值声光报警。程序采用模块化设计思想,各个子程序的功能相对独立,便于调试和修改。而硬件电路又大体可分为单片机小系统电路、A/D转换电路、声光报警电路、LCD液晶显示电路,按键电路,各部分电路的设计及原理将会在硬件电路设计部分详细介绍。
二、酒精测试仪总体方案设计
2.1 酒精浓度检测仪设计要求分析
设计的酒精浓度测试仪应具有如下特点:
(1)数据采集系统以单片机为控制核心,外围电路带有LCD显示以及键盘响应电路,无需要其他计算机,用户就可以与之进行交互工作,完成数据的采集、存储、计算、分析等过程。
(2)系统具有低功耗、小型化、高性价比等特点。
(3)从便携式的角度出发,系统成功使用了数码管显示器以及小键盘。由单片机系统控制键盘和LCD显示来实现人机交互操作,界面友好。
(4)软件设计简单易懂。
2.2 酒精浓度检测仪设计方案
设计时,考虑酒精浓度是由传感器把非电量转换为电量,传感器输出的是0-5伏的电压值且电压值稳定,外部干扰小等。因此,可以直接把传感器输出电压值经过A/D转换器转换得到数据送入单片机进行处理。此外,还需接入液晶显示,键盘设定,报警电路,语音电路等。
其总体框图如图2-1所示。
图2-1 基本工作原理图
三、硬件设计
3.1 传感器的选择
本系统直接测量的是呼气中的酒精浓度,再转换为血液中的酒精含量浓度,故采用气敏传感器。考虑到周围空气中的气体成分可能影响传感器测量的准确性,所以传感器只能对酒精气体敏感,对其他气体不敏感,故选用MQ3型气敏传感器。其有很高的灵敏度、良好的选择性、长期的使用寿命和可靠的稳定性。MQ3型气敏传感器由微型Al2O3,陶瓷管和SnO2敏感层、测量电极和加热器构成的敏感元件固定在塑料或不锈钢的腔体内,加热器为气敏元件的工作提供了必要的工作条件。传感器的标准回路有两部分组成。其一为加热回路,其二为信号输出回路,它可以准确反映传感器表面电阻值的变化。传感器的表面电阻RS的变化,是通过与其串联的负载电阻RL上的有效电压信号VRL输出面获得的。负载电阻RL可调为0.5-200K。加热电压Uh为5v。上述这些参数使得传感器输出电压为0-5V。MQ3型气敏传感器的结构和外形、标准回路、传感器阻值变化率与酒精浓度、外界温度的关系图如图3-3所示。为了使测量的精度达到最高,误差最小,需要找到合适的温度,一般在测量前需将传感器预热5分钟。
图3-1 MQ3 结构和外形
图3-2 MQ3 结构图
图3-3 传感器阻值变化率与酒精浓度、外界温度之间的关系
3.2 A/D转换电路
在单片机应用系统中,被测量对象的有关变化量,如温度、压力、流量、速度等非电物理量,须经传感器转换成连续变化的模拟电信号(电压或电流),这些模拟电信号必须转换成数字量后才能在单片机中用软件进行处理。实现模拟量转换成数字量的器件称为A/D转换器(ADC)。
A/D转换器大致分有三类:一是双积分A/D转换器,优点是精度高,抗干扰性好,价格便宜,但速度慢;二是逐次逼近型A/D转换器,精度、速度、价格适中;三是∑-△A/D转换器。
该设计中选用的是ADC0809属第二类,是8位A/D转换器。0809具有8路模拟信号输入端口,地址线(23-25脚)可决定那一路模拟信号进行A/D转换。22脚为地址锁存控制,当输入为高电平时,对地址信号进行锁存。6脚为测试控制,当输入一个2μs的高电平脉冲时,就开始A/D转换。7引脚为A/D转换结束标志,当A/D转换结束时,7脚输出高电平。9脚为A/D转换数据输出允许端,当OE脚为高电平时,A/D转换数据输出。10脚为0809的时钟输入端。
3.2.1 ADC0809的引脚及功能
逐次比较型A/D转换器在精度、速度、和价格上都适中,是最常用的A/D转换器件。芯片采用的是ADC0809,以下介绍ADC0809的引脚及功能。芯片如图3-4所示。
/程序头函数
#include <reg52.h>
#include <intrins.h>
//显示函数
#include <display.h>
#include <4004.h>
//宏定义
#define uint unsigned int
#define uchar unsigned char
#define Data_ADC0809 P1
//管脚声明
//sbit LED_R= P2^2; //红指示灯
//sbit LED_G= P2^0; //绿色指示灯
//sbit FENG = P2^5; //蜂鸣器
//ADC0809
sbit ST=P3^3;
sbit EOC=P3^1;
sbit OE=P3^2;
//按键
sbit Key1=P2^5; //设置按键
sbit Key2=P2^4; //加
sbit Key3=P2^3; //减
sbit Key4=P2^2;
bit bdata flag;//指示灯和蜂鸣器闪烁报警标志位
uchar set; //设置标志位
//函数声明
extern uchar ADC0809();
extern void Key();
//酒精含量变量
uchar temp=0;
uchar WARNING=25; // 初始报警值
void delay_2S(void) //4S
{
uchar a;
uchar b,c;
for(c=90;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
//初始化函数
/*void init()
{
TMOD=0x01; //定时器0方式1
TL0=0xb0;
TH0=0x3c; //赋初值
EA=1; //开总中断
ET0=1; //允许定时器0中断
TR0=1; //定时器0开
} */
//主函数
void main()
{
uchar p=0;
uint sum;
Init1602(); //1602初始化
// init(); //初始化函数
while(1)//主循环
{
for(p=0;p<20;p++)
{
temp=ADC0809(); //读取酒精值
sum=sum+temp;
}
temp=sum/20;
sum=0;
if(set==0) //如果没有按下设置(默认set是0,就是正常显示状态)
Display_1602(temp,WARNING,Mode); //显示酒精值
//开始语音播报
if(set==0)
{
//现在浓度
playbit=1;
playcout=1;
playsound();
delay_2S();
delay_2S();
DDstop();
//第一位
playbit=1;
playcout=(temp/100)+2;
playsound();
delay_2S();
DDstop();
//第二位
playbit=1;
playcout=(temp%100/10)+2;
playsound();
delay_2S();
DDstop();
//第三位
playbit=1;
playcout=(temp%100%10)+2;
playsound();
delay_2S();
DDstop();
/* //米
playbit=1;
playcout=12;
playsound();
delay_2S();
DDstop(); */
if(temp<WARNING&&set==0) //如果实际的酒精值小于报警值且在正常显示状态下
{
// flag=0; //执行下面flag=0的(主要就是绿灯闪,关蜂鸣器和继电器)
//浓度正常
playbit=1;
playcout=12;
playsound();
delay_2S();
delay_2S();
DDstop();
}
else if(temp>WARNING&&set==0) //如果实际的酒精值大于报警值且在正常显示状态下
{
// flag=1; //执行下面flag=1的(主要就是红灯闪,开蜂鸣器和继电器)
//浓度超标
playbit=1;
playcout=13;
playsound();
delay_2S();
delay_2S();
DDstop();
}
delay_2S();
//录音键按下
if(Key4==0)
{
Mode=1;
while(Mode!=14)
{
//按键判断
if(Key4==0)
{
Mode++;
Display_1602(0,0,Mode);
while(Key4==0);
//开始录音
playbit=0;
recbit=1;
// playcout=Mode-1;
reccout=Mode-1;;
playsound();
if(Mode==2||Mode==14||Mode==13)
delay_2S();
delay_2S();
DDstop();
文章借鉴于此纷传