多功能酒精测试仪论文课题名称基于单片机的酒精测试仪武汉工程大学邮电与信息目录一.摘要与系统原理 (3)二.功能指标 (4)三.整机原理图 (5)四.软件流程 (6)五.MCS-51单片机引脚功能 (7)六.ADC0809资料 (9)七.酒精传感器TGS822 (11)八.LCD资料 (12)九.整机程序 (13)摘要本作品是基于单片机控制ADC0809对TGS822酒精浓度取样来反映人体血液酒精浓度;以及对DS18B20获取温度系统框图实现原理TGS822对酒精浓度的变化,其阻值产生相应的变化,然后通过取样电阻分压的变化表现出来;人体血液酒精浓度的不同,其呼出的气体中酒精浓度也不同。
通过TGS822对呼出气体中酒精浓度的反应以取样电压的形式送入到ADC0809,进行A/D转换后并将转换的数据送入单片机进行分析处理,并判断是否醉酒驾车,再通过液晶板显示出来。
DS18B20其自身的温度传感器所产生的温度数字数据存入其自身的存储器,单片机对其控制读出温度数据,然后经过计算处理,将当前环境温度由液晶板输出。
作品亮点该作品结构简单,功能多样,可扩展性强,成本低廉,便于携带,适用范围广。
功能指标车辆驾驶人员血液中的酒精含量大于或等于80mg/100ml的驾驶行为。
血液酒精含量临界值:血液与呼气酒精含量换算车辆驾驶人员呼气酒精含量检验结果可按标准GA307换算成血液酒精含量。
整机原理图 软件流程图MCS-51单片机引脚功能MCS 单片机都采用40引脚的双列直插封装方式。
下图为引脚排列图,40条引脚说明如下:1、主电源引脚Vss 和Vcc ①Vss 接地②Vcc 正常操作时为+5伏电源2、外接晶振引脚XTAL1和XTAL2①XTAL1内部振荡电路反相放大器的输入端,是外接晶体的一个引脚。
当采用外部振荡器时,此引脚接地。
②XTAL2内部振荡电路反相放大器的输出端。
是外接晶体的另一端。
当采用外部振荡器时,此引脚接外部振荡源。
3、控制或与其它电源复用引脚RST/VPD,ALE/,和/Vpp①RST/VPD当振荡器运行时,在此引脚上出现两个机器周期的高电平(由低到高跳变),将使单片机复位在Vcc掉电期间,此引脚可接下图8051引脚排列图上备用电源,由VPD向内部提供备用电源,以保持内部RAM中的数据。
②ALE/正常操作时为ALE功能(允许地址锁存)提供把地址的低字节锁存到外部锁存器,ALE引脚以不变的频率(振荡器频率的)周期性地发出正脉冲信号。
因此,它可用作对外输出的时钟,或用于定时目的。
但要注意,每当访问外部数据存储器时,将跳过一个ALE脉冲,ALE端可以驱动(吸收或输出电流)八个LSTTL电路。
对于EPROM型单片机,在EPROM编程期间,此引脚接收编程脉冲(功能)③外部程序存储器读选通信号输出端,在从外部程序存储取指令(或数据)期间,在每个机器周期内两次有效。
同样可以驱动八LSTTL输入。
④/Vpp、/Vpp为内部程序存储器和外部程序存储器选择端。
当/Vpp为高电平时,访问内部程序存储器,当/Vpp为低电平时,则访问外部程序存储器。
对于EPROM型单片机,在EPROM编程期间,此引脚上加21伏EPROM编程电源(Vpp)。
4、输入/输出引脚P0.0-P0.7,P1.0-P1.7,P2.0-P2.7,P3.0-P3.7。
①P0口(P0.0-P0.7)是一个8位漏极开路型双向I/O口,在访问外部存储器时,它是分时传送的低字节地址和数据总线,P0口能以吸收电流的方式驱动八个LSTTL负载。
②P1口(P1.0-P1.7)是一个带有内部提升电阻的8位准双向I/O口。
能驱动(吸收或输出电流)四个LSTTL负载。
③P2口(P2.0-P2.7)是一个带有内部提升电阻的8位准双向I/O口,在访问外部存储器时,它输出高8位地址。
P2口可以驱动(吸收或输出电流)四个LSTTL 负载。
④P3口(P3.0-P3.7)是一个带有内部提升电阻的8位准双向I/O口。
能驱动(吸收或输出电流)四个LSTTL负载ADC0809资料1.主要特性1)8路8位A/D转换器,即分辨率8位。
2)具有转换起停控制端。
3)转换时间为100μs4)单个+5V电源供电5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
6)工作温度范围为-40~+85摄氏度7)低功耗,约15mW。
2.内部结构ADC0809是CMOS单片型逐次逼近式A/D转换器,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型D/A转换器、逐次逼近寄存器、三态输出锁存器等其它一些电路组成。
因此,ADC0809可处理8路模拟量输入,且有三态输出能力,既可与各种微处理器相连,也可单独工作。
输入输出与TTL兼容。
3.外部特性(引脚功能)ADC0809芯片有28条引脚,采用双列直插式封装,如图13.23所示。
下面说明各引脚功能。
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:地。
ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
酒精传感器TGS822资料特点:应用:・对乙醇等有机溶剂有高灵敏度・酒精检测器・长期稳定性优良・工厂、干洗店、半导体产业的・长寿命、低成本有机溶剂检知・以简单电路即可使用费加罗气体传感器的气敏素子,使用在清洁空气中电导率低的二氧化锡(SnO2)。
当存在检知对象气体时,传感器的电导率随空气中气体浓度增加而增大。
使用简单的电路即可将电导率的变化,转换为与该气体浓度相对应的输出信号。
TGS822传感器对酒精、有机溶剂的灵敏度高,在酒精检测器等方面得到广泛应用。
相同特性的TGS823,采用了陶瓷底座,可以在200℃的高温气氛中使用。
下纵坐标以传感器电阻比(Rs/Ro)表示,Rs,Ro的定义如下:Rs=不同浓度气体中的电阻值Ro=300ppm乙醇中的电阻值灵敏度特性:图中纵坐标也以传感器电阻比(Rs/Ro)表示,这里的Rs,Ro定义如下:Rs=含300ppm乙醇、各种温/湿度下的电阻值Ro=含300ppm乙醇、20℃65%R.H.下的电阻值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’。
整机程序#include<reg51.h>#include<intrins.h>sbitrs=P2^4;//LCD液晶引脚定义,p0接DB0_DB7sbitrw=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<time){n++;}return;}bitlcd_bz()//LCD判忙{bitresult;rs=0;rw=1;ep=1;_nop_();_nop_();result=(bit)(P0&0x80);ep=0;returnresult;}lcd_wcmd(unsignedcharcmd)//写指令数据到LCD {while(lcd_bz())rs=0;rw=0;ep=0;_nop_();_nop_();P0=cmd;_nop_();_nop_();ep=1;_nop_();_nop_();ep=0;}lcd_pos(unsignedcharpos)//设定显示位置{lcd_wcmd(pos|0x80);}lcd_wdat(unsignedchardat)//写入显示数据到LCD {while(lcd_bz());rs=1;rw=0;ep=0;P0=dat;_nop_();_nop_();ep=1;_nop_();_nop_();ep=0;}lcd_init()//LCD初始化{lcd_wcmd(0x38); delay(1);lcd_wcmd(0x0c); delay(1);lcd_wcmd(0x06); delay(1);lcd_wcmd(0x01); delay(1);}Init_DS18B20(void)//DS18B20初始化{unsignedcharx=0;DQ=1;delay2(8);DQ=0;delay2(85);DQ=1;delay2(14);delay2(20);}ReadOneChar(void)//向DS18B20读一字节数据{unsignedchari=0;unsignedchardat=0;for(i=8;i>0;i--){DQ=1;delay2(1);DQ=0;dat>>=1;DQ=1;if(DQ)dat|=0x80;delay2(4);}return(dat);}WriteOneChar(unsignedchardat)//向DS18B20写一字节数据{unsignedchari=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0X01;delay2(5);DQ=1;dat>>=1;}delay2(4);}ReadTemperature(void)//向DS18B20读温度值{Init_DS18B20();WriteOneChar(0xcc);WriteOneChar(0x44);delay2(125);Init_DS18B20();WriteOneChar(0xcc);WriteOneChar(0xbe);tempL=ReadOneChar();tempH=ReadOneChar();temperature=((tempH*256)+tempL)*0.0625; delay2(200);return(temperature);}main(){floatx,y,k;unsignedintda,n,temp1,temp2,i,gw,sw,bw,kw,xw; light=0;lcd_init();delay(3);lcd_pos(0);i=0;while(dis1[i]!='\0') {lcd_wdat(dis1[i]); i++;}lcd_pos(0x41);i=0;while(dis2[i]!='\0') {lcd_wdat(dis2[i]); i++;}delay(32);while(1){lcd_init();ale=0;start=0;adda=0;addb=0;adc=0;_nop_();ale=1;start=1;_nop_();start=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();while(eoc==0);oe=1;_nop_();da=P1;oe=0;y=(2550/da-10)/9.27; if(y>2.68)x=61.61-4.08*y; elseif(y>2.38)x=139.3-33.3*y; elseif(y>2.23)x=218.7-66.7*y;elseif(y>2.128)x=288.6-98*y;elseif(y>2)x=262.88-85.9*y; elseif(y>1.89)x=254.5-81.8*y; elseif(y>1.62)x=450-185.2*y; elseif(y>1.209)x=347.1-121.7*y; lseif(y>0.822)x=816.5-516.8*y; elseif(y>0.635)x=1279.2-1069.5*y; elsex=2238.7-2580.6*y; if(da<=17)x=0;n=(int)(x/0.23698); gw=n%10+0x30; temp1=n/10;sw=temp1%10+0x30;temp2=temp1/10; bw=temp2%10+0x30; kw=temp2/10+0x30; lcd_pos(0x84);lcd_wdat(0x2e);if(n>=1000){lcd_pos(0x85);lcd_wdat(gw);lcd_pos(0x83);lcd_wdat(sw);lcd_pos(0x82);lcd_wdat(bw);lcd_pos(0x81);lcd_wdat(kw);}elseif(n>=100){lcd_pos(0x85);lcd_wdat(gw);lcd_pos(0x83);lcd_wdat(sw);lcd_pos(0x82); lcd_wdat(bw);}else{lcd_pos(0x85); lcd_wdat(gw);lcd_pos(0x83); lcd_wdat(sw);}lcd_pos(0x86);i=0;while(dis3[i]!='\0') {lcd_wdat(dis3[i]); i++;}n=n/10;if(n<20){lcd_pos(0x42);i=0;while(dis4[i]!='\0') {lcd_wdat(dis4[i]);i++;}delay(16);}elseif(n>=20&&n<80) {lcd_pos(0x42);i=0;while(dis5[i]!='\0') {lcd_wdat(dis5[i]);i++;}delay(16);}else{light=1;lcd_pos(0x42);i=0;while(dis6[i]!='\0') {lcd_wdat(dis6[i]);i++;}delay(16);light=0;}lcd_init();k=ReadTemperature(); n=(int)(100*k);xw=n%10;n=n/10;gw=n%10+0x30; temp1=n/10;sw=temp1%10+0x30; temp2=temp1/10; bw=temp2%10+0x30; kw=temp2/10+0x30; n=n/10;lcd_pos(0x84);if(n>=100) {lcd_pos(0x85); lcd_wdat(gw); lcd_pos(0x83); lcd_wdat(sw); lcd_pos(0x82); lcd_wdat(bw); lcd_pos(0x81); lcd_wdat(kw); }elseif(n>=10) {lcd_pos(0x85); lcd_wdat(gw); lcd_pos(0x83); lcd_wdat(sw); lcd_pos(0x82); lcd_wdat(bw);} else{lcd_wdat(gw); lcd_pos(0x83); lcd_wdat(sw);} lcd_pos(0x86); lcd_wdat(0xdf); lcd_pos(0x87); lcd_wdat(0x43); delay(16);}}。