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