52、基于51单片机的智能火灾疏散及消防联动系统设计(Proteus仿真+程序)

编号: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

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机技能设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值