基于AT89C51及Proteus仿真的室内火灾监测装置

文章目录

  • 一、基本功能
  • 二、原理图
  • 三、程序
    • 1、头文件及相关定义
    • 2、主函数
  • 总结


一、基本功能

1、检测设置点的烟雾、温度参数并用LCD1602实时显示;
2、手动设置阈值;
3、当检测参数超过限度时能及时进行声光报警;

二、原理图

系统采用AT89C51作为系统主控。
单片机P0口连接锁存器,锁存器连接8255A作为单片机的扩展。
P1口连接ADC0808 模数转换器,模拟烟雾传感器情况。
P2口连接各组件,包括报警指示灯、阈值调节按键读取…
P3口作为控制各端口。
8255A PA口连接LCD1602显示温度及烟雾数值。
PC口作为点阵的输入(未实现)。
基于AT89C51及Proteus仿真的室内火灾监测装置_第1张图片

三、程序

1、头文件及相关定义

//程序头函数
#include 
#include  
#include    
#include
#include
//宏定义
#define uint unsigned int 
#define uchar unsigned char
#define Data_ADC0809 P1	//定义P1口为Data_ADC0809
#define D8255  XBYTE[0x7f03] //8255控制口地址
#define D8255A XBYTE[0x7f00] //8255 PA口地址
#define D8255B XBYTE[0x7f01] //8255 PB口地址
#define D8255C XBYTE[0x7f02] //8255 PC口地址
//管脚声明
sbit LED_yanwu= P2^1;		 //烟雾报警灯
sbit LED_wendu= P2^2;
sbit baojing= P2^3;			 //蜂鸣器接口
//ADC0808
sbit ST=P3^4;
sbit EOC=P3^5;
sbit OE=P2^0;
//按键
sbit Key1=P2^4;				 //设置键
sbit Key2=P2^5;				 //加按键
sbit Key3=P2^6;				 //减按键
//含量变量
uchar temp_wendu;
uchar temp_yanwu;
uchar yushe_wendu=45;		 //用于读取ADC数据
uchar yushe_yanwu=45;		 //烟雾预设值4//按钮模式|  
uchar Mode=0;  //1是设置温度阀值  2是设置烟雾阀值
//函数声明
extern uchar ADC0809();
extern void Key();
//ADC0809读取信息
uchar ADC0809()
{
	uchar temp_=0x00;
	//初始化高阻态
	OE=0;
	//转化初始化
	ST=0;
	//开始转换
	ST=1;
	ST=0;
	//外部中断等待AD转换结束
	while(EOC==0)
	//读取转换的AD值
	OE=1;
	temp_=Data_ADC0809;
	OE=0;
	return temp_;
}
void Key()
{
	//模式选择
	if(Key1==0)	  //设置按键
	{
		while(Key1==0);
		if(Mode>=3) Mode=0;
		else
		{
		   	write_com(0x0f);//打开显示 无光标 光标闪烁
			Mode++;			//模式加一
			switch(Mode)	//判断模式的值
			{
				case 1:
				{
					write_com(0x80+7);//为1时 温度阀值的位置闪烁
					break;			  //执行后跳出switch
				}
				case 2:					//当模式加到3时
				{
					write_com(0x80+13);
					break;
				}
				case 3:					//当模式加到3时
				{
					write_com(0x0c);//打开显示 无光标 无光标闪烁
					Mode=0;			//模式清零
					break;
				}
			}
		}
	}
	if(Key2==0 && Mode==1)// 给温度加一
	{
		while(Key2==0);
		yushe_wendu++;					   //同温度阀值设置
		write_com(0x80+7);
		write_data(0x30+yushe_wendu/100);
		write_data(0x30+yushe_wendu%100/10);
		write_data(0x30+yushe_wendu%10);
		write_com(0x80+7);
	}
	if(Key2==0 && Mode==2)//给烟雾加一
	{
		while(Key2==0);
		yushe_yanwu++;					   //同温度阀值设置
		write_com(0x80+13);
		write_data(0x30+yushe_yanwu/100);
		write_data(0x30+yushe_yanwu%100/10);
		write_data(0x30+yushe_yanwu%10);
		write_com(0x80+13);
	}
	if(Key3==0&&Mode==1)//温度减一
	{
		while(Key3==0);
		yushe_wendu--;							  //同上
		if(yushe_yanwu<=0)
		yushe_yanwu=0;
		write_com(0x80+7);
		write_data(0x30+yushe_wendu/100);
		write_data(0x30+yushe_wendu%100/10);
		write_data(0x30+yushe_wendu%10);
		write_com(0x80+7);
	}
	if(Key3==0&&Mode==2)//烟雾减一
	{
		while(Key3==0);
		yushe_yanwu--;							  //同上
		if(yushe_yanwu<=0)
		yushe_yanwu=0;
		write_com(0x80+13);
		write_data(0x30+yushe_yanwu/100);
		write_data(0x30+yushe_yanwu%100/10);
		write_data(0x30+yushe_yanwu%10);
		write_com(0x80+13);
	}
}

2、主函数


/*******主函数*********/
void main()
{

	Init1602();			  //调用初始化显示函数
   
    Init_Ds();
    while(1)			  //进入循环
	{
		temp_yanwu=ADC0809();	  //读取烟雾值
        temp_wendu=Get_Tem();
		Key();			  //调用按键函数  扫描按键

		if(Mode==0)		  //只有当模式为0时才会执行以下的阀值判断部分
		{
			Display_1602_wendu(yushe_wendu,temp_wendu);
			Display_1602_yanwu(yushe_yanwu,temp_yanwu);  //显示预设烟雾,烟雾值
			if(temp_yanwu>=yushe_yanwu)
            {
                LED_yanwu=0;		  //烟雾指示灯亮
                baojing=0;    
            }
            if(temp_yanwu<yushe_yanwu)
            {
                LED_yanwu=1;
            }
            if(temp_wendu>=yushe_wendu)	  
			{
				LED_wendu=0;
                baojing=0;
			}
            if(temp_wendu<yushe_wendu)
            {
                LED_wendu=1;
            }
			if(temp_yanwu<yushe_yanwu && temp_wendu<=yushe_wendu)
			{
				baojing=1;			  //停止报警
			}
		}
	}	
}

总结

资源获取:https://download.csdn.net/download/weixin_51306846/87134504?spm=1001.2014.3001.5501
或者
https://item.taobao.com/item.htm?ft=t&id=693838763431

你可能感兴趣的:(单片机,嵌入式硬件,51单片机,c语言)