• 方案介紹
  • 附件下載
  • 推薦器件
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

基于51單片機的酒精濃度檢測儀設計

2024/07/30
4124
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

設計資料獲取聯(lián)系方式.doc

共1個文件

本設計僅供參考
基于51單片機的酒精濃度檢測儀設計(proteus仿真+程序+原理圖+報告)
原理圖:Altium Designer
仿真:proteus 8.9
程序編譯器:keil 4/keil 5
編程語言:C語言
編號C0031

功能說明:
STC89C51單片機+MQ-3酒精傳感器+ADC0832模塊+LCD1602模塊+報警模塊+電源構(gòu)成。
1、LCD1602實時顯示酒精濃度;
2、可以按鍵設置報警值,實現(xiàn)聲光報警;三個按鍵:設置鍵、加鍵、減鍵;
3、當濃度未超過閥值時,綠燈閃爍;當超過閾值時,紅燈閃爍并蜂鳴器報警;

開題報告

交通事故已成為對人類生命安全威協(xié)最大的“第一公害”。全球每年有50萬人因車禍喪生。引起交通事故的基本因素有人、車、路、環(huán)境與管理等,其中駕駛員本身因素占70%。而酒后駕車是駕駛員駕駛事故重要因素之一。

世界各國統(tǒng)計,30%~50%的交通事故由飲酒后駕車所至。我國交通部門報道,酒后駕車的交通事故率比平常人高出至少5~6倍。在1989~1990年中,因酒后駕車引起的交通事故平均每年高達3萬余起。

我國交通法規(guī)規(guī)定:禁止酒后駕車。在我們的調(diào)查中,駕駛員承認有酒后駕車者達11.99%,且有2.43%的駕駛員經(jīng)常酒后駕車。酒后駕車與車禍的關(guān)系是無可辯駁的。

美國近46%的交通事故與酒精有關(guān),且酒后駕車是美國車禍的三種主要危險因素之一。聯(lián)邦德國有70%的交通事故與酒后開車有關(guān)。美、日等國的研究表明,血液中酒精濃度為0.03%、0.09%、0.15%時,駕駛能力分別可下10%、25%、30%。飲酒可致駕駛員視覺功能、觸覺敏感度、判斷能力、注意力等下降,從而致交通事故的發(fā)生。

目前,我國對于酒后駕車行為的監(jiān)控主要采取出動警力,定期抽查的方式。但由于人員有限等原因,管理仍存在一定的難度。交管部門對此也非??鄲?。由于酒后駕車的危害,交管部門加大處罰力度。

現(xiàn)在一經(jīng)查出是酒后駕駛的,即使只喝了一小口,將處以50元罰款,吊扣駕駛證3個月,記6分;發(fā)現(xiàn)是醉酒駕駛的,將處以200元罰款,吊扣駕駛證6—12個月,記12分以及行政拘留15天。酒后駕車造成死亡1人或重傷3人以上的,將處以3年以上、7年以下有期徒刑。

需要注意的是,乘車人若明知駕駛?cè)藛T飲酒了卻依然乘坐,那么乘車者也將被處以警告或10元以上30元以下罰款。在英國,酒后駕車等于失去工作。因為他們上班的主要的交通工具就是汽車。

酒后駕車造成的交通事故對國家、他人、自己產(chǎn)生了難以估計的后果。為了減少這種現(xiàn)象的出現(xiàn),世界各國都在想辦法來解決這個問題。

二、項目概述

酒精濃度檢測儀主要是用來檢測酒精濃度的,它主要由酒精傳感器、A/D模數(shù)轉(zhuǎn)換器、MSC-51單片機、LCD數(shù)碼管顯示、鍵盤以及聲光報警構(gòu)成。

酒精傳感器將檢測到的酒精濃度轉(zhuǎn)化為電信號,然后將電信號傳送給模數(shù)轉(zhuǎn)換器,經(jīng)過模數(shù)轉(zhuǎn)換器轉(zhuǎn)換后,把轉(zhuǎn)換后得到的數(shù)字信號傳給單片機,單片機對所輸入的數(shù)字信號進行分析處理,最后將分析處理的結(jié)果通過顯示器顯示出來。

由于不同的環(huán)境對酒精濃度的要求也不一樣,所以,可以通過鍵盤來設定不同環(huán)境中酒精濃度的不同閥值。如果所檢測到的空氣中的酒精濃度超過了所設定的閥值,那么單片機將會控制小燈和蜂鳴器報警,用來提示。

本設計還加了繼電器模塊。當濃度超過閥值時,繼電器吸合,可以切斷汽車發(fā)動機等,這樣更加智能。

三、實施方案
系統(tǒng)的主要是酒精的檢測,所以傳感器要選擇合適的。FSS-A80型電化學酒精傳感器是一種電化學庫侖分析池型酒精濃度檢測器件,專門用于呼氣中酒精濃度檢測。它的基本特征是:更好的準確性、極好的穩(wěn)定性、極高靈敏度和較快的響應速度、較好的抗?jié)裥阅?、對口氣沒有響應。

FSS-A80型電化學酒精傳感的工作電流不到一個微安,功耗極低。FSS-A80型電化學酒精傳感器適宜于呼氣中酒精濃度的檢測,用于警用酒精檢測裝置、汽車點火控制系統(tǒng)等。

MQ-3 酒精傳感器是氣敏傳感器,其具有很高的靈敏度、良好的選擇性、長期的使用壽命和可靠的穩(wěn)定性。MQ-3 型氣敏傳感器由微型Al2O3、陶瓷管和SnO2 敏感層、測量電極和加熱器構(gòu)成的敏感元件固定在塑料或者不銹鋼的腔體內(nèi),加熱器為氣敏元件的工作提供了必要的工作條件。

傳感器的標準回路有兩部分組成:其一為加熱回路;其二為信號輸出回路,它可以準確反映傳感器表面電阻的變化。傳感器表面電阻RS 的變化,是通過與其串聯(lián)的負載電阻RL 上的有效電壓信號VRL 輸出面獲得的。二者之間的關(guān)系表述為:RS/RL=(VC-VRL)/VRL,其中VC 為回路電壓,10V。負載電阻RL 可調(diào)為0.5~200K,加熱電壓Uh 為5V。

上述這些參數(shù)使得傳感器輸出電壓為0~5V。MQ3 型氣敏傳感器的結(jié)構(gòu)和外形如圖一所示,標準回路如圖二所示,傳感器阻值變化率與酒精濃度、外界溫度的關(guān)系如圖三所示。為了使測量的精度達到最高,誤差最小,需要找到合適的溫度,一般在測量前需要將傳感器預熱5 分鐘。

經(jīng)過對比,兩者都可以用來測量,但是電化學的傳感器價格要比MQ-3貴十幾倍,所以本設計從經(jīng)費上考慮選用MQ-3酒精傳感器。

仿真

在這里插入圖片描述

程序:

//程序頭函數(shù)
#include <reg52.h>
#include <intrins.h>	//包含頭文件
//顯示函數(shù)
#include <display.h>
#include "eeprom52.h"
								   
//宏定義
#define uint unsigned int 
#define uchar unsigned char
 
//管腳聲明
sbit LED_R= P2^2;			  //紅色指示燈
sbit LED_G= P2^0;			  //綠色指示燈
sbit FENG = P2^5;			  //蜂鳴器  
sbit CS   = P1^4;
sbit Clk = P1^2;
sbit DATI = P1^3;
sbit DATO = P1^3;			//ADC0832引腳
//按鍵
sbit Key1=P2^6;
sbit Key2=P2^7;
sbit Key3=P3^7;
/*******************************定義全局變量********************************/
unsigned char dat = 0;      //AD值
unsigned char CH=0;       //通道變量
unsigned int sum=0;			 //平均值計算時的總數(shù)
unsigned char m=0;
bit bdata flag;				  //定義位變量
uchar set;					  //設置變量
uchar   K_ZERO=40;       //傳感器零點漂移,約130mV


//函數(shù)聲明
extern void Key();
/*
void delay(uint z)
{
	uint i,j;
	for(i=0;i<z;i++)
	for(j=0;j<121;j++);
}
*/

//酒精含量變量
uchar temp=0;

//指示燈變量

uchar WARNING=25;		//報警值變量

/******************把數(shù)據(jù)保存到單片機內(nèi)部eeprom中******************/
void write_eeprom()
{
	SectorErase(0x2000);
	byte_write(0x2000, WARNING);
	byte_write(0x2060, a_a);	
}

/******************把數(shù)據(jù)從單片機內(nèi)部eeprom中讀出來*****************/
void read_eeprom()
{
	WARNING   = byte_read(0x2000);
	a_a      = byte_read(0x2060);
}

/**************開機自檢eeprom初始化*****************/
void init_eeprom() 
{
	read_eeprom();		//先讀
	if(a_a != 1)		//新的單片機初始單片機內(nèi)問eeprom
	{
		WARNING  = 25;
		a_a = 1;
		write_eeprom();	   //保存數(shù)據(jù)
	}	
}

/****************************************************************************
函數(shù)功能:AD轉(zhuǎn)換子程序
入口參數(shù):CH
出口參數(shù):dat
****************************************************************************/
unsigned char adc0832(unsigned char CH)
{
	unsigned char i,test,adval;
	adval = 0x00;
	test = 0x00;
	Clk = 0;       //初始化
	DATI = 1;
	_nop_();
	CS = 0;
	_nop_();
	Clk = 1;
	_nop_();
	
	
	if ( CH == 0x00 )      //通道選擇
	{
		Clk = 0;
		DATI = 1;      //通道0的第一位
		_nop_();
		Clk = 1;
		_nop_();
		Clk = 0;
		DATI = 0;      //通道0的第二位
		_nop_();
		Clk = 1;
		_nop_();
	} 
	else
	{
		Clk = 0;
		DATI = 1;      //通道1的第一位
		_nop_();
		Clk = 1;
		_nop_();
		Clk = 0;
		DATI = 1;      //通道1的第二位
		_nop_();
		Clk = 1;
		_nop_();
	}
	
	Clk = 0;
	DATI = 1;
	for( i = 0;i < 8;i++ )      //讀取前8位的值
	{
		_nop_();
		adval <<= 1;
		Clk = 1;
		_nop_();
		Clk = 0;
		if (DATO)
		adval |= 0x01;
		else
		adval |= 0x00;
	}
	for (i = 0; i < 8; i++)      //讀取后8位的值
	{
		test >>= 1;
		if (DATO)
		test |= 0x80;
		else 
		test |= 0x00;
		_nop_();
		Clk = 1;
		_nop_();
		Clk = 0;
	}
	if (adval == test)      //比較前8位與后8位的值,如果不相同舍去。若一直出現(xiàn)顯示為零,請將該行去掉
	dat = test;
	nop_();
	CS = 1;        //釋放ADC0832
	DATO = 1;
	Clk = 1;
	return dat;
}

void init()				//定時器初始化函數(shù)
{
	TMOD=0x01;			//定時器工作方式
 	TL0=0xb0;
 	TH0=0x3c;			//賦初值50ms
 	EA=1;				//打開中斷總開關(guān)
	ET0=1;				//打開定時器0中斷允許開關(guān)
 	TR0=1;				//打開定時器0定時開關(guān)
}

void AlcoholCalibration(void)     //酒精初始化校準函數(shù)
{
	sum = 0;
	for(m=0;m<50;m++)			//讀50次AD值
	{
				sum = adc0832(0)+sum;		//讀到的AD值,將讀到的數(shù)據(jù)累加到sum
	}
	temp=sum/50;				//跳出上面的for循環(huán)后,將累加的總數(shù)除以50得到平均值temp
	K_ZERO = 500 * temp / 256;        //8位ADC,首先得到電壓值,單位10毫伏
	Display_1602(0,WARNING);	 //顯示AD數(shù)值和報警值
}

void main()				//主函數(shù)
{
	Init1602();						 //初始化液晶函數(shù)
	init();							 //初始化定時器
	init_eeprom();  //開始初始化保存的數(shù)據(jù)
	while(1)						 //進入循環(huán)
	{
		for(m=0;m<50;m++)			//讀50次AD值
		sum = adc0832(0)+sum;		//讀到的AD值,將讀到的數(shù)據(jù)累加到sum
		temp=sum/50;				//跳出上面的for循環(huán)后,將累加的總數(shù)除以50得到平均值temp
		if (temp > K_ZERO) 
				temp = temp - K_ZERO;              //首先減去零點漂移,一般是130mV
		else
				temp= 0; 
		sum=0; 						//平均值計算完成后,將總數(shù)清零
		if(set==0)					 //set為0,說明現(xiàn)在不是設置狀態(tài)
		Display_1602(temp,WARNING);	 //顯示AD數(shù)值和報警值
		if(temp<WARNING&&set==0)	 //AD數(shù)值小于報警值
		{
			flag=0;					 //關(guān)閉報警
		}
		else if(temp>WARNING&&set==0)//AD值大于報警值
		{
			flag=1;					 //打開報警
		}
		Key();						 //調(diào)用按鍵函數(shù)
	}
}

void Key()					  //按鍵函數(shù)
{
	if(Key1==0)				  //設置鍵按下
	{
		while(Key1==0);		  //按鍵松開
		FENG=0;				  //蜂鳴器響
		set++;				  //設置變量加
		flag=0;				  //關(guān)閉報警
		TR0=0;				  //關(guān)閉定時器
	}
	if(set==1)				  //設置報警值時
	{
		write_com(0x38);//屏幕初始化
		write_com(0x80+0x40+7);//位置
   		write_com(0x0f);//打開顯示 無光標 光標閃爍
   		write_com(0x06);//當讀或?qū)懸粋€字符是指針后一一位
		FENG=1;				//關(guān)閉蜂鳴器

	}
	else if(set>=2)		//設置完成時
	{
		set=0;			//變量清零
		write_com(0x38);//屏幕初始化
		write_com(0x0c);//打開顯示 無光標 無光標閃爍
		FENG=1;			//關(guān)閉蜂鳴器
		flag=1;			//打開報警
		TR0=1;			//打開定時器
	}
	if(Key2==0&&set!=0)			//設置報警值時加鍵按下
	{
		while(Key2==0);			//按鍵松開
		FENG=0;					//打開蜂鳴器
		WARNING++;				//報警值加
		if(WARNING>=255)		//最大加到255
		WARNING=0;				//清零
		write_com(0x80+0x40+5);	   //選中液晶屏上的第二行第十一列
		write_data('0'+WARNING/100);   //開始顯示報警值。例如報警值是123,123除以100的商是1,加上‘0’是為了得到液晶中對應1的顯示碼
		write_data('0'+WARNING%100/10);//123除以100的余數(shù)是23,23再除以10得到的商是2
		write_data('0'+WARNING%100%10);//23除以10的余數(shù)是3
		write_com(0x80+0x40+7);//位置
		FENG=1;						//關(guān)閉蜂鳴器
		write_eeprom();			   //保存數(shù)據(jù)
	}
	else if(Key2==0&&set==0)
	{
		AlcoholCalibration();  //酒精初始化校準
	}
	if(Key3==0&&set!=0)				//注釋同加按鍵
	{
		while(Key3==0);
		FENG=0;
		WARNING--;
		if(WARNING<=0)
		WARNING=255;
		write_com(0x80+0x40+5);
		write_data('0'+WARNING/100);
		write_data('0'+WARNING/10%10);
		write_data('0'+WARNING%10);
		write_com(0x80+0x40+7);//位置
		FENG=1;
		write_eeprom();			   //保存數(shù)據(jù)
	}
}

void  time1_int(void) interrupt 1		  //定時器工作函數(shù)
{
	uchar count;						  //定義計時變量
	TL0=0xb0;
 	TH0=0x3c;							  //重新賦初值50ms
  	count++;							  //變量加一次就是50ms
	if(count==10)						  //加到10次就是500ms
	{
		if(flag==0)						  //flag=0時,也就是不開啟報警
		{
			LED_G=0;					  //綠燈點亮
			LED_R=1;					  //紅燈熄滅
			FENG=1;						  //關(guān)閉蜂鳴器
		}
		if(flag==1)						  //flag為1時,也就是打開報警
		{
			LED_G=1;					  //綠燈熄滅
			LED_R=0;					  //紅燈點亮
			FENG=0;						  //打開蜂鳴器
		}
	}

   	if(count==20)						  //計數(shù)20次,就是1s
   	{									  //在1s時,紅綠燈都是熄滅狀態(tài),蜂鳴器也是關(guān)閉狀態(tài),裝可以達到閃爍的目的
		count=0;						  //變量清零
		if(flag==0)						  //不是報警狀態(tài)時
		{
			LED_G=1;
			LED_R=1;
			FENG=1;
		}
		if(flag==1)						  //報警狀態(tài)時
		{
			LED_G=1;
			LED_R=1;
			FENG=1;
		}
	}
} 

在這里插入圖片描述

原理圖

在這里插入圖片描述

設計報告

在這里插入圖片描述

器件清單:
在這里插入圖片描述

資料清單:

騰訊文檔】C0031 網(wǎng)盤鏈接
https://docs.qq.com/doc/DS2dTRkFiSHF1b2tF

  • 設計資料獲取聯(lián)系方式.doc
    下載

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
ATSAMD51P20A-AU 1 Microchip Technology Inc RISC Microcontroller, 32-Bit, FLASH, 120MHz, CMOS, PQFP128

ECAD模型

下載ECAD模型
$8.28 查看
CP2102N-A02-GQFN28R 1 Silicon Laboratories Inc USB Bus Controller, CMOS, QFN-28

ECAD模型

下載ECAD模型
$2.5 查看
MK70FN1M0VMJ15 1 Freescale Semiconductor Kinetis K 32-bit MCU, ARM Cortex-M4 core, 1MB Flash, 150MHz, Graphics LCD, MAPBGA 256

ECAD模型

下載ECAD模型
$18.16 查看

相關(guān)推薦