好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

酒精浓度测试仪设计.doc

15页
  • 卖家[上传人]:cl****1
  • 文档编号:454105566
  • 上传时间:2023-01-15
  • 文档格式:DOC
  • 文档大小:1.85MB
  • / 15 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 酒精浓度测试仪设计报告一、 设计意义自《刑法修正案(八)》和修改后的《道路交通安全法》正式实施,“醉酒驾驶”正式入刑不仅交警部门,而且很多车主都期盼能够有便携仪器方便地测量气体酒精浓度,为安全驾驶提供保障,有效减少重大交通事故的发生本研究设计的酒精浓度测试仪是一款实用性强、安全可靠的气体乙醇浓度检测工具,采用高精度MQ-3乙醇气体传感器对空气中的乙醇浓度进行检测,利用宏晶公司高性能低成本单片机STC12C5A16AD对检测信号进行A/D转换和处理,最后通过液晶屏显示输出本研究设计的酒精浓度测试仪还具有醉酒阈值设定功能,可以根据法律法规或用户需要设定修改醉酒阈值,并进行保存二、 硬件设计1、设计框图本研究设计的酒精浓度测试仪框图如图1所示MQ-3乙醇气体传感器输出信号经信号调理电路处理,输出随乙醇浓度变化的电压信号,该电压信号送入单片机系统,经AD转换,与设定的醉酒阈值进行比较,并显示或报警图1 酒精浓度测试仪方框图2、乙醇信号检测及调理电路MQ-3乙醇气体传感器可以应用用于机动车驾驶人员及其他严禁酒后作业人员的现场检测,也用于其他场所乙醇蒸汽的检测其技术特点为:l 对乙醇蒸汽有很高的灵敏度和良好的选择性l 快速的响应恢复特性l 长期的寿命和可靠的稳定性l 简单的驱动回路MQ-3乙醇气体传感器灵敏度曲线如图2所示,其传感原理为气敏电阻的输出阻值随乙醇气体等浓度变化而变化。

      图2 MQ-3乙醇气体传感器灵敏度曲线MQ-3乙醇气体传感器管脚与测试电路如图3所示 (a) 管脚图 (b) 测试电路图3 MQ-3乙醇气体传感器管脚及测试电路 MQ-3乙醇气体传感器及其调理电路原理如图4所示其外形如图5所示经过调理,检测信号由电阻值转变成电压值,便于后续电路进行A/D转换和处理图4 传感器及调理模块原理图图5 MQ-3传感器模块外形图该传感器模块具有如下特点,方便与单片机系统接口组成检测仪器l 具有信号输出指示l 双路信号输出(模拟量输出及TTL电平输出)l TTL输出有效信号为低电平当输出低电平时信号灯亮,可直接接单片机) l 模拟量输出0~5V电压,浓度越高电压越高3、单片机电路本设计选用宏晶公司高性能单片机STC12C5A16AD,其管脚如图6所示图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=0xf8ccvoid 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-。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.