久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1007|回復: 0
收起左側

基于單片機的火災報警,增加10s未解除報警自動關門、停機

[復制鏈接]
回帖獎勵 5 黑幣 回復本帖可獲得 5 黑幣獎勵! 每人限 1 次
ID:1115096 發表于 2024-4-8 21:39 | 顯示全部樓層 |閱讀模式
本人初學者,想請求大佬能幫幫我,解決一下問題。目前整個仿真已經實現煙霧、溫度檢測,聲光報警,報警閾值設定,實時溫度、煙霧顯示。我正在編寫解除報警的代碼,主要功能是10s內,若有人按下報警解除按鍵,那么聲光報警解除;若10s內沒有按下解除報警按鍵,單片機自動實現關門停機功能。紅色部分為我寫的報警解除代碼
#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;         //溫度報警閾值
uchar pre_Smoke = 100;    //煙霧報警閾值
uint  T;           //溫度值全局變量
uchar Smoke;     //用于讀取ADC數據
uchar flag;      //用于判斷是否報警解除
//運行模式
uchar Mode = 0;   //=1:設置溫度閾值  =2:設置煙霧閾值  =0:正常監控模式  
//管腳聲明
sbit Led_RED      = P2^0;      //紅燈引腳設置
sbit Led_YELLOW   = P2^1;      //黃燈引腳設置
sbit Buzzer       = P2^2;      //蜂鳴器引腳設置
sbit Fan                       = P3^3;

void main(void)
{
        uchar key,i,j;
        uchar flag;
        T = correct_T();      //初始化時調用溫度讀取函數 防止開機85°C
        LCDInit();            //調用初始化顯示函數
  LCDWriteStr(0,0,"SET T:00   E:000");//開機界面
        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://正常監控模式
                        {
                                LCD_Display(pre_T,pre_Smoke,T,Smoke);//顯示預設溫度,預設煙霧,溫度值,煙霧值
        if(Smoke >= pre_Smoke)         //煙霧值大于等于預設值時
                                {
                                        Led_RED = 0;              //煙霧報警燈亮
                                //        Fan = 0;
                                        Buzzer = 0;               //蜂鳴器報警
                                       
                for(i=0;i<5000;i++)      //延時十秒
               {
                        for(j=0;j<110;j++);
           {
                               if(key == KEY_SOLVE)      //報警解除鍵按下
                              {        
                                                        flag = 0;                  //解除循環標志
                                      Led_RED = 1;              // 解除聲光報警
                                                        Buzzer = 1;              //蜂鳴器關閉
                                      break;                  //跳出內層循環
                              }
                                                else
                                                        flag = 1;
                                         }
                 if(flag == 0)                 //報警解除鍵按下,跳出外層循環
                    break;                    //跳出循環
                                         else if((flag == 1) && (i == 4999))
                                            Move_positive(50);
                                   }
                          }
                                else  //煙霧值小于預設值時
                                {
                                  Led_RED = 1;              //煙霧報警燈滅
                                //        Fan = 1;
                                }
                          if(T >=  (pre_T*10))        
                                //溫度大于等于預設溫度值時
                                //(為什么是大于預設值*10:因為我們要顯示的溫度是有小數點后一位,
                                //是一個3位數,25.9°C時實際讀的數是259,所以判斷預設值時將預設值*10)
        {
                                        Buzzer = 0;                  //蜂鳴器報警
                                        Led_YELLOW = 0;              //溫度報警燈亮
                                        for(i=0;i<5000;i++)      //延時十秒
               {
                        for(j=0;j<110;j++);
           {
                               if(key == KEY_SOLVE)      //報警解除鍵按下
                              {        
                                                        flag = 0;                  //解除循環標志
                                      Led_RED = 1;              // 解除聲光報警
                                                        Buzzer = 1;              //蜂鳴器關閉
                                      break;                  //跳出內層循環
                              }
                                                else
                                                        flag = 1;
                                         }
                 if(flag == 0)                 //報警解除鍵按下,跳出外層循環
                    break;//跳出循環
           else if((flag == 1) && (i == 4999))
                                            Move_positive(50);
                                   }
                                }
                                else  //溫度值小于預設值時
                                {
                                        Led_YELLOW = 1;           //溫度報警燈滅
                                }
                                
                                if((Smoke < pre_Smoke) && (T < (pre_T*10)))
                                {
                                  Buzzer = 1;
                                }
                                break;
                        }
                        case 1://預設溫度模式
                        {
                                LCDSetPosition(0,5);                  //指定位置
                                LCDWriteCmd(0x0d);     //陰影閃爍LCD_DIS_ON_SHADE_ON
        if(key == KEY_ADD)//加按鍵按下
                                {
                                  pre_T++;
                                        if(pre_T >= 99)//當閥值加到大于等于99時
                                                pre_T = 99;//閥值固定為99
                                                LCD_Write_Char(0,6,pre_T,2);//顯示預設溫度
                                }
                                if(key == KEY_MINUS)//減鍵按下
                                {
           if(pre_T <= 1)                  //當溫度上限值減小到1時               
                                                pre_T = 1;                    //固定為1
                                                pre_T--;                      //預設溫度值減一,最小為0
                                                LCD_Write_Char(0,6,pre_T,2);  //顯示預設溫度                                                               
                                }
                                break;//執行后跳出switch
                        }
                        case 2:
                        {
                                LCDSetPosition(0,12);                  //指定位置
                                LCDWriteCmd(0x0d);      //顯示開,光標關,光標不閃爍LCD_DIS_ON_SHADE_ON
                                if(key == KEY_ADD)         //加鍵按下
                                {
                                  if(pre_Smoke >= 255)
                                                pre_Smoke = 254;//閥值固定為254
                                          pre_Smoke++; //預設煙霧值(閥值)加1,最大為255
                                          LCD_Write_Char(0,13,pre_Smoke,3);
                                }
                                if(key == KEY_MINUS)//減鍵按下
                                {
           if(pre_Smoke <= 1)//當溫度上限值減小到1時               
                                                pre_Smoke = 1;//固定為1
                                                pre_Smoke--;//預設溫度值減一,最小為0
                                                LCD_Write_Char(0,13,pre_Smoke,3);////顯示預設溫度                                                               
                                }
                                break;//執行后跳出switch
                        }
                        default:
                        {
                                LCDWriteCmd(0x38);//屏幕初始化LCD_MODE_PIN8
                                LCDWriteCmd(0x0c);//打開顯示 無光標 無光標閃爍LCD_DIS_ON
                                Mode = 0;
                                break;
                        }        
          }
  }
}
紅框部分是我自己在基本功能上添加的解除報警代碼。有大佬幫忙看看嗎?謝謝了,在proteus中仿真,按下報警解除鍵沒用,而且實時煙霧溫度測量會出現延時,甚至改變環境煙霧溫度,不能正確反應在lcd屏上。

code_fire_alarm.rar

67.61 KB, 下載次數: 6

keil代碼

proteus_fire_alarm.rar

100.12 KB, 下載次數: 3

proteus仿真

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一二三区在线 | а天堂中文最新一区二区三区 | 日韩欧美操 | 国产一区二区三区在线看 | 午夜精品福利视频 | 性视频网 | 国产精品视频免费播放 | 亚洲综合区 | 成人中文网 | 国产精品区二区三区日本 | 99久久精品免费看国产小宝寻花 | 毛片区 | 国产一区二区电影 | 日韩欧美字幕 | 日韩一区二区黄色片 | 国产精品一区二区在线免费观看 | 国户精品久久久久久久久久久不卡 | 成人精品鲁一区一区二区 | 午夜精品福利视频 | 欧美在线视频二区 | 精品欧美一区二区三区久久久 | pacopacomama在线| 久久不卡 | 成年人视频在线免费观看 | 亚洲男人的天堂网站 | 亚洲欧美激情视频 | 91精品久久久久久久久中文字幕 | 中文字幕日韩欧美一区二区三区 | 一区二区免费视频 | 亚洲精品久久久一区二区三区 | 中文字幕亚洲视频 | 天天躁天天操 | 欧美色综合 | 欧美激情精品久久久久久变态 | 久久精品久久久 | 成人免费毛片在线观看 | 日韩欧美在线视频播放 | 久久久久久久久久久久久久av | 精产国产伦理一二三区 | 水蜜桃久久夜色精品一区 | 男人av网|