基于AVR单片机的便携式醉酒驾驶仪器设计 - 包含原理图和完整代码 联系客服

发布时间 : 星期四 文章基于AVR单片机的便携式醉酒驾驶仪器设计 - 包含原理图和完整代码更新完毕开始阅读5a5fe11fc281e53a5802ff14

是我们设计的问题。

5 测试结论:

1、在距离一定距离内对着传感器吹浓度56%的白酒,成功报警。

2、指标参数的分析

MQ303说明书上说在0.9-1.0v下预热时间大于48小时,在2.2±0.2V下预热5~10秒钟, 实测不需这么长的时间,也不需2v以上的电压,5号干电池提供1.5v左右电压预热3秒以上即可。

五、 系统设计所需资源:

MQ303A酒精传感器1个,AVR单片机芯片,ATmega16单片机实验板1个,印刷电路板一块,七段数码管4个,Led灯一个,15mh电感一个,104电容一个,蜂鸣器一个,10k欧电阻两个,360欧电阻8个,插线若干,与门和非门各一个等等。

参考资料:

【1】 康华光. 《电子技术基础》. 高等教育出版社,2006 第五版

【2】马潮《avr单片机嵌入式系统原理与应用实践》清华出版社 2005 第一版

附录A、

1、酒精传感器参数:

符号 V H V C R L R H IH PH PS 参数 加热电压 回路电压 负载电阻 加热电阻 加热电流 加热功率 元件功率 技术条件 0.9V ± 0.1V ≤ 6 V 可调 4.5????0.5 ? 120±20mA ≤ 140 mW ≤10 mW 备注 AC or DC DC P S < 10 mW 室温 13

B.环境条件

符号 Tao Tas RH (O2) 参数 使用温度 储存温度 相对湿度 氧气浓度 技术条件 -20 C —+50 C -20 C —+70 C ≤ 95% RH 21%±1%(标准条件) 氧气浓度会影响灵敏度 o oo o备注 推荐使用范围20ppm-1000ppm乙醇 不得小于 16%

C. 灵敏度特性

型号 符号 Rs ? 参数名称 元件电阻 电阻比 MQ303A 技术条件 (4k???to 400 k?) (0.50 ??0.15) o o备注 在 洁净空气中 Rs (300 ppm酒精) / Rs (100 ppm酒精) 标准测试条件: 温度: 20 C ??2 C V C : 3.0 V ????1 V DC 湿度: 65% ??5% V H : 0.9 V ????1 V DC R L : 可调 预热时间:大于48小时

3、酒精含量的判断标准: 呼气测试最简便。而血液中的酒精浓度与肺部呼出的气体酒精浓度有一定的比例:大约2200毫升呼气中酒精含量相当于1毫升血液中酒精含量,测出后者就可知道前者。

大量的统计研究结果表明,如果被测者深吸气后以中等力度呼气达三秒钟以上,这时呼出的气就是从肺部深处出来的气体。呼气中的酒精含量与血液中的酒精含量有如下关系:

BAC(in mg/L) = BrAC(in mg/L) x 2200

上式中,BAC是血液酒精浓度的英文缩写,BrAC则是呼气酒精浓度的缩写,括号中的in mg/L表示以每升中多少毫克为单位。也就是说,以毫克/升为单位的血液酒精浓度在数值上相当于以毫克/升为单位的呼气酒精浓度乘上系数2200(由于各国的情况不同,在美国此系数采用2000,而欧洲很多国家采用2100)。基于此,目前全世界绝大多数国家都采用呼气酒精测试仪对驾驶人员进行现场检测,以确定被测量者体内酒精含量的多少。

关于吹管

14

酒精测试仪用的吹管是一个容易被忽视的问题。GA307-2001标准对吹管也作了规定。吹管虽小,但对保证检测精度非常重要。被测者口含吹管呼气,进入吹管的气体几乎全部是被测者呼出的气体。如果从一个喇叭口送入气体,被测者不接触喇叭口而对喇叭口吹气,根据流体力学的原理,气体流动时压力减小,这就把周围的空气一起带进仪器内(喷雾器就是根据这个原理制成的),相当于把呼气中的酒精浓度稀释了,检测到的酒精浓度就会比被测者实际的呼气酒精浓度低,这显然是不能容许的。另一个必须注意的是吹管一定要是单向性的,在吹气的时候才能进行检测,吸气时不能进行检测,因为吸气时吹管中的气体不来自人体,检测的结果自然不能反映人体内的酒精含量。在选择警用酒精测试仪时必须注意这个问题。

饮酒驾车和醉酒驾车,是按血液中不同酒精浓度区分。依标准,血液酒精浓度在0.2—0.8mg/ml(不含0.8)之间,属于酒后驾车,处暂扣一个月以上三个月以下驾驶证,并处200元以上500元以下罚款。血液酒精浓度在0.8mg/ml(含)以上时,属醉酒驾车。按照《道路交通安全法》,处十五日以下拘留和暂扣三个月以上六个月以下驾驶证,并处500元以上2000元以下罚款。

附录B、

系统总程序代码:

//酒精传感器C代码,ICCAVR编译环境 //ICC-AVR application builder : 2010-4-16 // Target : M16 // Crystal: 7.3728Mhz #include #include

flash unsigned char led7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管字型0~9

flash unsigned char position[4]={0x01,0x02,0x04,0x08};//用于选通四个数码管显示用 unsigned char dis_buff[4]={0,0,0,0},posit;//对应个位,十位,百位,千位的相应的数值 int time_2ms_ok;//中断相应用到的变量

unsigned long int value;//AD转换的寄存器ADCH存放的结果,转换为10进制的值。 unsigned long int middle_1,middle_2,middle_3;

unsigned long density;//转换的最终结果值,此值需要显示出来

void port_init(void)//端口初始化 {

PORTA = 0x00; DDRA = 0xF0; PORTB = 0x00; DDRB = 0xFF; PORTC = 0x00; DDRC = 0xFF; PORTD = 0x00;

15

DDRD = 0xFF; }

void adc_init(void)//dac初始化 {

ADCSR = 0x00; //disable adc

ADMUX = 0x61; //select adc avcc 外部电源参考,数据左对齐; ACSR = 0x80; SFIOR&=0x1F; SFIOR|=0x60; ADCSR = 0xAD; }

void density_dis_buff()//此函数用于将density的个位,十位,百位,千位分开存放进数组dis_buff[i] {

unsigned char i; for(i=0;i<=3;i++) {

dis_buff[i]=density; density/=10; } }

#pragma interrupt_handler adc_isr:iv_ADC void adc_isr(void)//ADC转换 { float a,b; value=ADCH; a=(float)value; b=a/256; if (b<0.1)

density=((-0.12)*b+0.561)*2000; else if (b<0.15)

density=((-0.16)*b+0.461)*2000; else if (b<0.2)

density=((-0.28)*b+0.321)*2000;//分段直线计算,计算值在200~1000ml/L内误差相对减少(已经转换为血液中的值),已经能实现检测酒后驾驶和醉酒驾驶。

else if (b<0.25)

density=((-0.3)*b+0.2)*2000; else if (b<0.3)

density=((-0.3)*b+0.18)*2000; else if (b<0.35)

density=((-0.3)*b+0.15)*2000; else if (b<1.8)

density=((-0.3)*b+0.15)*2000;

16