找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 494|回复: 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仿真

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表