(完整版)酒精浓度测试仪设计详解.doc

(完整版)酒精浓度测试仪设计详解.doc
(完整版)酒精浓度测试仪设计详解.doc

酒精浓度测试仪设计报告

目录

酒精浓度测试仪设计报告 (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 转换,与设定的醉酒阈值进行比较,并显示或报警。

MQ-3 传感器模块

MQ-3 气体传感器

信号调理电路

模拟电压信号

STC12C5A16AD 单片机

模/数转换

电压 /酒精浓度

转换

醉酒阈值

阈值比较外部 EEPROM

酒精浓度显示过阈报警

图 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 闭尺寸标注。

(3)载入网络表

PCB 文件,包括安装孔、禁的精确结构,且不可以形成封

①载入网表并排除所有载入问题,具体请看《PROTEL 技术大全》。其他软件载入问题有很多相似之处,可以借鉴。

②如果使用PROTEL ,网表须载入两次以上(没有任何提示信息)

才可以确认载入无误。

(4)布局

① 首先要确定参考点。

一般参考点都设置在左边和底边的边框线的交点(或延长线的交点)

上或印制板的插件的第一个焊盘。

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

推荐使用25MIL网格。

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

④ 布局的基本原则

A.遵循先难后易、先大后小的原则。

B.布局可以参考硬件工程师提供的原理图和大致的布局,根据信号

流向规律放置主要原器件。

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

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

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

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

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

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

(5)PCB 设计遵循的规则

① 地线回路规则:

图 11 地线回路规则

环路最小规则,即信号线与其回路构成的环面积要尽可能小,环面积

要尽可能小,环面积越小,对外的辐射越少,接收外界的干扰也越小。针

对这一规则,在地平面分割时,要考虑到地平面与重要信号走线的分布,

防止由于地平面开槽等带来的问题;在双层板设计中,在为电源留下足够

空间的情况下,应该将留下的部分用参考地填充,且增加一些必要的过孔,将双面信号有效连接起来,对一些关键信号尽量采用地线隔离,对一些频

率较高的设计,需特别考虑其地平面信号回路问题,建议采用多层板为宜。

② 窜扰控制

窜扰( CrossTalk )是指 PCB 上不同网络之间因较长的平行布线引起的

相互干扰,主要是由于平行线间的分布电容和分布电感的作用。克服窜扰的主要措施是:

A. 加大平行布线的间距,遵循3W 规则。

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

C.减少布线层与地平面的距离

③屏蔽保护

图 12屏蔽保护

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

④走线方向控制规则

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

⑤电源与地线层的完整性规则

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

四、软件编程

1、软件流程图

本设计软件主程序流程图如图13 所示。

数据初始化

定时器初始化

A/D 转换初始化

显示初始化

进入后台 while 循环触发 A/D 转换

换算酒精浓度

酒精浓度显示

超过阈值吗?是

报警

酒精浓度显示

有键按下吗?是

按键处理

图 13 主程序流程图

2、主程序

下面介绍 main.c 主程序编写,其他程序略。

(1)头文件和一些宏定义

#include //调用单片机头文件

#define uchar unsigned char // 无符号字符型宏定义变量范围0~255 #define uint unsigned int//无符号整型宏定义变量范围0~65535

#include

//#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

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) // 与校验数据比较,正确就返回数据,否则返回0

return value;

return 0;

}

/*************定时器 0 初始化程序 ***************/

void time_init()

{

EA = 1; // 开总中断

TMOD = 0X01; // 定时器 0、定时器 1 工作方式 1

ET0 = 1; // 开定时器 0 中断

TR0 = 1; // 允许定时器 0 定时

}

/****************按键处理显示函数***************/

void key_with()

{

if(key_can == 1)

{

s_dengji ++ ; // 酒精浓度设置数加 1

if(s_dengji > 999)

s_dengji = 999;

}

if(key_can == 2)

{

s_dengji -= 1; //酒精浓度设置数减 1

if(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; case 0x07: key_can = 1; break; // 得到

// 得到

k3

k4

键值

键值

}

}

}

else

key_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; init_eeprom(); //单片机 IO 口初始化为

//读 eeprom 数据

1

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; if(dengji < 0)

dengji = 0; dengji = dengji * 2;

// 首先减去零点漂移,一般是1V

//将 mV 转变成 mg/L ,系数需要校准

//电压每升高0.1V ,实际被测气体的浓度增加20ppm //1ppm=1mg/kg=1mg/L=1 × 10-6 常用来表示气体浓

度,或者溶液浓度。

write_sfm2(1,9,dengji);// 显示酒精浓度}

}

}

/*************定时器 0 中断服务程序***************/

void time0_int() interrupt 1

{

static uchar value;

TH0 = 0x3c;

TL0 = 0xb0;// 50ms

value ++;

if(value % 6 == 0)

{

flag_300ms = 1;//300ms

value = 0;

}

}

五、下载与调试

当程序在 uVision 环境下编写完成,并编译生成 .hex 文件后,就可以下载并

进行调试了。

1、USB 转串口驱动安装

打开 USB 驱动文件夹下的PL2303_Prolific_DriverInstaller_v130.exe 安装文件,按提示安装USB 转串口驱动程序。安装完成后,插入USB 下载线后,在[开始]-[ 控制面板]-[ 打印机和其他硬件]-[ 设备管理器],在“端口” 分支下有(Prolific USB-to-Serial Comm Port(COMX) 。X 表示串口号,如果没有说明USB 转串口驱动没有安装,须重新安装。记住括号里的 COM 口号。

图 14 成功安装 USB 转串口驱动示意图

相关主题
相关文档
最新文档