基于51单片机的智能家居防盗系统人体红外热释电 proteus仿真原理图程序设计

硬件设计

在这里插入图片描述

原理图:
在这里插入图片描述
仿真图:
在这里插入图片描述

程序设计

//程序头函数
#include <reg52.h>
//宏定义
#define uint unsigned int 
#define uchar unsigned char
//管脚声明
//输出
sbit LED_wenduH= P1^2;		   //温度上限
sbit LED_wenduL= P1^3;		   //温度下限
sbit LED_yanwu = P1^4;		   //烟雾
sbit LED_LED   = P1^1;		   //开灯
sbit baojing= P2^3;			   //报警
//输入
sbit DQ = P2^0;				   //18b20
sbit door=P1^6;				   //霍尔传感器
sbit hongwai=P1^7;			   //热释电
sbit light=P1^5;			   //光线传感器
//1602_245
sbit CE_1602=P1^0;			   //245的CE
//ADC0809
sbit ST=P2^7;
sbit EOC=P2^6;
sbit OE=P2^5;
//按键
sbit owner=P3^4;			   //主人是否在家切换
sbit Key1=P3^5;				   //设置
sbit Key2=P3^6;				   //加
sbit Key3=P3^7;				   //减
//LCD管脚声明
sbit LCDRS = P3^2;
sbit LCDEN= P3^3;

//LCD数组
uchar code Init1[] ="T:     C   E:   ";				  //第一行固定显示
uchar code Init2[] ="  Stay at home  ";				  //第二行主人在家时显示   
uchar code tab0[]  ="TH:   C TL:   C ";				  //第二行设置温度上下限时显示
uchar code tab1[]  ="EH:             ";				  //第二行设置烟雾上限是显示
uchar code tab2[]  ="Someone to enter";				  //第二行有人进入触发报警时显示
uchar code tab3[]  ="Master go out   ";				  //主人外出时显示

bit bdata flag_owner,BJ,shanshuo;
uchar Mode=0,m;

signed char w;     				//温度值全局变量
uint c; 					//温度值全局变量
bit bdata flag=0,flag_BJ,flag_set;
//酒精含量变量
uchar temp;					  //酒精值
uchar wendu_H=28;			  //温度值上限
uchar wendu_L=15;			  //温度值下限
uchar yanwu_H=50;			  //烟雾上限  

//函数声明
extern uchar ADC0809();
extern void Key();


//LCD延时
void LCDdelay(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
    for(y=10;y>0;y--);
}

//写命令
void write_com(uchar com)
{
	P0=0xff;
	CE_1602=0;		   //液晶工作时,CE置0,245向液晶传输数据
  LCDRS=0;	
  P0=com;
  LCDdelay(5);
  LCDEN=1;
  LCDdelay(5);
  LCDEN=0;
  CE_1602=1;		   //传输完后置高电平
  P0=0xff;
}
//写数据


void write_data(uchar date)
{
	P0=0xff;
	CE_1602=0;
  LCDRS=1;
  P0=date;
  LCDdelay(5);	
  LCDEN=1;
  LCDdelay(5);
  LCDEN=0; 
  CE_1602=1;
  P0=0xff;
}


//1602初始化//   显示屏幕
void Init1602()
{
  uchar i=0;
  write_com(0x38);//屏幕初始化
  write_com(0x0c);//打开显示 无光标 无光标闪烁
  write_com(0x06);//当读或写一个字符是指针后一一位
  write_com(0x01);//清屏
  write_com(0x80);//设置位置

  for(i=0;i<16;i++)
  {
		write_data(Init1[i]);
  }
  write_com(0x80+0x40);//设置位置
  for(i=0;i<16;i++)
  {
		write_data(Init2[i]);
  }
}

//配合写程序实现显示温度和烟雾在屏幕上,分模式

void Display_1602()
{	 uchar i;
	//时时温度
	write_com(0x80+2);		   //指定第一行第二列
	write_data(0x30+c/100);	   //开始显示温度值的百位,。例如温度值时123,123除以100的商是1,显示的就是1,+0x30的目的是得到液晶中数字的显示码
	write_data(0x30+c%100/10); //123除以100的余数是23,23再除以10得到的商是2,这里显示的就是2
	write_data('.');		   //显示小数点
	write_data(0x30+c%10);	   //23除以10的余数是3,这里显示的就是3
	write_data(0xdf);		   //显示°

	//时时烟雾
	write_com(0x80+13);
	write_data(0x30+temp/100);
	write_data(0x30+temp%100/10);
	write_data(0x30+temp%10);

	
	if(flag_owner==0)			  //主人在家时
	{
		write_com(0x80+0x40);//设置位置
		if (Mode==0)		 //不是设置状态时    0
		for(i=0;i<16;i++)	 //正常显示
		write_data(Init2[i]);
		else if(Mode==1||Mode==2)//设置状态时    1,2
		{
			for(i=0;i<3;i++)			   //显示上限值
			write_data(tab0[i]);
			if(shanshuo==0||Mode==2)
			{
				write_data(0x30+wendu_H/10);
				write_data(0x30+wendu_H%10);
			}
			else if(shanshuo==1&&Mode==1)  //shanshuo控制字符闪烁   1
			{
				write_data(' ');
				write_data(' ');
			}
			
			write_data(0xdf);				//显示°
			
			for(i=6;i<11;i++)
			write_data(tab0[i]);			//显示下限
			if(shanshuo==0||Mode==1)
			{
				write_data(0x30+wendu_L/10);
				write_data(0x30+wendu_L%10);
			}
			else if(shanshuo==1&&Mode==2)
			{
				write_data(' ');
				write_data(' ');
			}
			write_data(0xdf);				 //显示°
			write_data('C');				 //显示字母C
			write_data(' ');				 //空格
		}
		else if(Mode==3)					 //设置烟雾报警值
		{	write_com(0x80+0x40);			 //设置位置
			for(i=0;i<3;i++)
			write_data(tab1[i]);
			if(shanshuo==0)
			{
				write_data(0x30+yanwu_H/100);
				write_data(0x30+yanwu_H%100/10);
				write_data(0x30+yanwu_H%10);
			}
			else if(shanshuo==1&&Mode==3)
			{
				write_data(' ');
				write_data(' ');
				write_data(' ');
			}
			
			for(i=6;i<16;i++)
			write_data(tab1[i]);
				
		}
	}
	else if(flag_owner==1)				//主人外出
	{
		write_com(0x80+0x40);//设置位置
		if(flag_BJ==0)
		for(i=0;i<16;i++)
		write_data(tab3[i]);
		if(flag_BJ==1)
		for(i=0;i<16;i++)
		write_data(tab2[i]);
	}	
}
//1ms延时程序
void delay(uint z)
{
	uint i,j;
	for(i=0;i<z;i++)
	for(j=0;j<121;j++);
}
/*****18b20延时子程序*****///
void Delay_DS18B20(int num)
{
  while(num--) ;
}
/*****初始化DS18B20*****///
void Init_DS18B20(void)
{
  unsigned char x=0;
  DQ = 1;         //DQ复位
  Delay_DS18B20(8);    //稍做延时
  DQ = 0;         //单片机将DQ拉低
  Delay_DS18B20(80);   //精确延时,大于480us
  DQ = 1;         //拉高总线
  Delay_DS18B20(14);
  x = DQ;           //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
  Delay_DS18B20(20);
}
/*****读一个字节*****///
unsigned char ReadOneChar(void)
{
  unsigned char i=0;
  unsigned char dat = 0;
  for (i=8;i>0;i--)
  {
    DQ = 0;     // 给脉冲信号
    dat>>=1;
    DQ = 1;     // 给脉冲信号
    if(DQ)
    dat|=0x80;
    Delay_DS18B20(4);
  }
  return(dat);
}
/*****写一个字节*****/
void WriteOneChar(unsigned char dat)
{
  unsigned char i=0;
  for (i=8; i>0; i--)
  {
    DQ = 0;
    DQ = dat&0x01;
    Delay_DS18B20(5);
    DQ = 1;
    dat>>=1;
  }
}

附:http://www.jh-tec.cn/archives/7646

猜你喜欢

转载自blog.csdn.net/weixin_46018613/article/details/113480991