当前位置:文档之家› 酒精浓度测试仪设计详解

酒精浓度测试仪设计详解

酒精浓度测试仪设计报告目录酒精浓度测试仪设计报告 (1)一、设计意义 (3)二、硬件设计 (3)1、设计框图 (3)2、乙醇信号检测及调理电路 (4)3、单片机电路 (7)4、显示电路 (8)5、供电及程序下载电路 (9)三、Protel硬件开发软件 (10)1.Protel软件组成 (10)2.PCB板设计 (11)四、软件编程 (13)1、软件流程图 (13)2、主程序 (14)五、下载与调试 (20)1、USB转串口驱动安装 (20)2、下载程序 (21)参考文献 (22)程序 (22)一、设计意义自《刑法修正案(八)》和修改后的《道路交通安全法》正式实施,“醉酒驾驶”正式入刑。

不仅交警部门,而且很多车主都期盼能够有便携仪器方便地测量气体酒精浓度,为安全驾驶提供保障,有效减少重大交通事故的发生。

本研究设计的酒精浓度测试仪是一款实用性强、安全可靠的气体乙醇浓度检测工具,采用高精度MQ-3乙醇气体传感器对空气中的乙醇浓度进行检测,利用宏晶公司高性能低成本单片机STC89C52对检测信号进行A/D转换和处理,最后通过液晶屏显示输出。

本研究设计的酒精浓度测试仪还具有醉酒阈值设定功能,可以根据法律法规或用户需要设定修改醉酒阈值,并进行保存。

二、硬件设计1、设计框图本研究设计的酒精浓度测试仪框图如图1所示。

MQ-3乙醇气体传感器输出信号经信号调理电路处理,输出随乙醇浓度变化的电压信号,该电压信号送入单片机系统,经AD转换,与设定的醉酒阈值进行比较,并显示或报警。

图1 酒精浓度测试仪方框图2、乙醇信号检测及调理电路MQ-3乙醇气体传感器可以应用用于机动车驾驶人员及其他严禁酒后作业人员的现场检测,也用于其他场所乙醇蒸汽的检测。

其技术特点为:●对乙醇蒸汽有很高的灵敏度和良好的选择性●快速的响应恢复特性●长期的寿命和可靠的稳定性●简单的驱动回路主要技术指标:MQ-3乙醇气体传感器灵敏度曲线如图2所示,其传感原理为气敏电阻的输出阻值随乙醇气体等浓度变化而变化。

图2 MQ-3乙醇气体传感器灵敏度曲线MQ-3乙醇气体传感器管脚与测试电路如图3所示。

(a) 管脚图 (b) 测试电路图3 MQ-3乙醇气体传感器管脚及测试电路MQ-3乙醇气体传感器及其调理电路原理如图4所示。

其外形如图5所示。

经过调理,检测信号由电阻值转变成电压值,便于后续电路进行A/D转换和处理。

图4 传感器及调理模块原理图该传感器模块具有如下特点,方便与单片机系统接口组成检测仪器。

●具有信号输出指示。

●双路信号输出(模拟量输出及TTL电平输出)●TTL输出有效信号为低电平。

(当输出低电平时信号灯亮,可直接接单片机)●模拟量输出0~5V电压,浓度越高电压越高。

3、单片机电路本设计选用宏晶公司高性能单片机STC89C52,其管脚如图6所示。

图6 STC89C52单片机管脚图该芯片为52内核8位单片机,适用于常用检测电路。

由STC89C52组成的单片机系统原理图如图7所示。

图中AOUT为MQ-3传感器模块输出的检测电压信号,送入ADC0832采集芯片端口进行处理,该信号可以根据乙醇气体浓度直接输出报警信号,报警阈值通过模块上的电位器进行调节。

图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、供电及程序下载电路本设计采用电池盒接口供电,电源电压5V。

同时,其电路原理如图10所示。

图10 供电及程序下载电路三、Protel硬件开发软件Protel是目前国内最流行的通用EDA软件,它是将电路原理图设计、PCB板图设计、电路仿真和PLD设计等多个实用工具软件组合后构成的EDA工作平台,是第一个将EDA软件设计成基于Windows的普及型产品。

它集成了软件界面、仿真功能和PLD设计和信号完整性分析,在此基础上Protel 99SE又增加了一些新的功能,用户使用更加方便灵活。

Protel的功能十分强大,在电子电路设计领域占有极其重要的地位。

它以其强大功能和实用性,逐渐获得广大硬件设计人员的青睐,是目前众多EDA设计软件中用户最多的产品之一。

1.Protel软件组成Protel软件主要由电路原理图设计模块、印制电路板设计模块(PCB设计模块)、电路信号仿真模块和PLD逻辑器件设计模块等组成,各模块具有强大的功能,可以很好的实现电路设计与分析。

(1) 原理图设计模块(Schematic模块)电路原理图是表示电气产品或电路工作原理的重要技术文件,电路原理图主要由代表各种电子器件的图形符号、线路和结点组成。

图4.1所示为一张电路原理图。

该原理图是由Schematic模块设计完成的。

Schematic 模块具有如下功能:丰富而灵活的编辑功能、在线库编辑及完善的库管理功能、强大的设计自动化功能、支持层次化设计功能等。

(2) 印制电路板设计模块(PCB设计模块)印制电路板(PCB)制板图是由电路原理图到制作电路板的桥梁。

设计了电路原理图后,需要根据原理图生设计成印制电路板的制板图,然后在根据制板图制作具体的电路板。

印制电路板设计模块具有如下主要功能和特点:可完成复杂印制电路板(PCB)的设计;方便而又灵活的编辑功能;强大的设计自动化功能;在线式库编辑及完善的库管理;完备的输出系统等。

(3) 电路信号仿真模块电路信号仿真模块是一个功能强大的数字/模拟混合信号电路仿真器,能提供连续的模拟信号和离散的数字信号仿真。

它运行在Protel的EDA/Client集成环境下,与Protel Advanced Schematic原理图输入程序协同工作,作为Advanced Schematic的扩展,为用户提供了一个完整的从设计到验证仿真设计环境。

在Protel中进行仿真,只需从仿真用元器件库中放置所需的元器件,连接好原理图,加上激励源,然后单击防真按钮即可自动开始。

2.PCB板设计(1) 定元件的封装①打开网络表(可以利用一些编辑器辅助编辑),将所有封装浏览一遍,确保所有元件的封装都正确无误并且元件库中包含所有元件的封装,网络表中所有信息全部大写,一面载入出问题,或PCB BOM不连续。

②标准元件全部采用公司统一元件库中的封装。

③④⑥⑤元件库中不存在的封装,应自己建立元器件库。

(2) 建立PCB板框①根据PCB结构图,或相应的模板建立PCB文件,包括安装孔、禁布区等相关信息。

②尺寸标注。

在钻孔层中应标明PCB的精确结构,且不可以形成封闭尺寸标注。

(3) 载入网络表①载入网表并排除所有载入问题,具体请看《PROTEL技术大全》。

其他软件载入问题有很多相似之处,可以借鉴。

②如果使用PROTEL,网表须载入两次以上(没有任何提示信息)才可以确认载入无误。

(4) 布局①首先要确定参考点。

一般参考点都设置在左边和底边的边框线的交点(或延长线的交点)上或印制板的插件的第一个焊盘。

②一但参考点确定以后,元件布局、布线均以此参考点为准。

布局推荐使用25MIL网格。

③根据要求先将所有有定位要求的元件固定并锁定。

④布局的基本原则A. 遵循先难后易、先大后小的原则。

B. 布局可以参考硬件工程师提供的原理图和大致的布局,根据信号流向规律放置主要原器件。

C. 总的连线尽可能的短,关键信号线最短。

D. 强信号、弱信号、高电压信号和弱电压信号要完全分开。

E. 高频元件间隔要充分。

F. 模拟信号、数字信号分开。

⑤相同结构电路部分应尽可能采取对称布局。

⑥按照均匀分布、重心平衡、版面美观的标准来优化布局。

(5) PCB设计遵循的规则①地线回路规则:图11 地线回路规则环路最小规则,即信号线与其回路构成的环面积要尽可能小,环面积要尽可能小,环面积越小,对外的辐射越少,接收外界的干扰也越小。

针对这一规则,在地平面分割时,要考虑到地平面与重要信号走线的分布,防止由于地平面开槽等带来的问题;在双层板设计中,在为电源留下足够空间的情况下,应该将留下的部分用参考地填充,且增加一些必要的过孔,将双面信号有效连接起来,对一些关键信号尽量采用地线隔离,对一些频率较高的设计,需特别考虑其地平面信号回路问题,建议采用多层板为宜。

②窜扰控制窜扰(CrossTalk)是指PCB上不同网络之间因较长的平行布线引起的相互干扰,主要是由于平行线间的分布电容和分布电感的作用。

克服窜扰的主要措施是:A.加大平行布线的间距,遵循3W规则。

B.在平行线间插入接地的隔离线。

C.减少布线层与地平面的距离③屏蔽保护图12 屏蔽保护对应地线回路规则,实际上也是为了尽量减小信号的回路面积,多用于一些比较重要的信号,如时钟信号,同步信号;对一些特别重要,频率特别高的信号,应该考虑采用铜轴电缆屏蔽结构设计,即将所布的线上下左右用地线隔离,而且还要考虑好如何有效的让屏蔽地与实际地平面有效结合。

④走线方向控制规则相邻层的走线方向成正交结构,避免将不同的信号线在相邻层走成同一方向,以减少不必要的层间窜扰;当由于板结构限制(如某些背板)难以避免出现该情况,特别是信号速率较高时,应考虑用地平面隔离各布线层,用地信号线隔离各信号线。

⑤电源与地线层的完整性规则对于导通孔密集的区域,要注意避免孔在电源和地层的挖空区域相互连接,形成对平面层的分割,从而破坏平面层的完整性,并进而导致信号线在地层的回路面积增大。

四、软件编程1、软件流程图本设计软件主程序流程图如图13所示。

图13 主程序流程图2、主程序下面介绍main.c主程序编写,其他程序略。

(1)头文件和一些宏定义#include <reg52.h> //调用单片机头文件#define uchar unsigned char //无符号字符型宏定义变量范围0~255 #define uint unsigned int //无符号整型宏定义变量范围0~65535#include <intrins.h>//#include "lcd1602.h"sbit CS=P2^4; //CS定义为P2口的第4位脚,连接ADC0832CS脚sbit SCL=P2^3; //SCL定义为P2口的第3位脚,连接ADC0832SCL脚sbit DO=P2^2; //DO定义为P2口的第4位脚,连接ADC0832DO脚sbit beep = P3^2; //蜂鸣器IO口定义long dengji,s_dengji = 50; //酒精等级bit flag_300ms ;uchar key_can; //按键值的变量uchar menu_1; //菜单设计的变量uchar flag_clock;#include "eeprom52.h"#include "lcd1602.h"/***********************1ms延时函数*****************************/ void delay_1ms(uint q){uint i,j;for(i=0;i<q;i++)for(j=0;j<120;j++);}/******************把数据保存到单片机内部eeprom中******************/ void write_eeprom(){SectorErase(0x2000);// byte_write(0x2000, s_dengji);byte_write(0x2001, s_dengji);byte_write(0x2060, a_a);}/******************把数据从单片机内部eeprom中读出来*****************/ void read_eeprom(){// s_dengji = byte_read(0x2000);s_dengji = byte_read(0x2001);a_a = byte_read(0x2060);}/**************开机自检eeprom初始化*****************/void init_eeprom(){read_eeprom(); //先读if(a_a != 2) //新的单片机初始单片机内问eeprom{s_dengji = 80;a_a = 2;write_eeprom();}}/***********读数模转换数据********************************************************///请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的// 1 0 0 通道// 1 1 1 通道unsigned char ad0832read(bit SGL,bit ODD){unsigned char i=0,value=0,value1=0;SCL=0;DO=1;CS=0; //开始SCL=1; //第一个上升沿SCL=0;DO=SGL;SCL=1; //第二个上升沿SCL=0;DO=ODD;SCL=1; //第三个上升沿SCL=0; //第三个下降沿DO=1;for(i=0;i<8;i++){SCL=1;SCL=0; //开始从第四个下降沿接收数据value<<=1;if(DO)value++;}for(i=0;i<8;i++){ //接收校验数据value1>>=1;if(DO)value1+=0x80;SCL=1;SCL=0;}CS=1;SCL=1;if(value==value1) //与校验数据比较,正确就返回数据,否则返回0return value;return 0;}/*************定时器0初始化程序***************/void time_init(){EA = 1; //开总中断TMOD = 0X01; //定时器0、定时器1工作方式1ET0 = 1; //开定时器0中断TR0 = 1; //允许定时器0定时}/****************按键处理显示函数***************/void key_with(){if(key_can == 1){s_dengji ++ ; //酒精浓度设置数加1if(s_dengji > 999)s_dengji = 999;}if(key_can == 2){s_dengji -= 1; //酒精浓度设置数减1if(s_dengji <= 1)s_dengji = 1 ;}write_sfm2(2,9,s_dengji); //显示酒精等级write_eeprom(); //保存数据}/********************独立按键程序*****************/uchar key_can; //按键值void key() //独立按键程序{static uchar key_new;key_can = 20; //按键值还原P1 |= 0x0f;if((P1 & 0x0f) != 0x0f) //按键按下{delay_1ms(1); //按键消抖动if(((P1 & 0x0f) != 0x0f) && (key_new == 1)){ //确认是按键按下key_new = 0;switch(P1 & 0x0f){case 0x0b: key_can = 2; break; //得到k3键值case 0x07: key_can = 1; break; //得到k4键值}}}elsekey_new = 1;}/****************报警函数***************/void clock_h_l(){static uchar value;if(dengji >= s_dengji ) //报警{value ++;if(value >= 2){value = 10;beep = ~beep; //蜂鸣器报警}}else{if(dengji < s_dengji) //取消报警{value = 0;beep = 1;}}}/***************主函数*****************/void main(){beep = 0; //开机叫一声delay_1ms(150);P0 = P1 = P2 = P3 = 0xff; //单片机IO口初始化为1init_eeprom(); //读eeprom数据time_init(); //初始化定时器init_1602();while(1){key(); //独立按键程序if(key_can < 10){key_with(); //按键按下要执行的程序}if(flag_300ms == 1){flag_300ms = 0;clock_h_l(); //报警函数dengji = ad0832read(1,0);dengji = dengji * 450 / 255.0;dengji = dengji - 130; //首先减去零点漂移,一般是1Vif(dengji < 0)dengji = 0;dengji = dengji * 2; //将mV转变成mg/L,系数需要校准//电压每升高0.1V,实际被测气体的浓度增加20ppm//1ppm=1mg/kg=1mg/L=1×10-6 常用来表示气体浓度,或者溶液浓度。

相关主题