【51单片机】【protues仿真】基于51单片机火灾报警系统

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要功能

烟物浓度:0------9等级

温度范围:0------99度

1、数码管显示

2、按键设置烟雾和温度阈值

3、温度或烟雾大于阈值启动声光报警

4、掉电保存功能,设置的参数保存在单片机内部EEPOM

5、可紧急报警和手动取消紧急报警功

二、使用步骤

基于51单片机的火灾报警系统设计需整合传感器数据采集、阈值判断及报警执行模块。

三、硬件资源

1、51单片机核心模块

2、按键模块

3、温度传感器、MQ烟雾传感器模块

4、蜂鸣器模块

5、数模转换模块

6、LCD1602显示模块

四、软件设计

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

#include <intrins.h>

#include "eeprom52.h"

uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,

0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

uchar code smg_we[]={0x7f,0xbf,0xdf,0xef};

uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};

sbit CS=P3^2;

sbit SCL=P3^3;

sbit DO=P3^4;

sbit dq = P3^5;

sbit beep = P3^6;

uint temperature,s_temp ;

uchar dengji,s_dengji;

uchar shoudong;

bit flag_300ms = 1;

uchar key_can;

uchar menu_1;

/***********************1ms延时函数*****************************/

void delay_1ms(uint q)

{

uint i,j;

for(i=0;i<q;i++)

for(j=0;j<120;j++);

}

/***********************小延时函数*****************************/

void delay_uint(uint q)

{

while(q--);

}

/***********************数码显示函数*****************************/

void display()

{

uchar i;

P1 = 0xff; //消隐

P2 = smg_we[i]; //位选

P1 = dis_smg[i]; //段选

i ++;

if(i >= 4) //4位数码管显示

i = 0;

}

/*************定时器0初始化程序***************/

void time_init()

{

EA = 1;

TMOD = 0X01;

ET0 = 1; //开定时器0中断

TR0 = 1; //允许定时器0定时

}

/********************独立按键程序*****************/

uchar key_can; //按键值

void key() //独立按键程序

{

static uchar key_new;

key_can = 20; //按键值还原

P2 |= 0x0f;

if((P2 & 0x0f) != 0x0f) //按键按下

{

delay_1ms(1); //按键消抖动

if(((P2 & 0x0f) != 0x0f) && (key_new == 1))

{ //确认是按键按下

key_new = 0;

switch(P2 & 0x0f)

{

case 0x0e: key_can = 4; break; //得到k1键值

case 0x0d: key_can = 3; break; //得到k2键值

case 0x0b: key_can = 2; break; //得到k3键值

case 0x07: key_can = 1; break; //得到k4键值

}

}

}

else //按键松开

key_new = 1;

}

void clock_h_l()

{

static uchar value;

if((dengji >= s_dengji) || (temperature >= s_temp) || (shoudong == 1)) //报警

{

value ++;

if(value >= 2)

{

value = 10;

beep = ~beep; //蜂鸣器报警

}

}

else

{

if((dengji < s_dengji) && (temperature < s_temp) && (shoudong == 0)) //取消报警

{

value = 0;

beep = 1; //取消报警

}

}

}

/***************主函数*****************/

void main()

{

beep = 0; //开机蜂鸣器叫一声

delay_1ms(200);

P0 = P1 = P2 = P3 = 0xff; //初始化IO口为高电平

temperature = read_temp(); //读取温度值

init_eeprom(); //开始初始化保存的数据

delay_1ms(650);

temperature = read_temp(); //读取温度值

time_init(); //初始化定时器

while(1)

{

key(); //独立按键程序

if(key_can < 10)

{

key_with(); //按键按下要执行的程序

}

if(flag_300ms == 1)

{

flag_300ms = 0;

clock_h_l();

temperature = read_temp(); //读取温度值

dengji = ad0832read(1,0);

dengji = dengji * 10 / 250;

if(menu_1 == 0)

{

if(temperature >= 99)

temperature = 99;

dis_smg[3]=smg_du[dengji]; //显示烟物报警等级

dis_smg[2]= 0xbf; //

dis_smg[1]=smg_du[temperature/10%10]; //十位

dis_smg[0]=smg_du[temperature%10]; //个位 ADC0832为8位ADC,数值为0~255,我们将其分开放入l_tmpdate数组中显示

}

}

delay_1ms(1);

}

}

/*************定时器0中断服务程序***************/

void time0_int() interrupt 1

{

static uchar value;

TH0 = 0xf8;

TL0 = 0x30; // 2ms

value ++;

display(); //数码管显示函数

if(value % 150 == 0)

{

flag_300ms = 1; //300ms

value = 0;

}

}

五、实验现象

演示视频:

相关推荐
CODECOLLECT1 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen2 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠5 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_5 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
深圳市九鼎创展科技7 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计7 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
小龙报8 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业8 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件
Industio_触觉智能8 小时前
瑞芯微RK3566开发板规格书,详细参数配置,型号EVB3566-V1,基于RK3566核心板SOM3566邮票孔封装
嵌入式硬件·开发板·rk3568·rk3566·核心板·瑞芯微
czwxkn9 小时前
4STM32(stdl)TIM定时器
stm32·单片机·嵌入式硬件