基于单片机的酒精测试仪设计.docx
《基于单片机的酒精测试仪设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的酒精测试仪设计.docx(24页珍藏版)》请在冰豆网上搜索。
基于单片机的酒精测试仪设计
Documentserialnumber【KK89K-LLS98YT-SS8CB-SSUT-SST108】
基于单片机的酒精测试仪设计
第一章研究内容
TGS822对酒精浓度的变化,其阻值产生相应的变化,然后通过取样电阻分压的变化表现出来;人体血液酒精浓度的不同,其呼出的气体中酒精浓度也不同。
通过TGS822对呼出气体中酒精浓度的反应以取样电压的形式送入到ADC0809,进行A/D转换后并将转换的数据送入单片机进行分析处理,并判断是否醉酒驾车,再通过液晶板显示出来。
DS18B20其自身的温度传感器所产生的温度数字数据存入其自身的存储器,单片机对其控制读出温度数据,然后经过计算处理,将当前环境温度由液晶板输出。
第2章总体设计
本课题的设计任务及要求
设计任务
设计并制作酒精测试仪,其组成如图所示。
TGS822对酒精浓度的变化,其阻值产生相应的变化,然后通过取样电阻分压的变化表现出来;人体血液酒精浓度的不同,其呼出的气体中酒精浓度也不同。
通过TGS822对呼出气体中酒精浓度的反应以取样电压的形式送入到ADC0809,进行A/D转换后并将转换的数据送入单片机进行分析处理,并判断是否醉酒驾车,再通过液晶板显示出来。
DS18B20其自身的温度传感器所产生的温度数字数据存入其自身的存储器,单片机对其控制读出温度数据,然后经过计算处理,将当前环境温度由液晶板输出。
图系统设计方框图
设计要求
(1)传感器TGS822的电压模拟输出范围为0-5V;
(2)模数转换芯片ADC0809采样电压范围为0-5V,分辨率为8位,采样精度为5/256V,达到256个量化级的数字电压,其工作频率为1MHz;
(3)单片机AT89C52工作频率为6MHz;
(4)LCD显示器用50K的可调电阻调节使其清晰显示,消除“鬼影”。
系统整机原理图分析
如图系统整机原理图,本系统工作原理如下:
单片机的晶振为6MHz,可以直接通过ALE口输出1MHz为ADC0809作为工作时钟而不需要进行分频,然后通过单片机的、分别控制ADC0809的ALE和START端口进行模数转换;通过、、分别控制ADDB、ADDC、ADDA端口进行选择模拟数据输入口;通过P0口进行ADC0809数据输出。
TGS822的采样电压由ADC0809的IN0口输入,通过转换后由其D0-D7输出到单片机的P0口,然后通过传感器的特性公式计算由P1口将数据通过LCD的DB0-DB7输出。
第3章系统硬件设计
系统硬件设计原理图分析
本硬件由五部分组成:
单片机模块,模数转换模块,酒精传感器模块,温度传感模块。
其系统硬件设计原理图如图所示,其整机工作原理如下,本系统由单片机AT89C2控制,其直接控制三个模块:
数转换模块将酒精传感器采集到模拟电压信号转换成输送到单片机控制处理,温度传感器DS18B20可以将采集到的温度信号直接以数字信号的形式传到单片机,LCD显示模块可以将经过单片机处理过的酒精气体浓度和温度的具体量化值显示。
图系统硬件设计原理图
单片机模块
单片机的选择
AT89S52是低功耗、高性能、采用CMOS工艺的8位单片机,其片内具有8KB的可在线编程的Flash存储器。
该单片机采用了ATMEL公司的高密度、非易失性存储器技术,与工业标准型80C51单片机的指令系统和引脚完全兼容;片内的Flash存储器可在线重新编程,或者使用通用的非易失性存储器编程;通用的8位CPU与在线可编程Flash集成在一块芯片上,从而使AT89S52功能更加完善,应用更加灵活;具有较高的性能价格比,使其在嵌入式控制系统中有着广泛的应用前景。
MCS单片机都采用40引脚的双列直插封装方式。
下图为引脚排列图,40条引脚说明如下:
1.主电源引脚Vss和Vcc
(1)Vss接地
(2)Vcc正常操作时为+5伏电源
2.外接晶振引脚XTAL1和XTAL2
(1)XTAL1内部振荡电路反相放大器的输入端,是外接晶体的一个引脚。
当采用外部振荡器时,此引脚接地。
(2)XTAL2内部振荡电路反相放大器的输出端。
是外接晶体的另一端。
当采用外部振荡器时,此引脚接外部振荡源。
3.控制或与其它电源复用引脚RST/VPD,ALE/和/Vpp
(1)RST/VPD当振荡器运行时,在此引脚上出现两个机器周期的高电平(由低到高跳变),将使单片机复位在Vcc掉电期间,此引脚可接下图8051引脚排列图上备用电源,由VPD向内部提供备用电源,以保持内部RAM中的数据。
(2)ALE/正常操作时为ALE功能(允许地址锁存)提供把地址的低字节锁存到外部锁存器,ALE引脚以不变的频率(振荡器频率的)周期性地发出正脉冲信号。
因此,它可用作对外输出的时钟,或用于定时目的。
但要注意,每当访问外部数据存储器时,将跳过一个ALE脉冲,ALE端可以驱动(吸收或输出电流)八个LSTTL电路。
对于EPROM型单片机,在EPROM编程期间,此引脚接收编程脉冲(功能)。
(3)外部程序存储器读选通信号输出端,在从外部程序存储取指令(或数据)期间,在每个机器周期内两次有效,同样可以驱动八LSTTL输入。
(4)/Vpp、/Vpp为内部程序存储器和外部程序存储器选择端。
当/Vpp为高电平时,访问内部程序存储器,当/Vpp为低电平时,则访问外部程序存储器。
对于EPROM型单片机,在EPROM编程期间,此引脚上加21伏EPROM编程电源(Vpp)。
4、输入/输出引脚-,-,-,-。
(1)P0口(-)是一个8位漏极开路型双向I/O口,在访问外部存储器时,它是分时传送的低字节地址和数据总线,P0口能以吸收电流的方式驱动八个LSTTL负载。
(2)P1口(-)是一个带有内部提升电阻的8位准双向I/O口。
能驱动(吸收或输出电流)四个LSTTL负载。
(3)P2口(-)是一个带有内部提升电阻的8位准双向I/O口,在访问外部存储器时,它输出高8位地址。
P2口可以驱动(吸收或输出电流)四个LSTTL负载。
(4)P3口(-)是一个带有内部提升电阻的8位准双向I/O口。
能驱动(吸收或输出电流)四个LSTTL负载。
模数转换器模块
ADC0809性能的介绍
模数转换电路的功能是将连续变化的模拟量转换为离散的数字量,是架起模拟系统跟数字系统之间连接的桥梁。
对于本系统而言,就是用于快速、高精度地对输入的酒精浓度信号进行采样编码,将其转换成单片机所能够处理的数字量。
模数转换电路是本系统的关键部分,其性能的好坏直接影响整个系统的质量。
根据A/D转换器的工作原理可将A/D转换器分成两大类:
一类是直接型A/D转换器;另一类是间接型A/D转换器。
在直接型A/D转换器中,输入的模拟电压被直接转换成数字代码,不经任何中间变量。
在间接型A/D转换器中,首先把输入的模拟电压转换成某种中间变量(时间、频率、脉冲宽度等等),然后再把这个中间变量转换为数字代码输出。
1.主要特性
(1)8路8位A/D转换器,即分辨率8位。
(2)具有转换起停控制端。
(3)转换时间为100μs。
(4)单个+5V电源供电。
(5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
(6)工作温度范围为-40~+85摄氏度。
(7)低功耗,约15mW。
2.内部结构
ADC0809由4部分逻辑结构构成,如图所示。
ADC0809是CMOS单片型逐次逼近式A/D转换器,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型D/A转换器、逐次逼近寄存器、三态输出锁存器等其它一些电路组成。
因此,ADC0809可处理8路模拟量输入,且有三态输出能力,既可与各种微处理器相连,也可单独工作。
输入输出与TTL兼容。
3.外部特性(引脚功能)
ADC0809芯片有28条引脚,采用双列直插式封装,如图所示。
下面说明各引脚功能。
IN0~IN7:
8路模拟量输入端。
2-1~2-8:
8位数字量输出端。
ADDA、ADDB、ADDC:
3位地址输入线,用于选通8路模拟输入中的一路。
ALE:
地址锁存允许信号,输入,高电平有效。
START:
A/D转换启动信号,输入,高电平有效。
EOC:
A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:
数据输出允许信号,输入,高电平有效。
当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:
时钟脉冲输入端。
要求时钟频率不高于640KHZ。
REF(+)、REF(-):
基准电压。
Vcc:
电源,单~+5V。
GND:
地。
4.ADC0809的工作原理
ADC0809的工作过程是:
首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
图ADC0809系统内部结构框图和外部引脚图
酒精传感器模块
性能分析
TGS822气体传感器的敏感材料是金属氧化物,最具代表性的是SnO2。
金属氧化物晶体如SnO2在空气中被加热到一定高的温度时,氧被吸附在的带一个负电荷的晶体表面。
然后,晶体表面的供与电子被转移到吸附的氧上,结果在一个空间电荷层留下正电荷。
这样,表面势能形成一个势垒,从而阻碍电子流动。
在传感器的内部,电流流过SnO2微晶的结合部位(晶粒边界)。
在晶粒边界,吸附的氧形成一个势垒阻止载流子自由移动,传感器的电阻即缘于这种势垒。
还原性气体出现时,带有负电荷的氧的表面浓度降低,导致晶粒边界的势垒降低。
降低了的势垒使传感器的阻值减小了。
传感器阻值和还原性气体浓度之间的关系可由下面的一定范围气体浓度方程表示:
Rs=A[C]-α
这里:
Rs=传感器电阻A=常数[C]=气体浓度α=Rs曲线的斜率
费加罗气体传感器的气敏素子,使用在清洁空气中电导率低的SnO2。
当存在检知对象气体时,传感器的电导率随空气中气体浓度增加而增大。
使用简单的电路即可将电导率的变化,转换为与该气体浓度相对应的输出信号。
TGS822传感器对酒精、有机溶剂灵敏度高,在酒精检测器等方面得到广泛使用。
相同特性的TGS823,采用了陶瓷底座,可以在200℃的高温气氛中使用。
表TGS822性能参数一览表
型号
素子类型
TGS822
8系列
标准封装
对象气体
塑料、SUS双重金属网
酒精、有机溶剂
检测范围
50—5000ppm
标准回路
条件
标准试验条件下的电学特性
加热器电压
VH
+DC/AC
回路电压
VC
MAX24V
Ps≤15mw
负载电压
加热器电压
RL
RH
可变
Ps≤15mw
38+(室温)
加热器功率
PH
660+50mwVH=
传感器电阻
RS
300ppm乙醇中1-10k
灵敏度(Rs的变化率)
+
Rs(EtOH:
300ppm)
Rs(EtOH:
50ppm)
标准试验
条件
试验气体条件
回路条件
20+2℃,65+5%RH
VC=+DC/AC
VH=+DC/AC
预热条件
七天以上
感器电阻比(Rs/Ro)表示,这里的Rs,Ro定义如下:
Rs=含300ppm乙醇、各种温/湿度下的电阻值
Ro=含300ppm乙醇、20℃65%.下的电阻值
表血液与呼气酒精含量换算一览表
序号
呼出气体中酒精
浓度mg/L
呼出气体中酒精
浓度10ˉ6
血液中酒精
浓度mg/100mL
1
5
2
10
3
15
4
20
5
25
6
30
7
35
8
40
9
45
10
50
11
55
12
60
13
65
14
70
15
75
16
80
17
85
18
90
19
95
20
100
21
150
22
200
车辆驾驶人员血液中的酒精含量大于或等于80mg/100ml的驾驶行为。
行为类别
对象
临界值(mg/100ml)
饮酒驾驶
车辆驾驶人员
20
醉酒驾驶
车辆驾驶人员
80
LCD显示模块
1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线
VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,其中:
引脚符号功能说明
1VSS一般接地
2VDD接电源(+5V)
3V0液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
4RSRS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
5R/WR/W为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
6EE(或EN)端为使能(enable)端,下降沿使能。
7DB0底4位三态、双向数据总线0位(最低位)
8DB1底4位三态、双向数据总线1位
9DB2底4位三态、双向数据总线2位
10DB3底4位三态、双向数据总线3位
11DB4高4位三态、双向数据总线4位
12DB5高4位三态、双向数据总线5位
13DB6高4位三态、双向数据总线6位
14DB7高4位三态、双向数据总线7位(最高位)(也是busyflang)
15BLA背光电源正极
16BLK背光电源负极
寄存器选择控制表即为ASCII码表
RSR/W操作说明
00写入指令寄存器(清除屏等)
01都busyflag(DB7),以及读取位址计数器(DB0~DB6)值
10写入数据寄存器(显示各字型等)
11从数据寄存器读取数据
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如'A’。
图LCD1602外部引脚图
第4章系统软件
整机系统流程图
否否
是
单片机对ADC进行初始化,使其能进入正常工作状态,通过判断ADC转换判断标志EOC,看其是否转换完毕,如果没有,则继续判断,如若完成则将ADC转换的数据由单片机读取并计算,然后进入下一环节。
LCD程序流程图
是是
否
单片机对LCD进行初始化,使其能进入正常工作状态,然后判断LCD是否处于忙碌状态,如果是则继续判断,如若不是则将从ADC转换后计算出来的结果通过输出指令输出,并判断计算出的结果处于哪种状态,并输出。
附录1酒精测试仪程序
#include<>
#include<>
sbitrs=P2^4;//LCD液晶引脚定义,p0接DB0_DB7
sbitrw=P2^7;
sbitep=P2^6;
sbitale=P2^0;//ADC0809引脚定义
sbitstart=P3^7;
sbitoe=P3^5;
sbiteoc=P3^6;
sbitadda=P2^5;
sbitaddb=P2^2;
sbitadc=P2^3;
sbitlight=P3^0;//报警输出
sbitDQ=P3^3;//DS18B20输入脚定义
sbitDE=P3^1;
unsignedchartempL=0;
unsignedchartempH=0;
floattemperature;
unsignedcharcodedis1[]={"WORKSTART"};//状态显示
unsignedcharcodedis2[]={"ALCOHOLTEST"};
unsignedcharcodedis3[]={"mg/100ml"};
unsignedcharcodedis4[]={"SAFEDRIVING"};
unsignedcharcodedis5[]={"DRINK-DRIVING"};
unsignedcharcodedis6[]={"DRUNKDRIVING"};
voiddelay(unsignedcharms)//延时1
{unsignedchari,j;
while(ms--)
{for(i=0;i<250;i++)
for(j=0;j<50;j++)
{_nop_();
_nop_();
}
}
}
voiddelay2(unsignedinttime)//延时2
{
unsignedintn;
n=0;
while(n