基于51單片機(jī)的二氧化碳(CO2)氣體濃度監(jiān)測(cè)報(bào)警系統(tǒng)( proteus仿真+程序+演示視頻)
仿真圖proteus 8.9
程序編譯器:keil 4/keil 5
編程語(yǔ)言:C語(yǔ)言
設(shè)計(jì)編號(hào):C0073
主要功能:
結(jié)合實(shí)際情況,基于51單片機(jī)設(shè)計(jì)一個(gè)二氧化碳(CO2)監(jiān)測(cè)報(bào)警系。該系統(tǒng)應(yīng)滿足的功能要求為:
二氧化碳傳感器,運(yùn)行狀態(tài)LED顯示、獨(dú)立鍵盤、蜂鳴器報(bào)警。
演示視頻:
C0073 51單片機(jī)二氧化碳(CO2)氣體濃度監(jiān)測(cè)報(bào)警系統(tǒng)
具體功能:
①二氧化碳傳感器測(cè)得二氧化碳數(shù)據(jù)后經(jīng)過(guò)單片機(jī)處理,由LCD1602實(shí)時(shí)顯示,第一行顯示測(cè)得的濃度值,第二行顯示報(bào)警閾值;
②可通過(guò)按鍵設(shè)置二氧化碳報(bào)警閾值,開(kāi)始之后預(yù)設(shè)值閃爍,按鍵+預(yù)設(shè)值+10,按鍵減按下預(yù)設(shè)值-10;
③測(cè)得的二氧化碳濃度在正常范圍時(shí),綠燈亮,超過(guò)報(bào)警閾值時(shí),紅燈亮,蜂鳴器響,開(kāi)始聲光報(bào)警。
以下為本設(shè)計(jì)展示圖:
仿真(提供源文件)
主圖
開(kāi)始仿真
開(kāi)始仿真顯示檢測(cè)值C02為1260ppm,初始化報(bào)警值為1500ppm。
按下調(diào)整按鍵后,系統(tǒng)暫停工作,報(bào)警值十位數(shù)閃爍,按下報(bào)警上限+按鍵,報(bào)警值+10,按下按下報(bào)警上限-按鍵,報(bào)警值-10。設(shè)置完成后,再按一下調(diào)整按鍵,確定調(diào)整的報(bào)警值,系統(tǒng)正常工作。
在仿真中,可以通過(guò)箭頭調(diào)整CO2氣體傳感器數(shù)值,圖示設(shè)置為2050ppm,超出了設(shè)置的報(bào)警值1480,超出上限開(kāi)始報(bào)警,蜂鳴器持續(xù)短鳴,紅燈閃爍。
程序(提供源文件源碼):
AD轉(zhuǎn)換子程序
/****************************************************************************
函數(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;
}
獲取的值需要進(jìn)行校準(zhǔn)
void AlcoholCalibration(void) //CO2濃度初始化校準(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)警值
}
主函數(shù)
void main() //主函數(shù)
{
Init1602(); //初始化液晶函數(shù)
init(); //初始化定時(shí)器
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ù)
}
}
資料清單(提供資料清單所有文件):
資料下載鏈接
搜索設(shè)計(jì)編號(hào):C0073