基于51单片机的酒精浓度测试系统 联系客服

发布时间 : 星期日 文章基于51单片机的酒精浓度测试系统更新完毕开始阅读cc72d3ea900ef12d2af90242a8956bec0875a554

VH 加热电压 5.0V±0.2V AC or DC RL 负载电阻可调

RH 加热电阻 31Ω±3Ω室温 PH 加热功耗≤900mW 表3-2-2 环境条件

符号参数名称技术条件备注 Tao 使用温度 -10℃~50℃ Tas储存温度 -20℃~70℃ RH 相对湿度<95%RH

O2 氧气浓度 21%(标准条件)氧气浓度会影响灵敏度特性最小值大于2% 3.2.4 酒精浓度信号的采集

详细的酒精浓度采集电路见下图3-2-4所示: 图3-2-4 酒精浓度采集电路

在上图中传感器将环境中的酒精浓度转化电压信号,在第4引脚直接输出电压信号模拟量,该模拟量将送到模数转换,通过单片机控制最终得出环境中酒精的含量,同时可以通过对电位器WR1的调节来改变输出的灵敏度。 3.3 模数转换电路的设计

此设计用的是单一的电源+5V,所以酒精浓度的电压信号也在0~5V之间,而且转换的速度应该要快一点,在此我们选用典型的8位逐次逼近型A/D转换器ADC0809. 3.3.1 ADC0809的特点 该转换器具有如下特点: (1)分辨率为8位; (2)转换时间为100us;

(3)很容易与微处理器连接; (4)无须零位或者满量程调整;

(5)带有锁存控制逻辑的8通道多路转换开关,便于选择8路中的任一路进行转换; (6)带锁存器的三态数据输出。 3.3.2 模数转换电路

具体模数转换电路见图3-2-1所示 图3-2-1 模数转换

在该检测仪的设计中只用到两路通道,即通道IN0和IN1.分别为酒精浓度的电压模拟信号和电压比较器LM393的基准电压信号,D0~D7为由酒精浓度引起而产生的电压数字量输出,结果将送至单片机进行分析和处理。

3.4 按键设定阈值及阈值存储电路的设计

为了在不用环境中完成酒精浓度的检测和监控,所以要调整仪器酒精浓度数值来符合工作需求。并且为了节省消耗的硬件资源,于是在此通过外部中断的按键操作来改变酒精浓度的不同阀值,外部中断电路见下图3-4-1所示 图3-4-1 外部中断按键电路

添加了阈值存储电路,既可以准确的看出详细设定的酒精浓度值,又能用来与刚检查出的酒精浓度做一个比较,增强了直观性。于此选用了AT24C08作为存储器件,用单片机的P2.6,P2.7口模拟I2C与之通信,从而完成数据的读写操作。相应的电路如图3-4-2所示 图3-4-2 AT24C08存储电路 3.5 液晶接口电路的设计

酒精浓度的显示采用1602液晶,LCD1602可显示两行英文字符,且内带ASCII字符库。LCD1602

模块内部可完成显示扫描,单片机只要向LCD1602发送命令和显示内容的ASCII码。 具体的接口电路见图3-5所示 图3-5 液晶接口电路图 控制信号RS、R/W和E分别由单片机控制8255的PA4,PA5,PA6口实现,要显示的信息通过调用数据处理程序传到8255的PB口。 3.6 声光报警电路的设计

当酒精浓度超过所设定标准时,通过控制单片机的P3.3口的电平来实现警报功能。其电路见图3-6所示

图3-6 声光报警电路

如上图所示,酒精浓度超过设定的阀值时,给单片机的P3.3口低电平,则三极管导通,同时蜂鸣器工作,发光二极管也亮。否则,单片机的P3.3口维持在高电平,三极管截止,蜂鸣器不工作,二极管也不发光。 3.7 单片机与PC机串口通讯

\串行通信”是系统之间用一根数据信号线,数据在这根数据线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。目前个人的PC机上都有这种接口(COM1,COM2),即RS-232口。

电脑的RS-232口共9根线,在简单的应用中,需要三根线即可完成通信,分别是第2脚RXD,第3脚TXD,第5脚GND.串行通信与单片机之间的接口:由于串行通信的电平逻辑定义是+15V(高电平1),-15V(低电平0),而单片机中分别用5V,0V来表示高电平1,低电平0.它们之间必须通过电平转换才能完成通信。最常用的是MAX32电路,该连接图见图3-7所示 图3-7 串口通信电路

单片机串口通信原理:51系列单片机内部集成了两个同名不同地址的串口缓冲区SBUF,一个是发送缓冲区,一个是接收缓冲区。发送数据时MCU将数据写到发送SBUF,接收到的数据自动放到接收SBUF,无需程序指定。串口发送和接收事件发生时,由硬件标志来通知处理器,RI为接收事件发生标志,TI为发送完成标志,\”为事件发生。在串口中断打开的条件下,两者任意一种情况发生都会引起中断,单片机程序可以根据RI=1和TI=1进行相应的处理。

本检测仪需要用串口线将程序下载到单片机中,以对之进行初始化过程。 3.8 晶振电路的设计

本系统采用的是12MHZ的晶振,其电路图如图3-8所示: 图3-8 晶振电路图

XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。 XTAL2:振荡器反相放大器的输出端。 3.9 复位电路的设计

单片机的复位电路如图3-9示: 图3-9 复位电路图

RST:复位输入。晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。看门狗计时完成后,RST脚输出96个晶振周期的高电平。特殊寄存器AUXR上的DISRT0位可以使此功能无效。DISRT0默认状态下,复位高电平有效。 3.10 附加功能电路的设计

由于酒精浓度的检测在很大程度上受到温度的影响,为了更直观地测出不同环境中酒精的含量,这里增加一个温度传感器,以对应不同温度下酒精传感器所对应的线性关系。

DS18B02数字温度计DALLAS公司生产的单总线器件,具有线路简单、体积小的特点。实际应用中不需要外部任何器件即可实现测温,测量温度范围在-5~+125。C之间,数字温度计的分

辨率可以从9位到12位选择,且内部有上、下限告警设置,使用非常方便。数字温度计接口的电路图如3-10所示 图3-10 DS18B02电路

P17为数字信号输入/输出端,将程序下载至单片机,开机运行,用手触摸DS18B02温度传感器,液晶上将会显示当时所处环境的温度值。 第4章检测仪的整体原理图和实物图 智能酒精检测仪的整体原理图见4-1所示 图4-1 整体原理图

酒精检测模块实物图如图4-2所示 图4-2 酒精检测模块实物图

智能酒精检测仪的实物图见4-3所示 图4-3 酒精检测仪的实物图 第5章检测仪的软件实现 5.1 A/D转换的软件实现

A/D转换的软件控制流程如图5-1所示 图5-1 AD转换流程控制

A/D转换的启动必须依靠下降沿触发,在START置低后延时一段时间(约10ms)转换才正式开始.转换过程中的所需输入时钟允许范围为10KHZ~1280KHZ,在本次设计中选用500KHZ,通过定时器产生,转换完成后得到的数字量即为由酒精传感器检测到环境中的酒精含量而产生的电压值,调用数据处理程序从而可得到酒精浓度的真实值. 5.2 阈值设定及显示的软件控制

酒精浓度的阈值设定及显示的具体软件控制流程如图5-2所示 图5-2 酒精浓度的阈值设定及LCD显示的软件控制流程

当系统进行完初始化后,该检测仪在将检测到的酒精浓度进行A/D转换的同时,还在时刻检测有无外部中断的响应,一旦有按键按下,将会根据按键按下的次数选择酒精浓度表中的酒精浓度值,而且这个值将会立刻被保存于外部存储单元(AT24C08),以便与监测到的环境中的酒精浓度进行比较,完成接下来的声光报警功能. 5.3 整体软件控制流程

本酒精检测仪的软件流程图见图5-3所示 图5-3 软件方案总体流程图

该仪器软件程序主要使用C语言编写,采用了模块化结构程序设计方法,包括主程序、中断程序等。系统在开机或者复位后,首先进行初始化、自检,然后进入中断等待,A/D转换,液晶显示三个状态,最终根据所得结果判断是否执行声光报警。中断子程序包括预设阀值、数据存储、信息显示等操作,在进行阀值判断时用到了LM393电压比较器,程序的绝大部分时间处在数据处理上,而STC89C52单片机在一次处理数据的时间约为6us,故总体的平均功耗低。 第6章检测仪的软件功能调试

本检测仪的软件功能通过方便灵活、移植性好的C语言编程来实现,采用分模块化程序设计思想,对不同模块分别进行调试后,最后再进行整合调试。总体说来包括6个模块,即:按键设置阀值模块、模数转换模块、液晶显示模块、声光报警模块、存储模块、延时模块。 6.1 按键修改酒精阈值程序

下面这段程序是用来设置酒精浓度的阈值的,检测仪只要处在工作状态中,不停地扫描按键,一旦检测有按键按下,通过检测按下的次数调用酒精浓度值数组就可知道酒精浓度设在哪个阈值。那么只要阈值在没修改前,检测仪实时检测的酒精浓度值就会跟该值进行比对,超过界限蜂鸣器将会就会发出响声,同时蜂鸣器旁边的灯会亮。经测试,虽然整个反应过程慢了

点,但是效果还是符合预定的思路。 程序6-1:

Static unsigned char set_Value=6; void INTER0(void) interrupt 0 {

set_Value++;

I2c_Write_Char(DEV_24c08ID,0x00,set_Value); if(set_Value>20) set_Value=0; }

6.2 模数转换测试

酒精浓度模拟量的输入端选择为0通道,先得对ADC0809的初始化,初始化完后,进行酒精浓度的监测、分析、运算和处理,最终结果通过单片机控制8255输至液晶上显示出来,同时这个值还将与所设定的阈值进行比对以判断是否超标。下面是关于A/D转化的模块化程序(程序6-2). 程序6-2:

ucharAD_Convert(void) {

Start=LOW; delay(2); Start=HIGH; delay(2); Start=LOW; while(!EOC); OE=HIGH; temp=P0; return temp; }

6.3 液晶显示程序设计

这里所使用的是LCD1602液晶,可显示两行字符,每行16个字符。以下是对其的初始化程序,为了达到实时正确显示所需要的信息,我们将对检测仪的液晶显示模块进行单独的测试。要想1602液晶正常显示,得对其进行写命令操作和写数据操作,以下的程序可以在液晶的第一行显示\”. 程序6-3:

#include #include #include \

#define a8255_PA XBYTE[0xD1FF] /*PA口地址*/ #define a8255_PB XBYTE[0xD2FF] /*PB口地址*/ #define a8255_PC XBYTE[0xD5FF] /*PC口地址*/ #define a8255_CON XBYTE[0xD7FF] /*控制字地址*/ #define uchar unsigned char #define uint unsigned int

uchar code table[]={\!\