標(biāo)題: 基于單片機(jī)的火災(zāi)報(bào)警,增加10s未解除報(bào)警自動(dòng)關(guān)門、停機(jī) [打印本頁]

作者: xlopp    時(shí)間: 2024-4-8 21:39
標(biāo)題: 基于單片機(jī)的火災(zāi)報(bào)警,增加10s未解除報(bào)警自動(dòng)關(guān)門、停機(jī)
本人初學(xué)者,想請求大佬能幫幫我,解決一下問題。目前整個(gè)仿真已經(jīng)實(shí)現(xiàn)煙霧、溫度檢測,聲光報(bào)警,報(bào)警閾值設(shè)定,實(shí)時(shí)溫度、煙霧顯示。我正在編寫解除報(bào)警的代碼,主要功能是10s內(nèi),若有人按下報(bào)警解除按鍵,那么聲光報(bào)警解除;若10s內(nèi)沒有按下解除報(bào)警按鍵,單片機(jī)自動(dòng)實(shí)現(xiàn)關(guān)門停機(jī)功能。紅色部分為我寫的報(bào)警解除代碼
#include <reg52.h>
#include <string.h>
#include <stdio.h>
#include "intrins.h"
#include "delay.h"
#include "LCD1602.h"
#include "ADC0832.h"
#include "DS18B20.h"
#include "key.h"
//#include "alarm_flag.h"
#include "motor.h"



#define uchar unsigned char
#define uint  unsigned int

uchar pre_T = 50;         //溫度報(bào)警閾值
uchar pre_Smoke = 100;    //煙霧報(bào)警閾值
uint  T;           //溫度值全局變量
uchar Smoke;     //用于讀取ADC數(shù)據(jù)
uchar flag;      //用于判斷是否報(bào)警解除
//運(yùn)行模式
uchar Mode = 0;   //=1:設(shè)置溫度閾值  =2:設(shè)置煙霧閾值  =0:正常監(jiān)控模式  
//管腳聲明
sbit Led_RED      = P2^0;      //紅燈引腳設(shè)置
sbit Led_YELLOW   = P2^1;      //黃燈引腳設(shè)置
sbit Buzzer       = P2^2;      //蜂鳴器引腳設(shè)置
sbit Fan                       = P3^3;

void main(void)
{
        uchar key,i,j;
        uchar flag;
        T = correct_T();      //初始化時(shí)調(diào)用溫度讀取函數(shù) 防止開機(jī)85°C
        LCDInit();            //調(diào)用初始化顯示函數(shù)
  LCDWriteStr(0,0,"SET T:00   E:000");//開機(jī)界面
        LCDWriteStr(1,0,"NOW T:00.0 E:000");
        delay_ms(1000);
        T = correct_T();
        
        
        while(1)
        {
                key = Key_Scan();         //按鍵掃描
                Smoke = ADC0832(0);       //讀取煙霧值
    T = correct_T();          //讀取溫度值

                if(key == KEY_SET)  //按鍵按下一次,則模式加1
                {
                        Mode++;//改變模式值
                }
                switch(Mode)
                {
                        case 0://正常監(jiān)控模式
                        {
                                LCD_Display(pre_T,pre_Smoke,T,Smoke);//顯示預(yù)設(shè)溫度,預(yù)設(shè)煙霧,溫度值,煙霧值
        if(Smoke >= pre_Smoke)         //煙霧值大于等于預(yù)設(shè)值時(shí)
                                {
                                        Led_RED = 0;              //煙霧報(bào)警燈亮
                                //        Fan = 0;
                                        Buzzer = 0;               //蜂鳴器報(bào)警
                                       
                for(i=0;i<5000;i++)      //延時(shí)十秒
               {
                        for(j=0;j<110;j++);
           {
                               if(key == KEY_SOLVE)      //報(bào)警解除鍵按下
                              {        
                                                        flag = 0;                  //解除循環(huán)標(biāo)志
                                      Led_RED = 1;              // 解除聲光報(bào)警
                                                        Buzzer = 1;              //蜂鳴器關(guān)閉
                                      break;                  //跳出內(nèi)層循環(huán)
                              }
                                                else
                                                        flag = 1;
                                         }
                 if(flag == 0)                 //報(bào)警解除鍵按下,跳出外層循環(huán)
                    break;                    //跳出循環(huán)
                                         else if((flag == 1) && (i == 4999))
                                            Move_positive(50);
                                   }
                          }
                                else  //煙霧值小于預(yù)設(shè)值時(shí)
                                {
                                  Led_RED = 1;              //煙霧報(bào)警燈滅
                                //        Fan = 1;
                                }
                          if(T >=  (pre_T*10))        
                                //溫度大于等于預(yù)設(shè)溫度值時(shí)
                                //(為什么是大于預(yù)設(shè)值*10:因?yàn)槲覀円@示的溫度是有小數(shù)點(diǎn)后一位,
                                //是一個(gè)3位數(shù),25.9°C時(shí)實(shí)際讀的數(shù)是259,所以判斷預(yù)設(shè)值時(shí)將預(yù)設(shè)值*10)
        {
                                        Buzzer = 0;                  //蜂鳴器報(bào)警
                                        Led_YELLOW = 0;              //溫度報(bào)警燈亮
                                        for(i=0;i<5000;i++)      //延時(shí)十秒
               {
                        for(j=0;j<110;j++);
           {
                               if(key == KEY_SOLVE)      //報(bào)警解除鍵按下
                              {        
                                                        flag = 0;                  //解除循環(huán)標(biāo)志
                                      Led_RED = 1;              // 解除聲光報(bào)警
                                                        Buzzer = 1;              //蜂鳴器關(guān)閉
                                      break;                  //跳出內(nèi)層循環(huán)
                              }
                                                else
                                                        flag = 1;
                                         }
                 if(flag == 0)                 //報(bào)警解除鍵按下,跳出外層循環(huán)
                    break;//跳出循環(huán)
           else if((flag == 1) && (i == 4999))
                                            Move_positive(50);
                                   }
                                }
                                else  //溫度值小于預(yù)設(shè)值時(shí)
                                {
                                        Led_YELLOW = 1;           //溫度報(bào)警燈滅
                                }
                                
                                if((Smoke < pre_Smoke) && (T < (pre_T*10)))
                                {
                                  Buzzer = 1;
                                }
                                break;
                        }
                        case 1://預(yù)設(shè)溫度模式
                        {
                                LCDSetPosition(0,5);                  //指定位置
                                LCDWriteCmd(0x0d);     //陰影閃爍LCD_DIS_ON_SHADE_ON
        if(key == KEY_ADD)//加按鍵按下
                                {
                                  pre_T++;
                                        if(pre_T >= 99)//當(dāng)閥值加到大于等于99時(shí)
                                                pre_T = 99;//閥值固定為99
                                                LCD_Write_Char(0,6,pre_T,2);//顯示預(yù)設(shè)溫度
                                }
                                if(key == KEY_MINUS)//減鍵按下
                                {
           if(pre_T <= 1)                  //當(dāng)溫度上限值減小到1時(shí)               
                                                pre_T = 1;                    //固定為1
                                                pre_T--;                      //預(yù)設(shè)溫度值減一,最小為0
                                                LCD_Write_Char(0,6,pre_T,2);  //顯示預(yù)設(shè)溫度                                                               
                                }
                                break;//執(zhí)行后跳出switch
                        }
                        case 2:
                        {
                                LCDSetPosition(0,12);                  //指定位置
                                LCDWriteCmd(0x0d);      //顯示開,光標(biāo)關(guān),光標(biāo)不閃爍LCD_DIS_ON_SHADE_ON
                                if(key == KEY_ADD)         //加鍵按下
                                {
                                  if(pre_Smoke >= 255)
                                                pre_Smoke = 254;//閥值固定為254
                                          pre_Smoke++; //預(yù)設(shè)煙霧值(閥值)加1,最大為255
                                          LCD_Write_Char(0,13,pre_Smoke,3);
                                }
                                if(key == KEY_MINUS)//減鍵按下
                                {
           if(pre_Smoke <= 1)//當(dāng)溫度上限值減小到1時(shí)               
                                                pre_Smoke = 1;//固定為1
                                                pre_Smoke--;//預(yù)設(shè)溫度值減一,最小為0
                                                LCD_Write_Char(0,13,pre_Smoke,3);////顯示預(yù)設(shè)溫度                                                               
                                }
                                break;//執(zhí)行后跳出switch
                        }
                        default:
                        {
                                LCDWriteCmd(0x38);//屏幕初始化LCD_MODE_PIN8
                                LCDWriteCmd(0x0c);//打開顯示 無光標(biāo) 無光標(biāo)閃爍LCD_DIS_ON
                                Mode = 0;
                                break;
                        }        
          }
  }
}
紅框部分是我自己在基本功能上添加的解除報(bào)警代碼。有大佬幫忙看看嗎?謝謝了,在proteus中仿真,按下報(bào)警解除鍵沒用,而且實(shí)時(shí)煙霧溫度測量會(huì)出現(xiàn)延時(shí),甚至改變環(huán)境煙霧溫度,不能正確反應(yīng)在lcd屏上。

code_fire_alarm.rar

67.61 KB, 下載次數(shù): 6

keil代碼

proteus_fire_alarm.rar

100.12 KB, 下載次數(shù): 3

proteus仿真






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1