酒精浓度检测仪设计Word下载.docx

上传人:b****5 文档编号:20183330 上传时间:2023-01-17 格式:DOCX 页数:37 大小:439.52KB
下载 相关 举报
酒精浓度检测仪设计Word下载.docx_第1页
第1页 / 共37页
酒精浓度检测仪设计Word下载.docx_第2页
第2页 / 共37页
酒精浓度检测仪设计Word下载.docx_第3页
第3页 / 共37页
酒精浓度检测仪设计Word下载.docx_第4页
第4页 / 共37页
酒精浓度检测仪设计Word下载.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

酒精浓度检测仪设计Word下载.docx

《酒精浓度检测仪设计Word下载.docx》由会员分享,可在线阅读,更多相关《酒精浓度检测仪设计Word下载.docx(37页珍藏版)》请在冰豆网上搜索。

酒精浓度检测仪设计Word下载.docx

5.3按键软硬件设计20

5.3.1硬件部分设计21

5.3.2软件部分设计21

5.4电源电路22

6.系统总体设计23

6.1硬件总体框图23

6.2程序流程图24

6.3硬件调试25

6.4软件调试25

6.4.1标志数的应用25

6.4.2按键的消抖与松手检测的程序实现26

6.4.3定时器与定时器中断27

结束语28

致谢29

参考文献30

附录一硬件设计原理图31

附录二实物照片32

附录三程序33

1绪论

1.1呼吸气体酒精浓度检测报警仪开发背景

我国经济、科技正在迅速腾飞,汽车早已进入寻常百姓家。

我国正在步入“汽车社会”,2011年我国汽车总数突破8000万辆,位居世界第三,这也带来了许多问题,酒驾正是其中之一。

酒精有使神经系统镇定松弛的作用,但也会成抑制力明显减弱,可能造成酒后暴力行为。

如果酒后驾车,由于神经系统涣散和判断力下降,有可能造成严重交通事故。

据科学实验表明,饮酒后对交通灯的反应慢,转向急速驾车摇摆不定,违法转弯和急速转弯等行为发生概率大大增大。

喝酒后开车发生交通事故的概率是未喝酒时的16倍。

2011年05月01日,我国正式将酒驾列为刑事犯罪。

酒驾给了我们惨痛教训,为了避免悲剧的再次发生,检测仪器便出现了,本课程设计所制作的基于单片机的呼吸气体酒精浓度测试报警仪正是用于交警检测和自我检测的良好仪器,防止酒后驾车引发的交通事故。

1.2呼吸气体酒精浓度检测报警仪的简介

燃料电池型、半导体型、气体色谱分析型、比色型、红外线型是呼吸气体酒精浓度测报警仪的五种最基本类型。

其中燃料电池型和半导体型是使用最为普遍的两种类型。

燃料电池型与其它类型相比具有抗干扰能力强,精度高,受环境因素影响小,稳定性好等特点。

它是当前全世界科学家都在广泛研究的环保型应用技术,它可以直接把可燃气体转变成电能,而不产生污染,其应用前景之一就是作为无污染的清洁能源,酒精传感器便是燃料电池的一个分支。

燃料电池酒精传感器采用白金作为电极,在燃烧室内填充相应特殊催化剂,使进入燃烧室内的酒精充分燃烧转变为电能,也就是在两个电极上产生电压,电能消耗在外接负载上,此电压与进入燃烧室内气体的酒精浓度成正比。

与半导体型相比,燃料电池型呼气酒精测试仪具有稳定性好,精度高,抗干扰性好的优点。

但是由于燃料电池酒精传感器的结构要求非常精密,制造难度相当大,目前只有美国、英国、德国等少数几个国家能够生产,加上材料成本高,因此价格相当昂贵,是半导体酒精传感器的几十倍。

本设计传感器是采用半导体型。

1.3呼吸气体酒精浓度检测报警仪课程设计基本要求与设计简介

本设计要求成品能对呼吸气体中的酒精浓度进行实时采集、转换、分析、显示、超值报警。

成品硬件主要包括基于STC89C52单片机的微控制模块、MQ-3传感器采集模块、基于ADC0804芯片的A/D转换模块、按键控制模块、以1602为核心的显示模块、报警电路模块等。

软件部分包括实时数据采集转换程序设计、实时按键检测程序设计、显示程序设计、报警检测和报警程序设计,考虑到MQ-3传感器在使用前有一个预热过程所以设计还加入了待机程序的设计。

2单片机最小系统介绍

图2-1最小系统电路图

2.1STC89C52简介

本设计以STC89C52单片机为控制核心。

单片机也就是MCU,即微控制单元,大学阶段51型和52型是同学最常使用的,用于课程设计或毕业设计的为控制单元。

52型是在51型的基础上发展而来的,它兼容51指令系统,其功能更为强大,ROM和RAM存储空间也比51型更大。

STC89C52是52型中最普遍的一种。

它除了具备一般52型的优点以外,还具有程序无法解密,价格低,功耗低,运算高速,高可靠强性,抗静电和抗干扰能力强,功能强大等突出优点。

STC89C52有40个引脚,32I/O口,它们分别是:

P0口,1号到8号引角;

P3口,10号到17号引角;

P2口,21号到28脚;

P0口,32号到39号引脚。

STC89C52可以实现两级中断嵌套,内含2个外部中断入口,可以同时实现两个计时器或计数器中断,还含有一个串口通信中断。

串口通信中可以使用2个全双工串行通信口。

2个读写口线,片内振荡器及时钟电路也给使用者带来了极大方便。

STC89C52可以按照常规方法进行编程,也可以在线编程。

STC_ISP_V479是本设计使用的程序下载软件,它以冷启动的方式,很方便地将hex文件载入单片机。

相比以往的MCU,STC89C52可降至0Hz的静态逻辑操作,可自由选择两种软件节电工作模式也是其突出优点。

空闲方式时,自动停止CPU当前工作,但允许RAM,定时/计数器,串行通信口及中断系统,继续工作,即可以随时相应突发状况,重新进入工作模式,这样可以节省电源。

另外STC89C52的ROM采用电擦除电存储方式,具有可反复擦写的Flash存储器,这给程序编写者带来了极大方便,可以反复擦写下载十万余次,方便程序调试,同时大大节约了设计成本。

图2-2STC89C52单片机各引脚图

2.2复位电路介绍

图2-3复位电路电路图

单片机工作过程中有一个程序指针,它指向即将要执行的程序。

单片机上电时要执行复位操作,使得程序指针指针指向程序的0000H地址处,即单片机将要执行第一条语句,以后每执行完一条语句程序指针都依次增加。

这样使得单片机每次执行程序都处于确定状态,如果没有程序指针,就不知道程序一开始应该从哪里开始执行,也不知道工作时应该执行哪条语句。

上电时的自动复位,使得各端口的输出输入电平不会处于不确定状态,不会使外围设备产生误动作;

也能防止内部一些控制寄存器的功能紊乱。

另外,在单片机工作过程中,如前所述,ATC89C52单片机的就好引脚RST若输入大于2个机器周期时间的高电平时,单片机就会执行复位操作,即程序指针将由当前指针跳回到程序的0000地址处。

以上所说的上电复位,和RST按键复位正是单片机复位操作的两种基本形式。

上电复位的实现方法是,在接通电源时,RST引脚获得瞬间高电平,因为电容电压不能突变,随着图3中的电容C2的充电,RST引脚所获得的高电平逐渐下降,但能保持两个机器周期以上的时间,单片机复位。

RST按键复位的方法是,在图3所示的复位电路中,当轻触开关S1被按下,RST与VCC相连,也能获得瞬间高电平,因为电容电压不能突变,随着图3中的电容C2的充电,RST引脚所获得的高电平逐渐下降,但能保持两个机器周期以上的时间,单片机复位。

在复位电路的设计中,要选择合适的元器件参数,电阻的阻值不宜过大或者过小,过大使得RST不可能获得高电平,过小也不能起到限流作用。

另外电容容值也应该合适,要保证放电时,RST引脚上的高电平也能保持两个机器周期以上的高电平。

本设计使用的电解电容容值和各电阻阻值在图3中都有标注。

2.3晶振电路介绍

图2-4晶振电路电路图

单片机必须有时钟信号控制,才能使得工作时各指令在操作上有严格的时间次序,可以通过两种方法提供时钟信号,一种是外部时钟方式,另一种是内部时钟方式。

外部时钟方式是在XTAL1端引入外部已有的时钟信号,而XTAL2端悬空,外部时钟信号一般是频率小于12MHZ的方波。

外部时钟方式一般是用于多台单片机协同工作时,如单片机之间的通信,这样要使单片机有统一的工作节奏。

本设计采用内部时钟方式,其电路结构简单,功率消耗低。

本系统中为了尽量降低功耗的原则,采用了内部时钟方式。

晶振全称为晶体振荡器(英文CrystalOscillators),其作用在于产生原始的时钟频率。

内部时钟方式的电路实现方法是在XTAL1和XTAL2引脚外接石英晶体,与单片机片内震荡电路形成震荡回路,图中电容C3和C4的容值为22pF,它们的作用是加快起振和稳定频率。

3信号采集和AD转换过程的软硬件设计

3.1MQ-3酒精浓度传感器模块简介

图3-1MQ-3酒精浓度传感器模块引脚示意图

MQ-3酒精浓度传感器模块由传感器探头和调理电路组成。

MQ-3酒精浓度传感器探头输出的微弱电流送入调理电路,使信号放大并滤去杂波。

MQ-3酒精浓度传感器模块引脚示意图如上图,除VCC和GND以外,模块还有两个输出端口,TTL电平输出端口和模拟信号输出端口。

在检测的酒精浓度值大于传感器内预设值时,TTL电平输出端口将输出高电平,起报警信号作用,若小于预设值则输出低电平。

由于传感器模块内部预设值不方便通过程序改变,所欲在本设计中TTL电平输出端口悬空,而报警值则在程序中设定,报警由单片机程序控制,这要便于修改。

模拟信号输出端口能输出0到+VCC的模拟信号,当检测的酒精浓度越大时输出电压越高。

此端口接入ADC0804的6号引脚,实现AD转换。

表3-1MQ-3传感器参数表

名称

MQ3传感器

A.标准工作条件

符号 

参数名称 

技术条件 

备注 

Vc

回路电压 

≤15V 

ACorDC

VH

加热电压 

5.0V±

0.2V

RL

负载电阻 

可调 

RH

加热电阻 

31Ω±

3Ω 

室温 

PH

加热功耗 

≤900mW

B.环境条件

Tao

使用温度 

-10℃-50℃ 

Tas

储存温度 

-20℃-70℃ 

RH 

相对湿度 

小于95%RH 

O2

氧气浓度 

21%(标准条件)

氧气浓度会影响灵敏度特性 

最小值大于2% 

C.灵敏特性

符号 

参数名称 

技术参数 

备注 

Rs

敏感体电阻 

1MΩ-8MΩ 

(200ppmalcohol)

适用范围:

10-1000ppmAlcohol

α 

(200/100)alcohol

浓度斜率 

≤0.6

标准工作条件 

温度:

20℃±

2℃Vc:

0.1V

相对湿度:

65%±

5%Vh:

5.0V±

预热时间 

不少于24小时 

3.2AD转换软硬件件设计

3.2.1ADC0804简介

图3-2ADC0804引脚示意图

ADC0804是属于连续渐进式的A/D转换器,这类型的A/D转换器除了转换速度快(几十至几百us)、分辨率高外,还有价钱便宜的优点,普遍被应用于微电脑的接口设计上。

  芯片参数:

  工作电压:

+5V,即VCC=+5V。

  模拟输入电压范围:

0~+5V,即0≤Vin≤+5V。

  分辨率:

8位,即分辨率为1/2=1/256,转换值介于0~255之间。

  转换时间:

100us(fCK=640KHz时)。

  转换误差:

±

1LSB。

  参考电压:

2.5V,即Vref=2.5V。

3.2.2本设计中ADC0804外围硬件连接

图3-3ADC0804外围电路连接

20号引脚角和10号引脚分别接VCC和GND,为芯片提供工作电压。

在精确测量时,8号引脚模拟地和10号引脚数字地应该分开接,为芯片提供基准电压,此处把它们接在一起,同时接地。

1号引脚,片选信号接入P1.5,当P1.5输出低电平时,芯片被选中处于工作状态。

引脚二为外部读数据允许位,它接到P1.6,当P1.6输出低电平时,芯片处于外部许状态,转换后的数据被送入DB0到DB7引脚,DB0到DB7引脚为数据输出端口,它与单片机P3口依次相连,此时单片机可以从P3口取走。

引脚三为外部写数据允许位,它与单片机P1.7口相连,当P1.7输低电平时,芯片处于外部写允许状态,此时芯片从6号和7号引脚获取电压差值,当此引脚再次拉高时,芯片便开始AD转换。

6号引脚Vin(+)接传感器模块的模拟信号输出端口,其间接入的10K电阻并不影响输入电压,但可以起到限流作用,防止瞬间高电流将芯片烧坏。

7号引脚Vin(-)接地,转换的原始模拟电压就是6号引脚和7号引脚的电压差值。

5号引脚在转换时输出高电平信号,结束时输出低脉冲。

它如果与单片机的外部中断端口(P3.2或P3.3)相连,在转换结束后给单片机一个中断,让单片机读走数据。

考虑到ADC0804的转换时间还是非常快的,本设计中此引脚悬空,没有和单片机外部中断入口相连。

在程序中可以用软件延时的方式等待它转换完毕,或者用定时器中断方式每隔一定时间采样,让芯片有充分转换时间。

在本设计中采用了第一种做法模拟信号输出端口,具体方法在下一小节中介绍。

19号引脚跨接一个10K电阻与4号引脚相连,4号引脚在与56PF的电容相接,电容另一端接地。

这样电阻和电容便于芯片内部电路形成了RC震荡电路,它产生周期信号,为芯片提供时序,芯片正是在此时序的控制下有条不紊的工作。

9号引脚应接入二分之一的VCC为电路提供参考基准电压,具体做法是,将两个10K电阻串联接在VCC和GND上分压,接号引脚并接在他们中间,获取参考电压。

3.2.3本设计中AD转换软件实现

图3-4ADC0804控制时序图

参考上图,CS端在初始化函数voidinit(){……}中便将他拉低使芯片一直处于工作状态,在主函数中先判断是否处于检测状态,若是检测状态,不断调用检测命令和显示命令,使单片机可以实时检测。

当测试值超标,则使报警电路报警,显示模块和报警电路的软硬件设计将在后面详细介绍。

下面具体讲述转换过程,上电后由于RD和WR都和I/O相连,即输出默认电平,无需初始化。

在转换时先将WR拉低,调用带形参子函数voiddelay(){……},用delay

(1);

语句延时约一毫秒,让ADC0804有足够时间读走6、7号引脚上的电压差值。

RD拉高后,芯片开始转换,此时程序用delay(5);

语句软件延时约五毫秒,让芯片转换完成。

再让RD端拉低,同样软件延时一毫秒,让单片机读走数据。

下面介绍转换原则,ACD0804有八位数据输出口,即转换精度为256,它将最高值(此处为1000ppm),分为255份,当得到一个转换数据时,用最大值除以255,再乘以该数据值便是最终转换值。

AD转换子函数分析:

voidad()

{

wr=0;

//将WR拉低,让芯片开始读6、7号引脚电压值

delay

(1);

//延时约一毫秒,让芯片忙完

wr=1;

//将WR拉高,上升沿到来时,AD转换开始

delay(5);

//软件延时约五毫秒,等待AD转换完成

P3=0xff;

//将P3口全部拉高,等待测试数据

//延时一会,避免紊乱

rd=0;

//将RD拉低,芯片送出数据

//延时约一毫秒,让P3口

temp=P3;

//将数据存入temp

rd=1;

//将RD拉高

}

4显示模块软硬件设计

4.1LCD1602简介

LCD1602每行可以输出16个字符,可以显示两行,故称1602,它不带中文字库,故只能显示数字、字母和普通字符。

在本设计中不检测液晶的忙与闲,用前面对待ADC0804的方法,用软件延时来等待液晶的忙操作时间。

液晶显示输出D0到D7口接P0.0到P0.7,单独使用一个口,另外还要接上10K上拉电阻来提高P0口带负载能力。

当处于读状态时,RS处于低脉冲,R/W为高脉冲,E为高脉冲,D0~D7=状态字

当处于读数据时,RS为高脉冲,R/W为高脉冲,E为高脉冲,D0~D7=数据。

当处于写指令时,RS为低脉冲,R/W为低脉冲,D0~D7=指令码,E=高脉冲。

当处于写数据时,RS为高脉冲,R/W为低脉冲,E为高脉冲,D0~D7=数据。

4.2本设计中LCD1602的硬件连接介绍

图4-1LCD1602硬件连接图

1号引脚VSS接地2号引脚VDD接电源正,为液晶提供合适电压。

15号和16号引脚也分别接电源正和地,点亮液晶背光灯,15号叫也可以串接一个5欧姆电阻,适当减小背光亮度,本设计中并未接。

3号角接到10K可调电阻M103的可调端,M103另外两端接电源正和地。

用于调整液晶对比度。

RS、R/W、E分别与I/O口P2.5、P2.6、P2.7相连。

数据口与P0口连接,外接10欧姆上拉电阻。

4.3本设计中LCD1602的软件设计

4.3.1本设计的液晶写命令子函数和写数据子函数程序分析

图4-2LCD1602写操作时序

注意前提,在初始化函数voidinit(){……}中,已将R/W拉低(对应lcden=0;

语句),即只对液晶进行写操作,不读液晶状态。

之前有位定义

sbitlcdrs=P2^5;

sbitlcdrw=P2^6;

sbitlcden=P2^7;

写命令函数各语句分析:

voidwrite_com(ucharcom)

lcdrs=0;

//将RS拉低,说明对指令操作,上电时是默认高电平

P0=com;

//对P0赋值,该值是对应命令码,com为形参

//延时约五毫秒

lcden=1;

//E拉高,让液晶读P0口,写入对应命令码

//延时约五毫秒,让液晶忙完再对其操作,防止数据丢失

lcden=0;

//将E拉低

写数据函数各语句分析:

voidwrite_com(ucharda)

lcdrs=1;

//将RS拉低高,说明对数据操作

P0=da;

//对P0赋值,该值是要写入的数据,da为形参

//E拉高,让液晶读P0口,写入数据

结合图10,将对以上分析更加清楚。

值得注意的是,在写数据的操作中,写入的都是字符ASCII码,例如想写1,让液晶在某处显1,可写write_data(’1’);

或者write_data(0x30+1);

4.3.2本设计中用到的液晶指令介绍

分析本设计程序,你会看到这些写指令命令:

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com

(1);

write_com(0x80+……);

下面对它们中的指令码做介绍:

0x38:

液晶初始化指令,让液晶按每行显示16个字符,显示两行,并且每个字符显示处的点阵为5X7;

0x0C:

不显示光标,光标不闪烁;

0x06:

在写入一个数据后地址自动加一,显示不移动;

1即0x01:

清屏指令,即将液晶内部存储数据清楚,地址指针指向零;

0x80+……:

设置写入数据的地址,所加的就是对应地址。

4.3.3本设计中的字符串显示和数据实时更新的实现方法

写字符串子程序:

voidwrite_str(uchar*p)

while(*p)

write_data(*p++);

这里灵巧的应用了数组指针,比传统的for嵌套循环写入方便很多。

用while(*p)……自动检测是否写完,当写完后指针变为零,跳出循环。

如想写入"

ACvalue:

"

只需先定义数组ucharcodestr[]="

;

,再写语句write_str(str);

写完后指针变为零,自动结束。

数据实时更新的实现方法,检测时不断调用显示子函数,display();

显示函数如下:

voiddisplay()

uintvalue;

//定义局部变量value

uchara,b,c;

//定义局部变量a、b、c

value=3.92*temp;

//获得value值,它是以ppm为单位

a=value/100;

//a为value的百位

b=value%100/10;

//b为value的十位

c=value%10;

//c为value的个位

write_com(0x80+0x40+4);

//将数据写在第二行,第五个字符处

write_data(0x30+a);

//在第二行,第五个字符处写入value百位

write_com(0x80+0x40+5);

//将数据写在第二行,第六个字符处

write_data(0x30+b);

//在第二行,第六个字符处写入value十位

write_com(0x80+0x40+6);

//将数据写在第二行,第七个字符处

write_data(0x30+c);

//在第二行,第七个字符处写入value个位

在循环语句中不断调用AD转换程序,ad();

,又不断调用显示函数,数据就能实时检测更新。

在待机时,循环程序中不断执行语句:

write_com(0x80+6);

//将数据写在第一行,第七个字符处

write_data(table[a]);

//在第一行,第七个字符处写入时钟的分钟

write_com(0x80+7);

//将数据写在第一行,第八个字符处

write_data(table[b]);

//在第一行,第八个字符处写入闪烁的冒号

write_com(0x80+8);

//将数据写在第一行,第九个字符处

write_data(table[c]);

//在第一行,第九个字符处写入时钟的秒钟十位

write_com(0x80+9);

//将数据写在第一行,第十个字符处

write_data(table[d]);

//在第一行,第十个字符处写入时钟的秒钟个位

由于是在不断循环调用,即不断数据刷新,而a、b、c、d的改变是通过定时器零实现的。

这在后面的程序调试中详细说明。

5.其它外围设备软硬件设计

5.1报警

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 节日庆典

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1