目录
一、主要功能
1、LCD1602液晶屏幕显示烟雾,温度值
2、按键设置阈值
3、烟雾值大于阈值或温度大于阈值10s启动声光警报、喷水模块
4、元器件损坏警报
二、使用步骤
基于51单片机的火灾报警控制系统通常采用模块化设计,集成多种传感器实现火灾隐患的早期监测与预警。系统通过多参数协同检测和联动控制机制,显著提升火灾识别的准确性和响应速度。
三、硬件资源
1、51单片机核心模块
2、按键模块
3、DHT11温湿度传感器、MQ烟雾传感器模块
4、蜂鸣器模块
5、继电器模块
6、LCD1602显示模块
四、软件设计
#include <reg51.H>
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define LCDIO P0 //液晶屏数据口
sbit rs=P2^5; //定义1602 RS
sbit rw=P2^6; //定义1602 RW
sbit lcden=P2^7; //定义1602 EN
sbit SET = P2^0; //设定
sbit Up = P2^1; //加
sbit Down = P2^2; //减
sbit contrl = P2^3; //模拟布线 问题
sbit DQ = P2^4; //温度传送数据IO口
sbit motor1 =P1^6; //继电器接口
sbit speak=P1^7; //蜂鸣器接口
uchar Temp_H=35;//温度上限
uchar RH=50;//烟雾上限
uchar mq_value=0;//烟雾值
uchar setflag = 0;//
uchar temp_value; // 温度值
uchar signature ;//温度正负判断
uchar alam_flag=0;//火灾警报标志
uchar speak_flag=0;
uchar com_flag=0;//模块异常标志
uchar alam_cont=0;
uchar count = 0; //计数
uchar code table[]= "Tp: MQ: ";
uchar code table1[]="TH: RH: % ";
/*********************************************/
void delay(uint z) //延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/**********************************************/
void write_com(uchar com)
{
rs=0;
rw=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/*********************************************/
void write_date(uchar date)
{
rs=1;
rw=0;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void lcdinit()
{
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
/***********************************************/
void init()
{
uchar num;
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
write_date(table1[num]);
delay(5);
}
}
void main(void)
{
TMOD=0x01; //TMOD=0000 0001B,使用定时器T0的模式1
TH0=(65536-5000)/256; //定时器T0的高8位赋初值
TL0=(65536-5000)%256; //定时器T0的高8位赋初
ET0=1;
TR0=1; //定时关闭
lcdinit();
init();
delay(50); //启动等待,等LCD讲入工作状态
delay(50); //延时片刻(可不要)
Conut(); //显示函数
delay(150);
while(1)
{
Conut(); //显示当前烟雾
temp_to_str(); //温度数据转换成液晶字符显示
alam();//警报
keyscan();
}
}
//*****T0中断函数50ms中断一次**************
void t0_time() interrupt 1
{
TH0=(65536-5000)/256; //定时器T0的高8位赋初值
TL0=(65536-5000)%256; //定时器T0的高8位赋初
count++;
if(count>=200)
{
count=0;
alam_cont++;
if(alam_cont>=10)
{
alam_cont=0;
speak_flag=1;//启动警报
EA=0;
}
}
}
五、实验现象
演示视频: