基于单片机的酒精浓度测试仪设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于单片机的酒精浓度测试仪
设计报告
一、设计意义
自《刑法修正案(八)》和修改后的《道路交通安全法》正式实施,“醉酒驾驶”正式入刑。
不仅交警部门,而且很多车主都期盼能够有便携仪器方便地测量气体酒精浓度,为安全驾驶提供保障,有效减少重大交通事故的发生。
本研究设计的酒精浓度测试仪是一款实用性强、安全可靠的气体乙醇浓度检测工具,采用高精度MQ-3乙醇气体传感器对空气中的乙醇浓度进行检测,利用宏晶公司高性能低成本单片机STC12C5A16AD对检测信号进行A/D转换和处理,最后通过液晶屏显示输出。
本研究设计的酒精浓度测试仪还具有醉酒阈值设定功能,可以根据法律法规或用户需要设定修改醉酒阈值,并进行保存。
二、硬件设计
1、设计框图
本研究设计的酒精浓度测试仪框图如图1所示。
MQ-3乙醇气体传感器输出信号经信号调理电路处理,输出随乙醇浓度变化的电压信号,该电压信号送入单片机系统,经AD转换,与设定的醉酒阈值进行比较,并显示或报警。
图1 酒精浓度测试仪方框图
2、乙醇信号检测及调理电路
MQ-3乙醇气体传感器可以应用用于机动车驾驶人员及其他严禁酒后作业人员的现场检测,也用于其他场所乙醇蒸汽的检测。
其技术特点为:
●对乙醇蒸汽有很高的灵敏度和良好的选择性
●快速的响应恢复特性
●长期的寿命和可靠的稳定性
●简单的驱动回路
MQ-3乙醇气体传感器灵敏度曲线如图2所示,其传感原理为气敏电阻的输出阻值随乙醇气体等浓度变化而变化。
MQ-3乙醇气体传感器管脚与测试电路如图3所示。
(a) 管脚图 (b) 测试电路
图3 MQ-3乙醇气体传感器管脚及测试电路
MQ-3乙醇气体传感器及其调理电路原理如图4所示。
其外形如图5所示。
经过调理,检测信号由电阻值转变成电压值,便于后续电路进行A/D转换和处理。
图4 传感器及调理模块原理图
图5 MQ-3传感器模块外形图
该传感器模块具有如下特点,方便与单片机系统接口组成检测仪器。
●具有信号输出指示。
●双路信号输出(模拟量输出及TTL电平输出)
●TTL输出有效信号为低电平。
(当输出低电平时信号灯亮,可直接接单片机)
●模拟量输出0~5V电压,浓度越高电压越高。
3、单片机电路
本设计选用宏晶公司高性能单片机STC12C5A16AD,其管脚如图6所示。
PDIP40, STC12C5A16AD
图6 STC12C2052AD单片机管脚图
该芯片为52内核8位单片机,内部集成了10位多路A/D转换模块,适用于常用检测电路。
由STC12C5A16AD组成的单片机系统原理图如图7所示。
图中AOUT 为MQ-3传感器模块输出的检测电压信号,送入ADC7端口进行处理,DOUT为传感器模块输出的数字电平信号,该信号可以根据乙醇气体浓度直接输出报警信号,报警阈值通过模块上的电位器进行调节。
图7 单片机系统原理图
图7中,按键K2和K3为醉酒阈值调整键,其中K2为“增加”,K3为“减小”按键。
L2和L3为报警指示灯,分别可以进行酒后和醉酒两级报警。
4、显示电路
显示部分采用SMC 1602液晶屏进行数据显示,其主要技术参数为:
表1 液晶屏技术指标
接口信号说明如表2所示。
表2 液晶屏接口信号说明
与单片机接口电路如图8所示。
其中J2的3脚为背光引脚,R9和R10电阻用于调节背光亮度。
J2的4、5、6引脚分别接液晶的RS、E/W和E控制引脚,J2的7—14引脚为数据引脚。
图8 LCD与单片机接口电路
5、阈值存储
醉酒阈值存储在EEPROM芯片AT24C04中,并可以通过“增加”、“减少”按键调节并保存。
AT24C04是IIC接口的EEPROM芯片,可以用于掉电不易失数据的存储。
其电路如图9所示。
图中A0、A1和A2为芯片的地址引脚,一般接地即可。
SCL和SDA为AT24C04和单片机IIC通信的时钟线和数据线。
图9 EEPROM存储电路
6、供电及程序下载电路
本设计采用USB接口供电,电源电压5V。
同时,USB接口通过内含PL2303芯片的转换电路对单片机进行程序编写。
其电路原理如图10所示。
图10 供电及程序下载电路
三、软件编程
1、软件流程图
本设计软件主程序流程图如图11所示。
图11 主程序流程图
2、主程序
下面介绍main.c主程序编写,其他程序略。
(1) 头文件和一些宏定义
#include "STC12c5A.h"
#include "1602.h"
#include "2402.h"
#define uchar unsigned char
#define uint unsigned int
(2) 常量、变量定义和函数声明
//声明常量
#define ALCH 80 //醉驾标准80mg/L
//K_MG_MV和K_ZERO为传感器校准系数,要根据每个MQ-3模块校准#define K_MG_MV 160/60 //传感器灵敏度系数,可以自行校准#define K_ZERO 0 //传感器零点漂移
//定义按键
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; //酒精转换计时器
int 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 );
(3) 各子程序
//数据初始化
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; //
}
//ADC初始化
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;
*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,"Welcome to ALCT! ");
L1602_string(2,1,"Designed by AAA ");
//延时
for (i=0;i<1000;i++)
for (j=0;j<1000;j++)
{;}
//清屏
L1602_string(1,1," ");
L1602_string(2,1," ");
L1602_string(1,1,"Alcohol: mg/L");
L1602_string(2,1,"Thresho: 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;
}
}
四、下载与调试
当程序在uVision环境下编写完成,并编译生成.hex文件后,就可以下载并进行调试了。
1、U SB转串口驱动安装
打开USB驱动文件夹下的PL2303_Prolific_DriverInstaller_v130.exe安装文件,按提示安装USB转串口驱动程序。
安装完成后,插入USB下载线后,在[开始]-[控制面板]-[打印机和其他硬件]-[设备管理器],在“端口”分支下有(Prolific USB-to-Serial Comm Port(COMX)。
X表示串口号,如果没有说明USB转串口驱动没有安装,须重新安装。
记住括号里的COM口号。
图12 成功安装USB转串口驱动示意图
2、下载程序
打开STC单片机下载软件文件夹,点击运行STC_ISP_V481.exe程序,出现如下界面。
图13 下载软件
正确选择MCU 类型,COM口(与刚才安装的COM号一致),最高波特率和最低波特率都选2400bps或者1200bps (下载线内PL2303芯片所限,没办法!),并打开正确的.hex数据文件。
点击“Download/下载”按纽,窗口出现提示:
Chinese:正在尝试与MCU/单片机握手连接...
Connection is failure. You can try:
1.Give your MCU Power On Reset.
2.Stop operation, then re-select COM Port.
3.Because PLCC-DIP/PQFP-DIP Socket trace too long.
4.Update the STC ISP.exe version.
5.If still error, your MCU Firmware is error
or null.
Chinese:连接失败,请尝试以下操作:
1.在单片机停电状态下,点下载按钮,再给单片机上电
2.停止下载,重新选择RS-232 串口, 接好电缆
3.可能需要先将P1.0/P1.1 短接到地
4.可能外部时钟未接
5.因PLCC、PQFP 转换座引线过长而引起时钟不振荡,请
调整参数
6.可能要升级电脑端的STC ISP.exe 软件
7.若仍然不成功,可能MCU/单片机内无ISP 系统引导码,
或需退回升级,或MCU 已损坏
8.若使用USB 转RS-232 串口线下载,可能会遇到不兼容
的问题,可以让我们帮助购买兼容的USB 转RS-232
串口线
仍在连接中, 请给MCU 上电...
按下电路板上的电源按纽,保证其有个失电至上电的过程,则窗口显示开始烧录芯片。
芯片烧录成功后,程序开始运行,酒精浓度测试仪正常工作。