编号:52
基于51单片机的智能火灾疏散及消防联动系统设计
功能描述:
本系统由51单片机最小系统+液晶1602显示模块+ADC0832转换模块+烟雾传感器模块+键盘模块+DS18B20温度传感器模块+ULN2003电机驱动模块+步进电机模块+水泵继电器控制模块+声光报警模块+蓝牙串口模块
1、利用51单片机
2、DS18B20采集环境温度、烟雾传感器采集烟雾通过ADC0832 A/D转换器实现模数转换为实际烟雾浓度。
3、LCD1602液晶实时显示温度 烟雾浓度。
4、利用蓝牙实现数据 实时上传到手机App(或串口)。
5、温度大于40度、烟雾浓度超过30% 声光报警, 同时开启步进电机反转三圈 代表开启消防门,开启5V小水泵工作 ;正常时 自动恢复关闭。
5、APP(或串口)可以发送指令 控制水泵开关。
7、可通过按键设置温度、烟雾上限。
仿真软件:Proteus7.8以上版本均可打开
编程人软件:Keil4 C51
视频演示链接:
52、基于51单片机的智能火灾疏散及消防联动系统设计
仿真图:
程序源码:
#include "reg52.h"
#include "intrins.h"
#include "lcd1602.h"
#include "ds18b20.h"
#include "delay.h"
#include "adc0832.h"
#include "BJ_Motor.h"
#include "uart.h"
sbit BEEP = P2^4;
sbit Motor = P1^4;
sbit key_add = P3^4; //设置加
sbit key_dec = P3^5; //设置减
sbit key_set = P3^6; //设置
bit flag = 0; //标志位
bit door = 0; //0门关 1门开
bit beep_flag = 0;
static bit Read_Flag = 1;
void Timer0Init(void) //10毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x4C; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
void main(void)
{
unsigned char send = 0;
unsigned char mode = 0; //自动模式
unsigned char value = 0;
unsigned char ic = 0;
unsigned char tpup=40,smup = 30;
unsigned char send_buf[20];
unsigned int i = 0,j = 0,k = 0;
unsigned char mq = 0; //烟雾值
short temprature;
Lcd1602_Init(); //LCD1602初始化
Uart_Init(9600);
Uart_ClearRecive();
Timer0Init(); //10毫秒@11.0592MHz
BEEP = 1;
temprature=Ds18b20_ReadTemp(); //温度采集
if(temprature==850)
{
while(1)
{
temprature=Ds18b20_ReadTemp(); //温度采集
delay_ms(200);
if(temprature!=850)
break;
}
}
Uart_SendString("$12$",strlen("$12$"));
while(1)
{
mq = ADC0832(1,0)*100/256 ; //烟雾采集
/*****************数据上传*********************/
if(Read_Flag==1)
{
Read_Flag = 0;
temprature=Ds18b20_ReadTemp(); //温度采集
sprintf(send_buf,"Temp:%3.1f Smoke:%bd\r\n",(float)temprature/10,mq);
Uart_SendString(send_buf,strlen(send_buf));
}
/*********************串口控制**********************/
if(strstr((const char *)buf,(const char *)"ON")!=NULL)
{
Motor = 0; //开水泵
mode = 1; //手动模式
Uart_ClearRecive();
}
else if(strstr((const char *)buf,(const char *)"OF")!=NULL)
{
Motor = 1; //关水泵
mode = 1; //手动模式
Uart_ClearRecive();
}
else if(strstr((const char *)buf,(const char *)"AU")!=NULL)
{
mode = 0; //自动模式
Uart_ClearRecive();
}
/*********************设置**********************/
if(key_set==0)
{
while(key_set==0);
ic++;
if(ic>2)
ic = 0;
Lcd1602_Write_Com(0x01);
}
switch(ic)
{
case 0: //主界面
Lcd1602_String(0,0,"Temp:");
Lcd1602_Write_Com(0x80+5);
if(temprature<0)
Lcd1602_Write_Data('-');
else
Lcd1602_Write_Data(' ');
if(temprature<0)
temprature=-temprature;
Lcd1602_Write_Data(temprature/1000+0x30);
Lcd1602_Write_Data(temprature%1000/100+0x30);
Lcd1602_Write_Data(temprature%100/10+0x30);
Lcd1602_Write_Data('.');
Lcd1602_Write_Data(temprature%100%10+0x30);
Lcd1602_Write_Data(0XDF);
Lcd1602_Write_Data('C');
Lcd1602_String(0,1,"Smoke:");
Lcd1602_Write_Com(0xc0+6);
Lcd1602_Write_Data(mq/100+0x30);
Lcd1602_Write_Data(mq%100/10+0x30);
Lcd1602_Write_Data(mq%100%10+0x30);
Lcd1602_Write_Data('%');
break;
case 1: //设置上限界面
if(key_add==0)
{
while(key_add==0);
if(tpup<100)
tpup++;
}
if(key_dec==0)
{
while(key_dec==0);
if(tpup>1)
tpup--;
}
Lcd1602_String(0,0,"Temp:");
Lcd1602_Write_Com(0x80+4);
Lcd1602_Write_Data('>');
Lcd1602_Write_Data(' ');
Lcd1602_Write_Data(tpup/100+0x30);
Lcd1602_Write_Data(tpup%100/10+0x30);
Lcd1602_Write_Data(tpup%100%10+0x30);
Lcd1602_Write_Data('.');
Lcd1602_Write_Data('0');
Lcd1602_Write_Data(0XDF);
Lcd1602_Write_Data('C');
Lcd1602_String(0,1,"Smoke:");
Lcd1602_Write_Com(0xC0+5);
Lcd1602_Write_Data(':');
Lcd1602_Write_Data(smup/100+0x30);
Lcd1602_Write_Data(smup%100/10+0x30);
Lcd1602_Write_Data(smup%100%10+0x30);
Lcd1602_Write_Data('%');
break;
case 2: //设置下限界面
if(key_add==0)
{
while(key_add==0);
if(smup<99)
smup++;
}
if(key_dec==0)
{
while(key_dec==0);
if(smup>1)
smup--;
}
Lcd1602_String(0,0,"Temp:");
Lcd1602_Write_Com(0x80+4);
Lcd1602_Write_Data(':');
Lcd1602_Write_Data(' ');
Lcd1602_Write_Data(tpup/100+0x30);
Lcd1602_Write_Data(tpup%100/10+0x30);
Lcd1602_Write_Data(tpup%100%10+0x30);
Lcd1602_Write_Data('.');
Lcd1602_Write_Data('0');
Lcd1602_Write_Data(0XDF);
Lcd1602_Write_Data('C');
Lcd1602_String(0,1,"Smoke:");
Lcd1602_Write_Com(0xC0+5);
Lcd1602_Write_Data('>');
Lcd1602_Write_Data(smup/100+0x30);
Lcd1602_Write_Data(smup%100/10+0x30);
Lcd1602_Write_Data(smup%100%10+0x30);
Lcd1602_Write_Data('%');
break;
}
/******************报警***********************/
if(temprature>tpup*10||mq>smup) //如果温度大于40度 烟雾大于30%
{
if(value++>20)
{
value = 0;
beep_flag = 1;
if(mode==0) //自动模式下
{
Motor = 0;
flag = 1;
}
}
}
else
{
value = 0;
beep_flag = 0;
BEEP = 1;
if(mode==0) //自动模式下
{
Motor = 1;
flag = 0;
}
}
if(flag == 1)
{
if(door==0) //如果门是关的
{
for(i = 0;i<128;i++)
{
BJmotor_Inversion(SP6);
}
door=1; //门开
}
}
else
{
if(door==1) //如果门是开的
{
for(i = 0;i<128;i++)
{
BJmotor_Corotation(SP6);
}
door=0; //门关
}
}
//delay_ms(200); //间隔几百毫秒
}
}
void tm0_isr() interrupt 1 using 1 //10ms中断
{
static unsigned char count = 0;
static unsigned char num = 0;
TL0 = 0x00; //设置定时初值
TH0 = 0x4C; //设置定时初值
if(count++>4)
{
count = 0;
if(beep_flag == 1)
{
BEEP = !BEEP;
}
}
num++;
if(num>=6)
{
num = 0;
Read_Flag = 1;
}
}
软件免费下载地址:
1、Proteus仿真软件
文件内容:Proteus7.8安装包、Proteus8.6安装包、Proteus.8.10安装包、Proteus Professional 8.11 SP0安装包
链接:https://pan.baidu.com/s/11LNUZ9BJXWvXf1C4dPc3_w
提取码:2756
2、Keil4 C51软件安装包(51单片机下载我)
链接:https://pan.baidu.com/s/1CTZBqDsPsyIbjCIjI_birA
提取码:sy2a
文件下载:
链接:https://pan.baidu.com/s/1Iphn5UiobWSpqPmBx-oMCw?pwd=w6f1
提取码:w6f1