基于51单片机的酒精报警器设计 下载本文

下面说明各引脚功能:

? IN0~IN7:8路模拟量输入端。 ? 2-1~2-8:8位数字量输出端。

? ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路。

? ALE:地址锁存允许信号,输入端,高电平有效。

? START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。

? EOC: A/D转换结束信号,输出端,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。

? OE:数据输出允许信号,输入端,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。

? CLK:时钟脉冲输入端。要求时钟频率不高于640KHz。 ? REF(+)、REF(-):基准电压。 ? Vcc:电源,单一+5V。 ? GND:地。 3工作过程

首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。

转换数据的传送 A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。为此可采用下述三种方式。 (1)定时传送方式

对于一种A/D转换器来说,转换时间作为一项技术指标是已知的和固定的。例如ADC0809转换时间为128μs,相当于6MHz的MCS-51单片机共64个机器周期。可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。

(2)查询方式

A/D转换芯片有表明转换完成的状态信号,例如ADC0809的EOC端。因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。

(3)中断方式

把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。

不管使用上述哪种方式,只要一旦确定转换完成,即可通过指令进行数据传送。首先送出口地址并以信号有效时,OE信号即有效,把转换数据送上数据总线,供单片机接受。

3.5酒精传感器模块 3.5.1传感器性能分析 MQ-3气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在酒精蒸汽时,传感器的电导率随空气中酒精气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。MQ-3气体传感器对酒精的灵敏度高,可以抵抗汽油、烟雾、水蒸气的干扰。这种传感器可检测多种浓度酒精气氛,是一款适合多种应用的低成本传感器。 表一 MQ-3性能表 气体 酒精(乙醇) 探测范围 10~ 1000ppm酒精 特征气体 125ppm酒精 灵敏度 R in air/Rin typical gas≥5 敏感体电阻 1~ 20KΩ in air空气中 响应时间 恢复时间 ≤10s(70% Response) ≤30s(70% Response) 加热电阻 31Ω±3Ω 加热电流 ≤180mA 加热电压 5.0V±0.2V 加热功率 ≤900mW 测量电压 ≤24V 环境温度:-20℃~+55℃ 工作条件 湿度:≤95%RH 环境含氧量:21% 温度: -20℃~+70℃ 贮存条件 湿度:≤70%RH 续表1 3.3.2呼出酒精气体浓度与血液酒精浓度关系 表二 血液与呼气酒精含量换算一览表 序 号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 呼出气体中酒精 浓度mg/L 0.0227 0.0454 0.0681 0.0909 0.1136 0.1363 0.1591 0.1818 0.2045 0.2272 0.2500 0.2727 0.2954 0.3181 0.3409 0.3636 0.3863 0.4091 0.4318 0.4515 0.6618 0.9091 呼出气体中酒精 浓度10ˉ6 11.85 23.69 35.53 47.43 59.28 71.13 83.02 94.86 106.71 118.56 130.45 141.26 154.15 166.00 177.89 189.72 201.15 213.43 225.33 237.12 355.68 474.24 血液中酒精 浓度mg/100mL 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 150 200 表三 血液酒精含量临界值一览表 行为类别 对 象 临界值(mg/100ml) 饮酒驾驶 车辆驾驶人员 20 醉酒驾驶 车辆驾驶人员 80 由表3.5.2血液酒精含量临界值可以进行定量的分析车辆驾驶人员酒后驾驶后血液中的酒精浓度,进而对于该司机的酒驾类别进行定性,如血液酒精浓度低于20 mg/100ml,则认为是饮酒驾驶,可以对其酌情处理;如若血液酒精浓度超过了20 mg/100ml且低于80 mg/100ml,则认为是醉酒驾驶,应按照国家交通法规对其处理。 第四章 4.1 C程序头函数 #include //显示函数 #include //宏定义 #define uint unsigned int #define uchar unsigned char #define Data_ADC0809 P1 //管脚声明 sbit LED_R= P2^2; //红指示灯 sbit LED_G= P2^0; //绿色指示灯 sbit FENG = P2^5; //蜂鸣器 //ADC0809 sbit ST=P3^3; sbit EOC=P3^6; sbit OE=P3^2; //按键 sbit Key1=P2^6; //设置按键 sbit Key2=P2^7; //加 sbit Key3=P3^7; //减 bit bdata flag;//指示灯和蜂鸣器闪烁报警标志位 uchar set; //设置标志位 //函数声明 extern uchar ADC0809(); extern void Key(); //酒精含量变量 uchar temp=0; uchar WARNING=25; // 初始报警值 //初始化函数 void init() { TMOD=0x01; //定时器0方式1 TL0=0xb0; TH0=0x3c; //赋初值 EA=1; //开总中断 ET0=1; //允许定时器0中断 TR0=1; //定时器0开 } //主函数 void main() { Init1602(); //1602初始化 init(); //初始化函数 while(1)//主循环 { temp=ADC0809(); //读取酒精值 if(set==0) //如果没有按下设置(默认set是0,就是正常显示状态) Display_1602(temp,WARNING); //显示酒精值 if(tempWARNING&&set==0) //如果实际的酒精值大于报警值且在正常显示状态下 { flag=1; //执行下面flag=1的(主要就是红灯闪,开蜂鸣器和继电器) } Key();//按键扫描 } }