基于单片机的酒精浓度测试仪的设计

基于单片机的酒精浓度测试仪的设计

本文设计了一款便携式的酒精浓度测试仪,该设计方案采用的是89C52单片机和MQ-3酒精浓度传感器。待检测到气体信号时,酒精传感器采集得到的信号经过模数转换模块进行转换,再送至单片机进行处理分析,最后由LCD1602显示酒精浓度值,以达到警示驾驶员的作用。除此之外还可根据不用的环境用小键盘来调整测试仪的浓度警报阈值以适应不同的场合。
经过大量数据调查显示,半导体型酒精浓度测试仪具有操作简单,便携等优点,相比于传统的酒精浓度测试仪,具有精度高,稳定性优良等优点。因此酒精浓度测试仪具有潜在的研究价值,这对当场检测酒精浓度发挥了巨大的作用。

环境

  • 系统: windows
  • 软件: KeilC51

一、设计方案以及元器件的选取

通过对单片机和传感器的更加深入的了解,因其耗能小,体积小,稳定性高,在智能仪表具有很大的用处,正是这些优点决定了单片机能够在各个领域得到广泛的应用。所以在本设计中也选择了单片机作为系统的控制中心。
设计时,考虑到测试时是由传感器把物理量转换为电量,传感器输出的是稳定电压值。因此,该输出电压可以经A/D转换器转换成数字信号,再送至单片机进行处理分析,最后通过LCD,将预设阈值和测试结果显示出来。同时将测试结果与预设阈值比对,若超过则启动蜂鸣器报警和闪烁红色LED灯
基于单片机的酒精浓度测试仪的设计_第1张图片

单片机的选取

单片机,如同其名一样,是在一个微型芯片上采用先进的技术把中央处理器,存储器,I/O接口电路等模块高度集成。它拥有轻薄,抗干扰能力优良,控制功能强等众多特点,因其强大的控制功能,在工业控制领域和智能仪表领域使用较为广泛。目前,单片机的应用技术已经拓展至各个领域,熟悉和掌握单片机具有非常重要的现实意义。MCS-51具有低功耗,高性价比,功能强大等特点,而且能够迅速的做出反应,在众多型号的单片机中脱颖而出。本系统采用了改进版的51单片机-89C52作为总体的控制核心,它在原有的基础上集成了512字节RAM和时钟输出等众多功能,且它的指令代码不需要修改也可应用于其他单片机。

传感器的选取

传感器是气体检测系统的核心,传感器的优劣也标志着最终成品的质量是否过关,所以传感器的选择得根据设计需求层层筛选,绝不能麻痹大意。由于本测试仪测量的是人体呼气中的酒精浓度,所以采用气敏传感器。另外一方面还应该考虑到,在测量时其他气体成分可能会对酒精浓度的测量结果造成影响,所以传感器只能对酒精这一单一气体敏感,而不对其它气体敏感,所以这里选取MQ-3气敏传感器,它对酒精气体的灵敏度很高,相较于其它传感器,它同时还能够抵抗水蒸气,烟雾,汽油多种因素的干扰,且稳定性可靠,是毕业设计的不二之选。MQ-3传感器一般都由微型AL2O3陶瓷管和敏感材料二氧化锡,测量电极和加热器等部分组成。通常传感器的内部回路由加热回路和信号输出回路构成。在测量时,酒精气体由腔内的加热器加热后燃烧,促使SnO2电导率的变大,使得传感器内阻降低,且Vout值逐渐增大。传感器最终的输出电压为0~5V,且在一定的范围内,酒精浓度越大,输出的电压就越大。

基于单片机的酒精浓度测试仪的设计_第2张图片

模数转换模块

随着集成电路的飞速发展,采用新材料和新设计的模数转换器不断涌现,由于各种不同的检测及控制的需要而设计不同的结构,由此诞生了各式各样的的模数转换器。通常有三种类型:一是双积分式A/D转换器,优点是精度较高,良好的抗干扰能力,弊端是转换速度慢,不适合于当场测量这种场合;二是V/F式A/D转换器,它能够电压信号转换为频率信号输出,转换后的信号并不符合要求;三是逐次逼近式A/D转换器,它的精确度还算可以,虽说比不上双积分式,但转换速度比双积分式的快多了,比较符合该设计的需求。逐次比较式A/D转换器因其较高的性价比在这三种转换器中脱颖而出,是最常用的A/D转换器件。该设计中选用的是ADC0809属于上述的第三类。
基于单片机的酒精浓度测试仪的设计_第3张图片

显示屏

在许多样式的显示屏模块中经过反复比对选择,由于LCD1602的功耗低和抗干扰能力强,最终决定了LCD1602作为该酒精测试仪的输出。LCD1602作为一种字符型液晶显示模块,在市面上比较常见,它能够同时显示32个字符,该模块的显示条件完全满足本系统的显示要求,除此之外还具有功耗低,轻薄且环保等特点。在日常的生活中,很大一部分智能家具都采用了液晶显示模块,例如空调,微波炉,热水器等等,在科技日益发展的今天,液晶显示模块画面友好且已经成为了许多电子产品的必不可少的组成部分。在MCU的应用中,通常都采用三种输出方式:发光管,数码管,液晶显示器。发光管和数码管都是较为常见的输出方式,且软硬件都相对较简单。

二、硬件设计

当酒精传感器检测到待测气体时,酒精传感器输出电压至A/D转换模块,待模数转换后,将信号传递给单片机通过算法处理分析,同时将结果与预设阈值对比,对超出设定值进行报警,并且将得到的最终结果显示在显示屏上。
基于单片机的酒精浓度测试仪的设计_第4张图片
基于单片机的酒精浓度测试仪的设计_第5张图片
基于单片机的酒精浓度测试仪的设计_第6张图片

外围电路的设计

1丶键盘电路
考虑到方便的原故,本设计选用按键接低的方法来读取按键信号,当单片机处于正常状态时,该端口为高电平,单片机持续的查询端口状态,直到有按键按下的时候,该端口跳变为低电平,然后单片机调用相关程序。
常见的单片机键盘接法有矩阵式接法和独立式接法两种:这两种接法都有各自的适用领域,若遇到I/O口比较紧缺且交互少的情况,采取矩阵式接法。但是采用矩阵式接法会致使程序相对复杂,而独立键盘接法使得程序比较简易且系统非常稳定,独立式接法使得每一个按键只接一根数据输入线,这样使得占用的I/O口较多,一般独立式接法适用于与单片机交互少的情况,这样也就解决了占用多的难题。除非交互操作多且复杂,则采用矩阵式接法;由于本设计只有五个按键,其中还有一个是复位按键,还有一个为启动按键,实际上只有三个按键参与了预设阈值的互动,所以这里选取独立式键盘。
独立键盘是通过用MCU来读取I/O 口的电平,来确认是否有按键操作。通常是将启动按钮的一端接地,另一端与I/O口连接。在初始化状态时,这个I/O 口是一个高电平,如果没有按键按下时,此I/O 口将保持在一个较高的电平。当按下按键时,这个I/O 口和地面短接会迫使端口跳转到一个较低的电平。按键释放后,单片机内部的上拉电阻使I/O口变回高水平。所以我们可以设计一个程序来查找这个I/O 口的电平状态,这样单片机就可以识别我们是否按下了这个按键
基于单片机的酒精浓度测试仪的设计_第7张图片

2丶报警电路
发光二极管简称为LED,由含镓(Ga),砷(As),磷(P),氮(N)等多种化合物制成,它摒弃了白炽灯钨丝发光的原理,而是通过电子与空穴复合释放的能量来发光。经查阅相关资料发现,LED以其先进的照明技术,在发光效率提高的同时还很大程度的降低了能耗,解决了白炽灯一直以来存在的功耗问题,且发光颜色还覆盖了整个可见光的范围,LED作为21世纪最有发展前景的照明灯,被广泛的运用于各种领域。本设计选取了两种颜色的LED来显示酒精浓度是否超标,当酒精浓度超标时红色LED闪烁,绿色LED熄灭;正常时绿色LED闪烁。
基于单片机的酒精浓度测试仪的设计_第8张图片
蜂鸣器是一种靠直流电压为动力能源的电子发声器件,被广泛的运用于闹钟、音响、计算机、打印机、复印机工控设备等一系列的电子产品的音响或报警器件。在电路图中,蜂鸣器通常用字母“H”表示。
蜂鸣器根据里面构造的不同分为电磁式和压电式两种:压电式蜂鸣器一般由振荡器、压电蜂鸣片、阻抗匹配器和共鸣箱等器件组成。振荡器与电源接通后,起振并输出较高频率的信号,最后通过阻抗匹配器来制动压电蜂鸣片,当压电片与共鸣箱的频率一致时将产生共振发声。不同于电压式蜂鸣器,电磁式蜂鸣器除了振荡器、振动膜片一样外,还有磁铁和电磁线圈等零器件组成。且启动步骤也与压电式相同,都是通过振荡器来产生电流,不过之后电磁式蜂鸣器是利用交变磁场使振动膜片轻微的振动,从而使得蜂鸣器周期性的发声。
基于单片机的酒精浓度测试仪的设计_第9张图片

三、代码算法

1丶算法流程图
基于单片机的酒精浓度测试仪的设计_第10张图片
2丶调试代码

主程序:
/ //宏定义
#define uint unsigned int 
#define uchar unsigned char

//LCD管脚声明
sbit LCDRS = P2^3;
sbit LCDEN= P2^4;

//初始画时显示的内容
uchar code Init1[]="  ALCOHOL: 000  ";
uchar code Init2[]="  WARNING: 000  ";

//LCD延时
void LCDdelay(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
    for(y=10;y>0;y--);
}
//写命令
void write_com(uchar com)
{
  LCDRS=0;
  LCDdelay(5);
  LCDEN=1;
  LCDdelay(5);
  LCDEN=0;
}
//写数据
void write_data(uchar date)
{
  LCDRS=1;
  P0=date;
  LCDdelay(5);
  LCDdelay(5);
  LCDEN=0;
}
//1602初始化
void Init1602()
{
  uchar i=0;
  write_com(0x38);//屏幕初始化
  write_com(0x0c);//打开显示 无光标 无光标闪烁
  write_com(0x06);//当读或写一个字符是指针后一一位
  write_com(0x01);//清屏
  write_com(0x80);//设置位置

  for(i=0;i<16;i++)
  {
		write_data(Init1[i]);
  }
  write_com(0x80+40);//设置位置
  for(i=0;i<12;i++)
  {
		write_data(Init2[i]);
  }
}

void Display_1602(uchar NOW_NUM,uchar SET_NUM)
{

	write_com(0x80+11);
	write_data('0'+NOW_NUM/100);
	write_data('0'+NOW_NUM%10);

	write_com(0x80+0x40+11);
	write_data('0'+SET_NUM/10%10);
	write_data('0'+SET_NUM%10);
}

你可能感兴趣的:(单片机,传感器,人工智能)