一、系統(tǒng)方案
本設(shè)計(jì)采用52單片機(jī)作為主控器,液晶1602顯示,DS18B20采集溫度,MQ2采集煙霧值,火焰?zhèn)鞲衅?,按鍵設(shè)置報(bào)警,聲光報(bào)警。
二、硬件設(shè)計(jì)
原理圖如下:
三、單片機(jī)軟件設(shè)計(jì)
1、首先是系統(tǒng)初始化
//
// 1602液晶初始化函數(shù)
//
void LcdInit()
{
LcdWriteCmd(0x38); // 162顯示,57點(diǎn)陣,8位數(shù)據(jù)口
LcdWriteCmd(0x0C); // 開顯示,不顯示光標(biāo)
LcdWriteCmd(0x06); // 地址加1,當(dāng)寫入數(shù)據(jù)后光標(biāo)右移
LcdWriteCmd(0x01); // 清屏
}
2、液晶顯示程序
//
// 1602液晶寫命令函數(shù),cmd就是要寫入的命令
//
void LcdWriteCmd(uchar cmd)
{
LcdRs_P = 0;
LcdRw_P = 0;
LcdEn_P = 0;
P0=cmd;
DelayMs(2);
LcdEn_P = 1;
DelayMs(2);
LcdEn_P = 0;
}
//
// 1602液晶寫數(shù)據(jù)函數(shù),dat就是要寫入的數(shù)據(jù)
//
void LcdWriteData(uchar dat)
{
LcdRs_P = 1;
LcdRw_P = 0;
LcdEn_P = 0;
P0=dat;
DelayMs(2);
LcdEn_P = 1;
DelayMs(2);
LcdEn_P = 0;
}
3、按鍵程序
//
// 按鍵掃描
//
void KeyScanf()
{
if(Key1_P==0)
{
LcdGotoXY(0,13);
LcdWriteCmd(0x0f); // 顯示光標(biāo),并閃爍
/*****煙霧報(bào)警值的設(shè)置******************************************
------------------------------------------------------------*/
DelayMs(10); // 延時(shí)去除按鍵按下的抖動(dòng)
while(!Key1_P); // 等待按鍵釋放
DelayMs(10); // 延時(shí)去除按鍵松開的抖動(dòng)
while(Key1_P!=0) // 如果按鍵1按下,那么跳到下一級(jí)設(shè)置,否則是煙霧報(bào)警值的大小設(shè)置
{
if(Key2_P==0) // 如果減按鍵被按下
{
if(gMqAlarm>1) // 只有g(shù)MqAlarm大于1才能減1
gMqAlarm--;
LcdGotoXY(0,11); // 液晶光標(biāo)定位到第0行第11列
LcdPrintNum1(gMqAlarm); // 刷新改變后的報(bào)警值
LcdGotoXY(0,13);
DelayMs(250); // 延時(shí)一下
}
if(Key3_P==0) // 如果加按鍵被按下
{
if(gMqAlarm<100) // 只有g(shù)MqAlarm小于100才能加1
gMqAlarm++;
LcdGotoXY(0,11); // 液晶光標(biāo)定位到第0行第11列
LcdPrintNum1(gMqAlarm); // 刷新改變后的報(bào)警值
LcdGotoXY(0,13);
DelayMs(250); // 延時(shí)一下
}
}
/*****溫度報(bào)警值設(shè)置******************************************
------------------------------------------------------------*/
LcdGotoXY(1,13); // 光標(biāo)定位
DelayMs(10); // 延時(shí)去除按鍵按下的抖動(dòng)
while(!Key1_P); // 等待按鍵釋放
DelayMs(10); // 延時(shí)去除按鍵松開的抖動(dòng)
while(Key1_P!=0) // 如果按鍵1按下,則退出設(shè)置模式,否則是溫度報(bào)警值的大小設(shè)置
{
if(Key2_P==0) // 如果減按鍵被按下
{
if(gTempAlarm>-54) // 只有g(shù)TempAlarm大于-54才能減1
gTempAlarm--;
LcdGotoXY(1,11); // 液晶光標(biāo)定位到第1行第11列
LcdPrintNum2(gTempAlarm); // 刷新改變后的報(bào)警值
LcdGotoXY(1,13);
DelayMs(250); // 延時(shí)一下
}
if(Key3_P==0) // 如果加按鍵被按下
{
if(gTempAlarm<125) // 只有g(shù)TempAlarm小于125才能加1
gTempAlarm++;
LcdGotoXY(1,11); // 液晶光標(biāo)定位到第0行第11列
LcdPrintNum2(gTempAlarm); // 刷新改變后的報(bào)警值
LcdGotoXY(1,13);
DelayMs(250); // 延時(shí)一下
}
}
/*****退出報(bào)警值的設(shè)置******************************************
------------------------------------------------------------*/
DelayMs(10); // 延時(shí)去除按鍵按下的抖動(dòng)
while(!Key1_P); // 等待按鍵釋放
DelayMs(10); // 延時(shí)去除按鍵松開的抖動(dòng)
LcdWriteCmd(0x0c); // 關(guān)閉光標(biāo)
}
}
4、核心算法程序
//
// 報(bào)警判斷
//
void AlarmJudge(uchar dat1, int dat2)
{
/火焰報(bào)警判斷/
if(Fire_P0)
{
DelayMs(50);
if(Fire_P0)
{
Led1_P=0;
}
}
else
{
Led1_P=1;
}
/*煙霧報(bào)警判斷*/
if(dat1>gMqAlarm)
{
Led3_P=0;
}
else
{
Led3_P=1;
}
/*溫度報(bào)警判斷*/
if(dat2>gTempAlarm)
{
Led2_P=0;
}
else
{
Led2_P=1;
}
/*蜂鳴器報(bào)警判斷*/
if((Led1_P==0)||(Led2_P==0)||(Led3_P==0))
Buzzer_P=0;
else
Buzzer_P=1;
}文章來源:http://www.zghlxwxcb.cn/news/detail-705422.html
四、 proteus仿真設(shè)計(jì)
Proteus軟件是一款應(yīng)用比較廣泛的工具,它可以在沒有硬件平臺(tái)的基礎(chǔ)上通過自身的軟件仿真出硬件平臺(tái)的運(yùn)行情況,這樣就可以通過軟件仿真來驗(yàn)證我們?cè)O(shè)計(jì)的方案有沒有問題,如果有問題,可以重新選擇器件,連接器件,直到達(dá)到我們?cè)O(shè)定的目的,避免我們搭建實(shí)物的時(shí)候,如果當(dāng)初選擇的方案有問題,我們器件都已經(jīng)焊接好了,再去卸載下去,再去焊接新的方案的器件,測(cè)試,這樣會(huì)浪費(fèi)人力和物力,也給開發(fā)者帶來一定困惑,Proteus仿真軟件就很好的解決這個(gè)問題,我們?cè)谠O(shè)計(jì)之初,就使用該軟件進(jìn)行模擬仿真,測(cè)試,選擇滿足我們?cè)O(shè)計(jì)的最優(yōu)方案。最后根據(jù)測(cè)試沒問題的仿真圖紙,焊接實(shí)物,調(diào)試,最終完成本設(shè)計(jì)的作品。文章來源地址http://www.zghlxwxcb.cn/news/detail-705422.html
到了這里,關(guān)于基于51單片機(jī)煙霧溫度檢測(cè)報(bào)警系統(tǒng)設(shè)計(jì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!