本設(shè)計(jì)僅供參考
基于51單片機(jī)的酒精濃度檢測(cè)儀設(shè)計(jì)(proteus仿真+程序+原理圖+報(bào)告)
原理圖:Altium Designer
仿真:proteus 8.9
程序編譯器:keil 4/keil 5
編程語(yǔ)言:C語(yǔ)言
編號(hào)C0031
功能說(shuō)明:
由STC89C51單片機(jī)+MQ-3酒精傳感器+ADC0832模塊+LCD1602模塊+報(bào)警模塊+電源構(gòu)成。
1、LCD1602實(shí)時(shí)顯示酒精濃度;
2、可以按鍵設(shè)置報(bào)警值,實(shí)現(xiàn)聲光報(bào)警;三個(gè)按鍵:設(shè)置鍵、加鍵、減鍵;
3、當(dāng)濃度未超過(guò)閥值時(shí),綠燈閃爍;當(dāng)超過(guò)閾值時(shí),紅燈閃爍并蜂鳴器報(bào)警;
開(kāi)題報(bào)告
交通事故已成為對(duì)人類生命安全威協(xié)最大的“第一公害”。全球每年有50萬(wàn)人因車(chē)禍喪生。引起交通事故的基本因素有人、車(chē)、路、環(huán)境與管理等,其中駕駛員本身因素占70%。而酒后駕車(chē)是駕駛員駕駛事故重要因素之一。
世界各國(guó)統(tǒng)計(jì),30%~50%的交通事故由飲酒后駕車(chē)所至。我國(guó)交通部門(mén)報(bào)道,酒后駕車(chē)的交通事故率比平常人高出至少5~6倍。在1989~1990年中,因酒后駕車(chē)引起的交通事故平均每年高達(dá)3萬(wàn)余起。
我國(guó)交通法規(guī)規(guī)定:禁止酒后駕車(chē)。在我們的調(diào)查中,駕駛員承認(rèn)有酒后駕車(chē)者達(dá)11.99%,且有2.43%的駕駛員經(jīng)常酒后駕車(chē)。酒后駕車(chē)與車(chē)禍的關(guān)系是無(wú)可辯駁的。
美國(guó)近46%的交通事故與酒精有關(guān),且酒后駕車(chē)是美國(guó)車(chē)禍的三種主要危險(xiǎn)因素之一。聯(lián)邦德國(guó)有70%的交通事故與酒后開(kāi)車(chē)有關(guān)。美、日等國(guó)的研究表明,血液中酒精濃度為0.03%、0.09%、0.15%時(shí),駕駛能力分別可下10%、25%、30%。飲酒可致駕駛員視覺(jué)功能、觸覺(jué)敏感度、判斷能力、注意力等下降,從而致交通事故的發(fā)生。
目前,我國(guó)對(duì)于酒后駕車(chē)行為的監(jiān)控主要采取出動(dòng)警力,定期抽查的方式。但由于人員有限等原因,管理仍存在一定的難度。交管部門(mén)對(duì)此也非常苦惱。由于酒后駕車(chē)的危害,交管部門(mén)加大處罰力度。
現(xiàn)在一經(jīng)查出是酒后駕駛的,即使只喝了一小口,將處以50元罰款,吊扣駕駛證3個(gè)月,記6分;發(fā)現(xiàn)是醉酒駕駛的,將處以200元罰款,吊扣駕駛證6—12個(gè)月,記12分以及行政拘留15天。酒后駕車(chē)造成死亡1人或重傷3人以上的,將處以3年以上、7年以下有期徒刑。
需要注意的是,乘車(chē)人若明知駕駛?cè)藛T飲酒了卻依然乘坐,那么乘車(chē)者也將被處以警告或10元以上30元以下罰款。在英國(guó),酒后駕車(chē)等于失去工作。因?yàn)樗麄兩习嗟闹饕慕煌üぞ呔褪瞧?chē)。
酒后駕車(chē)造成的交通事故對(duì)國(guó)家、他人、自己產(chǎn)生了難以估計(jì)的后果。為了減少這種現(xiàn)象的出現(xiàn),世界各國(guó)都在想辦法來(lái)解決這個(gè)問(wèn)題。
二、項(xiàng)目概述
酒精濃度檢測(cè)儀主要是用來(lái)檢測(cè)酒精濃度的,它主要由酒精傳感器、A/D模數(shù)轉(zhuǎn)換器、MSC-51單片機(jī)、LCD數(shù)碼管顯示、鍵盤(pán)以及聲光報(bào)警構(gòu)成。
酒精傳感器將檢測(cè)到的酒精濃度轉(zhuǎn)化為電信號(hào),然后將電信號(hào)傳送給模數(shù)轉(zhuǎn)換器,經(jīng)過(guò)模數(shù)轉(zhuǎn)換器轉(zhuǎn)換后,把轉(zhuǎn)換后得到的數(shù)字信號(hào)傳給單片機(jī),單片機(jī)對(duì)所輸入的數(shù)字信號(hào)進(jìn)行分析處理,最后將分析處理的結(jié)果通過(guò)顯示器顯示出來(lái)。
由于不同的環(huán)境對(duì)酒精濃度的要求也不一樣,所以,可以通過(guò)鍵盤(pán)來(lái)設(shè)定不同環(huán)境中酒精濃度的不同閥值。如果所檢測(cè)到的空氣中的酒精濃度超過(guò)了所設(shè)定的閥值,那么單片機(jī)將會(huì)控制小燈和蜂鳴器報(bào)警,用來(lái)提示。
本設(shè)計(jì)還加了繼電器模塊。當(dāng)濃度超過(guò)閥值時(shí),繼電器吸合,可以切斷汽車(chē)發(fā)動(dòng)機(jī)等,這樣更加智能。
三、實(shí)施方案
系統(tǒng)的主要是酒精的檢測(cè),所以傳感器要選擇合適的。FSS-A80型電化學(xué)酒精傳感器是一種電化學(xué)庫(kù)侖分析池型酒精濃度檢測(cè)器件,專門(mén)用于呼氣中酒精濃度檢測(cè)。它的基本特征是:更好的準(zhǔn)確性、極好的穩(wěn)定性、極高靈敏度和較快的響應(yīng)速度、較好的抗?jié)裥阅?、?duì)口氣沒(méi)有響應(yīng)。
FSS-A80型電化學(xué)酒精傳感的工作電流不到一個(gè)微安,功耗極低。FSS-A80型電化學(xué)酒精傳感器適宜于呼氣中酒精濃度的檢測(cè),用于警用酒精檢測(cè)裝置、汽車(chē)點(diǎn)火控制系統(tǒng)等。
MQ-3 酒精傳感器是氣敏傳感器,其具有很高的靈敏度、良好的選擇性、長(zhǎng)期的使用壽命和可靠的穩(wěn)定性。MQ-3 型氣敏傳感器由微型Al2O3、陶瓷管和SnO2 敏感層、測(cè)量電極和加熱器構(gòu)成的敏感元件固定在塑料或者不銹鋼的腔體內(nèi),加熱器為氣敏元件的工作提供了必要的工作條件。
傳感器的標(biāo)準(zhǔn)回路有兩部分組成:其一為加熱回路;其二為信號(hào)輸出回路,它可以準(zhǔn)確反映傳感器表面電阻的變化。傳感器表面電阻RS 的變化,是通過(guò)與其串聯(lián)的負(fù)載電阻RL 上的有效電壓信號(hào)VRL 輸出面獲得的。二者之間的關(guān)系表述為:RS/RL=(VC-VRL)/VRL,其中VC 為回路電壓,10V。負(fù)載電阻RL 可調(diào)為0.5~200K,加熱電壓Uh 為5V。
上述這些參數(shù)使得傳感器輸出電壓為0~5V。MQ3 型氣敏傳感器的結(jié)構(gòu)和外形如圖一所示,標(biāo)準(zhǔn)回路如圖二所示,傳感器阻值變化率與酒精濃度、外界溫度的關(guān)系如圖三所示。為了使測(cè)量的精度達(dá)到最高,誤差最小,需要找到合適的溫度,一般在測(cè)量前需要將傳感器預(yù)熱5 分鐘。
經(jīng)過(guò)對(duì)比,兩者都可以用來(lái)測(cè)量,但是電化學(xué)的傳感器價(jià)格要比MQ-3貴十幾倍,所以本設(shè)計(jì)從經(jīng)費(fèi)上考慮選用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; //平均值計(jì)算時(shí)的總數(shù)
unsigned char m=0;
bit bdata flag; //定義位變量
uchar set; //設(shè)置變量
uchar K_ZERO=40; //傳感器零點(diǎn)漂移,約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; //報(bào)警值變量
/******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000, WARNING);
byte_write(0x2060, a_a);
}
/******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來(lái)*****************/
void read_eeprom()
{
WARNING = byte_read(0x2000);
a_a = byte_read(0x2060);
}
/**************開(kāi)機(jī)自檢eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先讀
if(a_a != 1) //新的單片機(jī)初始單片機(jī)內(nèi)問(wèn)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)顯示為零,請(qǐng)將該行去掉
dat = test;
nop_();
CS = 1; //釋放ADC0832
DATO = 1;
Clk = 1;
return dat;
}
void init() //定時(shí)器初始化函數(shù)
{
TMOD=0x01; //定時(shí)器工作方式
TL0=0xb0;
TH0=0x3c; //賦初值50ms
EA=1; //打開(kāi)中斷總開(kāi)關(guān)
ET0=1; //打開(kāi)定時(shí)器0中斷允許開(kāi)關(guān)
TR0=1; //打開(kāi)定時(shí)器0定時(shí)開(kāi)關(guān)
}
void AlcoholCalibration(void) //酒精初始化校準(zhǔn)函數(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ù)值和報(bào)警值
}
void main() //主函數(shù)
{
Init1602(); //初始化液晶函數(shù)
init(); //初始化定時(shí)器
init_eeprom(); //開(kāi)始初始化保存的數(shù)據(jù)
while(1) //進(jìn)入循環(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; //首先減去零點(diǎn)漂移,一般是130mV
else
temp= 0;
sum=0; //平均值計(jì)算完成后,將總數(shù)清零
if(set==0) //set為0,說(shuō)明現(xiàn)在不是設(shè)置狀態(tài)
Display_1602(temp,WARNING); //顯示AD數(shù)值和報(bào)警值
if(temp<WARNING&&set==0) //AD數(shù)值小于報(bào)警值
{
flag=0; //關(guān)閉報(bào)警
}
else if(temp>WARNING&&set==0)//AD值大于報(bào)警值
{
flag=1; //打開(kāi)報(bào)警
}
Key(); //調(diào)用按鍵函數(shù)
}
}
void Key() //按鍵函數(shù)
{
if(Key1==0) //設(shè)置鍵按下
{
while(Key1==0); //按鍵松開(kāi)
FENG=0; //蜂鳴器響
set++; //設(shè)置變量加
flag=0; //關(guān)閉報(bào)警
TR0=0; //關(guān)閉定時(shí)器
}
if(set==1) //設(shè)置報(bào)警值時(shí)
{
write_com(0x38);//屏幕初始化
write_com(0x80+0x40+7);//位置
write_com(0x0f);//打開(kāi)顯示 無(wú)光標(biāo) 光標(biāo)閃爍
write_com(0x06);//當(dāng)讀或?qū)懸粋€(gè)字符是指針后一一位
FENG=1; //關(guān)閉蜂鳴器
}
else if(set>=2) //設(shè)置完成時(shí)
{
set=0; //變量清零
write_com(0x38);//屏幕初始化
write_com(0x0c);//打開(kāi)顯示 無(wú)光標(biāo) 無(wú)光標(biāo)閃爍
FENG=1; //關(guān)閉蜂鳴器
flag=1; //打開(kāi)報(bào)警
TR0=1; //打開(kāi)定時(shí)器
}
if(Key2==0&&set!=0) //設(shè)置報(bào)警值時(shí)加鍵按下
{
while(Key2==0); //按鍵松開(kāi)
FENG=0; //打開(kāi)蜂鳴器
WARNING++; //報(bào)警值加
if(WARNING>=255) //最大加到255
WARNING=0; //清零
write_com(0x80+0x40+5); //選中液晶屏上的第二行第十一列
write_data('0'+WARNING/100); //開(kāi)始顯示報(bào)警值。例如報(bào)警值是123,123除以100的商是1,加上‘0’是為了得到液晶中對(duì)應(yīng)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(); //酒精初始化校準(zhǔn)
}
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í)器工作函數(shù)
{
uchar count; //定義計(jì)時(shí)變量
TL0=0xb0;
TH0=0x3c; //重新賦初值50ms
count++; //變量加一次就是50ms
if(count==10) //加到10次就是500ms
{
if(flag==0) //flag=0時(shí),也就是不開(kāi)啟報(bào)警
{
LED_G=0; //綠燈點(diǎn)亮
LED_R=1; //紅燈熄滅
FENG=1; //關(guān)閉蜂鳴器
}
if(flag==1) //flag為1時(shí),也就是打開(kāi)報(bào)警
{
LED_G=1; //綠燈熄滅
LED_R=0; //紅燈點(diǎn)亮
FENG=0; //打開(kāi)蜂鳴器
}
}
if(count==20) //計(jì)數(shù)20次,就是1s
{ //在1s時(shí),紅綠燈都是熄滅狀態(tài),蜂鳴器也是關(guān)閉狀態(tài),裝可以達(dá)到閃爍的目的
count=0; //變量清零
if(flag==0) //不是報(bào)警狀態(tài)時(shí)
{
LED_G=1;
LED_R=1;
FENG=1;
}
if(flag==1) //報(bào)警狀態(tài)時(shí)
{
LED_G=1;
LED_R=1;
FENG=1;
}
}
}
原理圖
設(shè)計(jì)報(bào)告
器件清單:
【騰訊文檔】C0031 網(wǎng)盤(pán)鏈接
https://docs.qq.com/doc/DS2dTRkFiSHF1b2tF