博主主页:单片机辅导设计
博主简介:专注单片机技术领域和毕业设计项目。
主要内容:毕业设计、简历模板、学习资料、技术咨询。
文章目录
主要介绍
目前,大多数国家采用呼气式酒精浓度检测仪来检测驾驶员血液中的酒精含量。在本课题中使用MQ-3酒精传感器采集数据,经过STM32单片机处理,通过LCD1602液晶屏显示输出。最后通过现场模拟测试,发现检测仪不仅能实现酒精浓度的准确测量,当驾驶员血液中的酒精含量超过标准值时能够及时报警提醒交警。本设计具有测量精确度高,成本低等优点,具有一定的实用价值。
关键词:呼气式酒精浓度检测,MQ-3酒精传感器,声光报警
一、系统需求分析
2.1本课题的设计要求
参考酒精浓度检测仪的国家规范标准,设计出酒精浓度检测的系统模块,通过驾驶员吹出的气体准确地检测出
是否饮酒以及饮酒程度的情况;并且能够在LCD1602液晶显示屏上实时显示相关信息;在检测出驾驶员饮酒违规驾驶
时蜂鸣器能给出声音报警提示。具体功能如下所示:
(1)系统上电后,按下开关按钮能自动进行检测功能;
(2)酒精浓度的检测与LCD1602液晶屏的显示功能;
(3)通过按键设置报警数值的功能;
(4)报警、声光提醒的功能。
2.2课题的主要研究内容
通过了解我国现有的酒精浓度检测技术现状和传感器的使用情况,本课题选用MQ-3酒精传感器设计酒精测试电路以及信号调理电路,实现对传感器信号的采集、处理,显示报警等功能。
主要的研究内容如下:
(1)分析MQ-3酒精传感器的工作原理,设计系统整体框架。
(2)设计硬件电路。设计传感器信号调理电路、STM32最小系统、液晶显示模块、按键电路、声光报警电路等。
(3)设计酒精浓度检测系统模块的软件程序,实现信号的采集、处理,对检测结果进行实时显示;将测得的酒精浓度数值与设定的报警界限值进行比较,若超过限定值,则会发出报警提示测试者血液中的酒精含量超标。
(4)将设计的酒精浓度检测装置进行现场模拟实验,并根据GA307技术参数的要求,对相应酒精浓度段的示值误差分析;对测试过程中的遇到的问题进行分析并提出解决方案。
2.3检测仪系统的基本功能
目前,各国对呼气式酒精浓度检测仪的使用多为交通管理部门,呼气式酒精浓度检测仪为判断驾驶员是否饮酒提供了法律依据。根据《车辆驾驶人员血液、呼气酒精含量阈值与检验》中的结论是:驾驶人员血液中的酒精含量大于或者等于20mg/100mL,小于80mg/100mL为饮酒驾驶;驾驶人员血液中的酒精含量大于等于80mg/100mL为醉酒驾驶。所以在市场上,酒精浓度检测仪的测量范围必须包含20-80mg/100mL。为了满足常见的应用需求,本课题制作的酒精浓度检测仪测量范围为0-400mg/100mL。且满足GA307-2001要求的呼气式酒精含量检测仪[10]。
根据GA307-2001行业标准中对呼出气体酒精浓度检测装置的有关要求,结合实际使用情况,将其功能划分为:基础功能和辅助功能。其中基础功能包括:测量功能,检测呼出气体中的酒精浓度,计算出血液中的酒精含量;显示功能,主要是显示测试的酒精浓度数值;报警功能,当测量数值大于报警阈值时,蜂鸣器会发出警报声。辅助功能包括:通过按键调整报警阈值,报警时伴有灯光提醒。
三、 系统总体方案
4.1系统结构设计
鉴于我国对酒驾的监控和检测方法,本系统的目标是针对驾驶员进行酒精检测,具有功耗低、安装方便、使用灵活、自动化检测等特点。同时考虑到我国仍是一个发展中国家,因此本系统的设计定位于低成本,主要有酒精浓度检测、液晶显示、声光报警提醒、按键可设置报警数值等功能,所选取的元器件既要保证经济耐用又要具备稳定的工作性能。系统的功能结构如图 2.5 所示。
在硬件设计中,为了使硬件电路的设计合理可靠,在借鉴他人的成功经验之上,着重从以下几个方面来进行:
1.为了保证系统的可靠性,应尽量选用传统的标准电路,尽量选用具有较强性能的芯片,同时要有较高的集成度。
2.系统在保证现有功能正常工作的同时,要适当地保留一些功能模块的扩展空间,以便日后系统增加其它方面的功能的拓展。
3.随着电子技术的飞速发展,因此在设计时尽可能地采用一些最新的技术。
图2.5 酒精检测仪系统总设计框图
四、系统的硬件设计
3.1系统的整体设计
本酒精浓度检测系统采用MQ-3酒精传感器对被测者呼气中的酒精含量进行测量,通过信号调理电路将其输入到STM32单片机,由该单片机完成对信号的处理。当检测到呼气中有含有酒精蒸气,LCD1602液晶显示屏就会显示出相应的酒精含量,若检测到的酒精浓度数值大于报警阈值时,蜂鸣器发出警报声。在系统的设计中,考虑到酒精浓度检测仪日后可能有扩展功能的需求和模块化的设计理念,所以本设计将其分成STM32最小系统、信号调节电路、MQ-3酒精感应器模块、 LCD1602液晶显示模块、声光报警电路、按键设置电路。
首先将测量结果存入FLASH和RAM,便于使用者在必要时利用主程序读取数据;其次,根据检测到的信息,设计一个报警系统,在判定司机是酒后驾驶时,会发出声音和灯光警告。在系统的设计中,由于检测仪将来可能会有扩展功能的需要,所以按照仪器的功能需要,将整个系统分成几个独立的模块进行单独的设计。因此,本文的设计重点如下:
(1)STM32核心板系统。STM32的工作需要晶振电路,复位电路,电源电路等基础电路,而核心板系统则是控制和管理各种工作的核心。核心系统为系统的启动和运行提供了稳定、可靠的支撑。
(2)酒精传感器浓度检测模块。本系统包含了酒精信号的采集、预处理、运算和显示等功能。本装置首先利用空气管收集气体,然后将其输入MQ-3酒精传感器,对其进行检测;然后经过信号处理电路滤波放大,得到一个较好的信号,然后送到单片机;利用STM32F103C8T6芯片内置 A/D转换,并编写了相应的程序,并对其进行了计算;将所测得的酒精浓度值换算成血液中的酒精含量数值通过LCD1602液晶显示屏显示输出。
(3)声光报警模块。如果检测到的酒精浓度值大于等于报警阈值,蜂鸣器就会发出警报声。在酒精浓度未超过报警阈值的情况下,此装置将不会启动,而LCD1602液晶屏幕上将检测到的酒精浓度值显示出来。
(4)按键设置模块。通过按键控制,可调整报警时的标准值。
系统框图如上图2.5所示,包含STM32最小系统,电源模块,LCD1602液晶显示模块,MQ-3酒精传感器及信号调理电路模块,报警电路及其他辅助电路模块。
3.2控制器的电路设计
3.2.1 微控制器的选型与介绍
本课题采用STM32F103C8T6作为核心微控制器,其具有高性能、低功耗、低成本等优点,是一个32位基于ARM核心的带闪存、USB、CAN的微控制器,芯片内具有2个12位的ADC、7个定时器、9个通信接口,工作频率为72MHz,在同类同级别产品中性能最高,能实现高级别的运算,采用48脚的封装形式(如图3.1)。
图3.1 STM32F103C8T6管脚图
STM32F103C8T6适用于多种应用场合:电机驱动和应用控制、医疗和手持设备、PC外设和GPS平台、工业应用、报警系统、视频对讲、暖气通风空调系统等[15]。STM32F103C8T6具体功能如下所示:
1.核心
(1)ARM32位的CortexTM-M3CPU;
(2)2MHz,高达90DMips,1.25DMips/MHz;
(3)单周期硬件乘法和除法。
2.存储器
(1)从32K至128K字节闪存程序存储器;
(2)从6K字节至20K字节SRAM;
3.时钟、复位和供电管理
(1)2.0至3.6V供电和I/O管脚;
(2)上电/断电复位(POR/PDR);
(3)内嵌4至16MHz高速晶体振荡器、经出厂调校的8MHz的RC振荡器、40kHz的RC振荡器。
4.低功耗
(1)3种省电模式:睡眠、停机和待机模式;
(2)VBAT为RTC和后备寄存器供电。
5.两个12位模数转换器,1us转换时间(16通道)
(1)转换范围是0至3.6V;
(2)双采样和保持功能;
(3)温度传感器。
6.调试模式
(1)串行线调试(SWD)和JTAG接口。
7.DMA
(1)7通道DMA控制器;
(2)支持的外设:定时器、ADC、SPI、I2C和USART。
8.多达80个快速I/O口
(1)26/36/51/80个多功能双向5V兼容的I/O口;
(2)所有I/O口可以映像到16个外部中断。
9.多达7个定时器
(1)多达3个同步的16位定时器,每个定时器有多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道;
(2)16位6通道高级控制器定时器;
(3)两个看门狗定时器(独立的和窗口型的);
(4)系统时间定时器:24位的、带自动加载功能的。
10. 多达9个通信接口
(1)多达2个I2C接口(SMBus/PMBus);
(2)多达3个USART,支持ISO7816,LIN,IrDA接口和调制解调控制;
(3)多达2个SPI同步串行接口(18兆位/秒);
(4)CAN接口(2.0B主动);
(5)USB2.0全速接口。
酒精检测仪总电路设计
图3.13 酒精检测仪总设计电路图
系统总硬件电路设计见图3.13所示。在图中主要包括STM32F103C8T6单片机、MQ-3酒精传感器模块、LCD1602液晶显
示模块、蜂鸣器报警电路、按键设置报警阈值电路和电源接口电路。
PCB板设计
PCB板的设计过程首先定元件的封装,接着建立PCB板框,再载入网络表;最后完成布局。本酒精浓度检测系统
的PCB板设计见图3.14所示。PCB板设计应遵循以下规则:
(1)地线回路规则;
(2)窜扰控制规则;
(3)屏蔽干扰保护规则;
(4)走线方向的控制规则;
(5)电源与地线层的完整性规则。
图3.14 PCB板设计
程序
#include "SysTick.h"
#include "adc.h"
#include "lcd1602.h"
#include "flash.h"
#define key3 PBin(13) //按键定义
#define key2 PBin(14) //按键定义
#define key1 PBin(15) //按键定义
#define beep PBout(8) //蜂鸣器的定义
u8 menu_1; //菜单设计的变量
u16 flag_300ms ;
long jiujing,jiujing_h; //酒精
void beep_Init() //蜂鸣器引脚初始化配置
{
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //开时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; //定义控制脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //50M速度
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
//按键初始化函数
void KEY_Init() //按键引脚初始化配置
{
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //开时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //配置IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //选择IO接口工作方式 //上拉电阻输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(GPIOB,&GPIO_InitStructure); /* 初始化GPIO */
}
/***************独立按键程序**************/
u8 key_can; //按键值
void key() //独立按键程
{
key_can = 0; //按键值还原
25
if(key1 == 0 || key2 == 0 || key3 == 0) //有按键按下
{
delay_ms(1); //延时消抖
if(key1 == 0)
key_can = 1;
if(key2 == 0)
key_can = 2;
if(key3 == 0)
key_can = 3;
}
}
/****************按键处理显示函数***************/
void key_with()
{
if(key_can == 1) //设置键
{
menu_1 ++;
if(menu_1 > 1)
{
menu_1 = 0;
write_lcd3(2,7,jiujing_h); //显示酒精等级
}
}
if(menu_1 == 1) //设置酒精报警
{
if(key_can == 2)
{
jiujing_h ++ ; //酒精报警值加1
if(jiujing_h >= 999)
jiujing_h = 999;
}
if(key_can == 3)
{
jiujing_h --; //酒精报警值减1
if(jiujing_h <= 1)
jiujing_h = 1;
}
write_lcd3(2,7,jiujing_h); //显示酒精等级
write_com(0x80+0x40+6); //将光标移动到第2行第到6位
write_com(0x0f); //显示光标并且闪烁
FLASH_W(FLASH_START_ADDR,jiujing_h);// 保存数据
}
delay_ms(150);
}
/****************报警函数***************/
void clock_h_l()
{
26
if(jiujing >= jiujing_h) //报警
{
beep = ~beep; //蜂鸣器报警
}else
{
beep = 1;
}
}
int main()
{
SysTick_Init(72);
beep_Init(); //蜂鸣器引脚初始化配置
lcd1602_Init(); //1602液晶引脚初始化配置
KEY_Init();//按键引脚初始化配置
beep = 0; //开机蜂鸣器响一声
delay_ms(300);
beep = 1;
Adc_Init(); //ADC初始化
jiujing_h = FLASH_R(FLASH_START_ADDR);//从指定页的地址读FLASH
init_1602(); // 液晶显示初始化
while(1)
{
key(); //独立按键程
key_with(); //按键按下要执行的程序
flag_300ms ++;
if(flag_300ms >= 300)
{
flag_300ms = 0;
jiujing=Get_Adc_Average(ADC_Channel_8,10); //读取湿度
jiujing = jiujing * 999 / 4096;
write_lcd3(1,7,jiujing); //显示酒精
clock_h_l(); //报警函数
}
delay_ms(1);
}
}
五、结论
1.首先阐述了本课题的研究意义,其次介绍了酒精浓度检测仪的国内外研究现状和相应技术的发展趋势,最后通过比较提出了一个符合本课题的设计要求。
2.介绍了检测仪系统的基本功能,系统所需要的传感器设备以及设计中的技术指标,最后给出了本系统结构设计框架。
3.重点设计了系统的软硬件部分,在阅读大量文献后,选择STM32F103C8T6作为核心控制器;再介绍了MQ-3酒精传感器模块,液晶显示模块,声光报警模块,按键电路模块等各个模块硬件电路设计;最后给出本系统的总设计电路。在硬件设计初期,MQ-3型酒精感应器一开始并不会使用,后来参考技术手册资料进行了调试;一开始正、负极反接,无输出信号,询问售后调节接法,就能得到模拟电压信号。软件方面的设计,主要是针对各个模块的编程,因为 C语言的基础比较差,所以在网上搜索了一些常用的程序,遇到不懂的问题,可以向同学们请教,最终完成了系统的编程。
目录
目 录
摘 要 I
ABSTRACT II
目 录 III
第一章 绪 论 1
1.1本课题研究的意义 1
1.2国内外研究现状和相应技术的发展趋势 1
1.3本课题的设计要求 3
1.4课题的主要研究内容 3
第二章 检测仪系统总体方案设计 5
2.1 检测仪系统的基本功能 5
2.2系统所需传感器设备 5
2.3设计中的技术指标 7
2.4系统结构设计 8
2.5本章小结 8