引言
随着我国经济的蓬勃发展,国民生产总值的不断提高,人均可支配财产也大大增加,汽车拥有量持续增加,与此同时,每年死于交通事故的人数也在持续增加,道路交通安全形势变得十分严峻,多部门都对此高度重视。
在全球范围内,人均酒精消费量从1990年的5.9L增加到2017年的6.5L,未来还将持续增加。而人体血液中积累一定程度的酒精,但未及时分解排出体外时,便会影响大脑和中枢神经,致使神经麻痹,大脑反应滞后,身体不受控制等症状,在处理紧急情况时的反应速度和控制能力会有些许下降,严重者丧失行动能力。而我国的酒文化历史悠久,源远流长,在世界上也是独领风骚,在接待贵宾,亲朋好友相聚,酒水必不可少,随之也带来了一系列社会问题,例如酒后打架、醉酒驾驶引发交通事故等,酒后驾驶甚至被列为车祸致死的主要原因之一,一旦发生,将是一个甚至多个家庭的不幸,为了降低发生此类事情的概率,使更多人的生命财产安全得到保障,急需一种仪器来判断驾驶员是否醉酒驾驶。
本文提出并设计了一种可以实时检测呼出气体的酒精含量,且超出设定值时会声光报警的测试仪。本文详细介绍了设计所提出的背景和研究意义,对于所用到的各个器件做了对比介绍,以及各个硬件电路模块的工作原理,在软件程序方面,对于各个模块做了详细的流程框图,可以快速看出程序设计思路,最后列举了硬软件在设计调试所出现的一系列问题以及与之对应的解决办法。
1 课题背景意义及研究内容
1.1 课题背景及研究意义
此次毕业设计的课题是《基于单片机的酒精检测仪》,是工程设计类的课题。
现如今,已全面步入信息化时代,电子设备充斥着我们生活的方方面面。带来了巨大的便利,在实际生活中,酒精检测仪也应用于食品加工,酿酒,交通查酒驾等领域,平时见到最多的便是交警查酒驾,而最准确确定人体酒精浓度的方法是抽血化验检测,但是这种办法操作过程过于繁琐,技术难度相对较高。测量呼出的气体来判断气体的酒精浓度相对较为实用,一个人在深呼吸2~4秒后,便会释放出肺部深处的气体,而血液中的酒精浓度与肺部的比值大致为1:2200,通过这种方式便可来推算人的饮酒量。
根据酒精检测仪的原理,可以将其划分为电化学、红外、气体色谱、比色、半导体型等五大类。受价格等因素的影响,半导体和电化学型的应用较广。目前,许多国家都使用呼气酒精检测仪在现场进行检测,来判断驾驶员是否饮酒。其中电化学型的稳定性较好,精确度较高,且抗干扰性强,但是要求结构较为精密,且制造困难,只有个别国家可以生产,相反半导体类型的较为廉价,但性能不如燃料电池性的。
酒精检测仪的现实意义在交通方面主要是可以解决社会上的车祸乱象,可以很大程度的减少车祸的发生,对道路出行多了一份安全保障,挽救了无数个家庭,同时也给国家做了巨大的贡献,树立了国家安全的良好形象,让每一个人都能生活在一个良好的社会环境中,其次在其他如食品加工等领域,可以检测生产产品的质量以及确保生产安全。
1.2 课题研究内容
设计要求:
(1)能对酒精含量进行测量和显示,并显示醉酒阈值;
(2)当酒精浓度大于醉酒阈值时,声光报警;
(3)能够显示年、月、日、星期、时、分、秒。
2 设计方案选择
2.1 系统控制芯片选择
方案一:选择STC89C52单片机作为主控制芯片。该单片机是8位微控制器,有8K的程序存储空间,有256个字节数据存储空间,3个16位定时器/计数器,4个外部中断,全双工串行口,具有高速、低功耗、具有超强抗干扰性的特点,其指令代码完全兼容8051,市场价格较为廉价,且具有灵活的编程方式。
方案二:选择MSP430单片机作为主控制芯片。该单片机的汇编语言使用起来较为灵活,有许多寻址方式,且具有强大的处理能力,电压低,功耗较低,片内集成资源丰富,且加密性强,有强抗干扰能力。但是由于工作电压低,接口电路麻烦,而且I/O口无保护,所以过压电流会击穿。其次不易上手,学习资料较少。
综合以上的描述,鉴于STC89C52较为常用,市场上价格相对较低,设计开发难度较小,查找学习资料便捷,且此单片机已可满足设计要求,因此选择STC89C52作为主控制芯片。
2.2 显示器件的选择
方案一:使用LCD1602液晶显示屏。该显示屏可以直接和STC89C52直接接口,可显示32个字符,因是字符型液晶,所以可以较为便捷地显示字母和数字,且控制简单,市场价格低廉,但是所显示的字体大小不可随意改动,对于曲线和图形等也无法显示。
方案二:使用LCD12864液晶显示屏。该液晶显示屏的各个显示点都与一个二进制数对应,因此可自行设计输出的图形和汉字,分辨率较高,功耗较低,且轻薄,由于显示信息量大,造成电路及程序的设计较为困难。
综合以上方案,本设计主要显示酒精含量、时间和日期,需要显示的内容较少,选用LCD1602为显示屏,已可满足设计要求,且该显示屏价格低廉,在网络上可查找资料较多,方便学习参考,设计难度相对较小。
2.3 A/D转换芯片的选择
方案一:采用ADC0832作为模数转换器件。该芯片是双通道的模数转换芯片,在0~5V的电压下可以正常工作,采用250KHZ的频率,采用双输出方式对数据进行严格的校对,可有效减少芯片的数据错误,并具有较好的稳定性。独立的允许输入模式使得多个设备的安装和控制过程更加方便。
方案二:采用ADC0808作为A/D转换器件。该芯片是ADC0809的简化版,功能大致相同,ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。
这两种设备的基本性能相似,因为本次设计只需一个通道,所以使用ADC0832芯片已可满足需求,可节省资源,且此芯片兼容性好,较为划算。
2.4 酒精检测传感器的选择
半导体型的酒精传感器MQ-3所处环境中含有酒精蒸气时,当乙醇气体浓度增大时,传感器的导电性能也随之提高,接着将检测到的酒精含量转化为电信号,可以得到关于周围环境中被测气体状态的信息。MQ-3对酒精较为敏感,以及有较强的抗干扰能力,对于油烟水汽有较强的抵抗性,且市场价格较低,适用于多种应用,最终方案选择MQ-3酒精传感器。
2.5 时钟芯片的选择
DS1302时钟芯片可提供时间等信息,在2V~5.5V之间可以正常工作,具备主电源后备电源双电源引脚,1脚为主电源接口,8脚作为后备电源接口,可搭配纽扣电池做后备电源,以极低的消耗可保持时钟运行很长时间,运行时间可达到几个月甚至几年,即使断电后再次上电使用设备也可做到时间同步标准时间。虽然单片机内部也有定时器,但它是对单片机工作节拍的技术的精确度较高,但不适合长时间定时。相比之下,选择DS1302做时钟芯片更能满足课题要求。
2.6 系统整体设计方案
结合上面选择的解决方案,确定了总体系统框图,如图2-1所示。
图2-1 总体系统框图
最终将STC89C52单片机作为系统的主控芯片,人机交互通过独立按键和LCD1602液晶显示屏来实现,并可通过独立按键来设定醉酒阈值,调节时间显示,与标准时间同步。使用MQ-3酒精传感器来得到电信号,经过电路处理成模拟电压后输送给单片机,经ADC0832转换器件转化为数字电压。模拟信号由A/D转换模块输出,用于检测酒精的浓度,从而降低设备的使用。将所获得的数据与预先设置的醉酒阈值进行比较,超过设定值值时,LED亮,同时蜂鸣器发出报警声。整个电路包括:最小MCU,时钟,功能按键,LCD液晶四大部分。该供电模块由一个滤波电容,一个自锁开关,一个LED显示,可5V直流供电,供电给各模块;由LCD1602液晶显示屏和可调电阻器组成液晶显示模块。
3 系统硬件设计
3.1 单片机最小系统
3.1.1单片机STC89C52
STC89C52单片机完全兼容8051,该单片机共有四组I/O口,全部提供给用户(程序长度小于4K)分别是P0、P1、P2、P3。有6个中断源,3个16位的定时/计数器,片内振荡器和时钟电路在5.5V~3.8V之间可正常工作,11.0592MHz和12MHz是常用的时钟工作频率,安全性高,功耗低,运行速度快,性能卓越,且市场价格便宜,在多个领域都有应用。
3.1.2单片机最小系统
单片机最小系统电路如图3-1所示
/*************************************************************
酒精检测报警系统
补充说明:
***************************************************************/
#include<reg52.h> //头文件
#include<LCD1602.h>
#include<ADC0832.h>
#include<EEPROM.h>
#include<INTERRUPT.h>
#include<DS1302.h>
#define uchar unsigned char //宏定义
#define uint unsigned int
/*****************灯、蜂鸣器、按键引脚定义*******************/
sbit led = P1^7; //LED灯(红)
sbit buzz = P1^6; //蜂鸣器
sbit key_set = P1^0; //设置键
sbit key_jia = P1^1; //加值键
sbit key_jian= P1^2; //减值键
/*********************全局变量定义***************************/
#define K_MG_MV 2 //电压每升高0.01V,酒精浓度上升2ppm
#define IN_V 500 //电源电压放大100倍。5V*100=500
long ALValue; //存储实际浓度值
uchar K_ZERO; //MQ-3零值
uint jiujia_up; //存储酒驾阀值
uint set_f; //设置选择标记,=0非设置,=1设置酒驾阀值,=2设置醉驾阀值
uchar num; //计数变量
/********************************************************
函数名称:void display1()
函数作用:显示实际浓度值
参数说明:
********************************************************/
void display1()
{
uchar xq; //存储星期
xq=GetWeekDay(time[6],time[4],time[3]);//获取星期
//显示对应的星期
switch(xq)
{
case 1:lcd1602_write_character(11,1,"Mon"); break;
case 2:lcd1602_write_character(10,1,"Tues"); break;
case 3:lcd1602_write_character(9,1,"Wednes"); break;
case 4:lcd1602_write_character(10,1,"Thurs"); break;
case 5:lcd1602_write_character(10,1,"Frid"); break;
case 6:lcd1602_write_character(10,1,"Satur"); break;
case 7:lcd1602_write_character(11,1,"Sun"); break;
default: break;
}
//显示时间
LCD_disp_char(0,2,ASCII[time[2]/10]);//显示时【0:表示第1列,2:表示第2行,所有关于显示都一样】
LCD_disp_char(1,2,ASCII[time[2]%10]);
LCD_disp_char(2,2,':');
LCD_disp_char(3,2,ASCII[time[1]/10]);//显示分【3:表示第4列,2:表示第2行,所有关于显示都一样】
LCD_disp_char(4,2,ASCII[time[1]%10]);
LCD_disp_char(5,2,':');
LCD_disp_char(6,2,ASCII[time[0]/10]);//显示秒
LCD_disp_char(7,2,ASCII[time[0]%10]);
//显示日期
else
ALValue=ALValue-30;
LCD_disp_char(9,2,ASCII[ALValue/100]); //显示实际浓度值
LCD_disp_char(10,2,ASCII[ALValue%100/10]);
LCD_disp_char(11,2,ASCII[ALValue%10]);
文章借鉴于此纷传