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

本文详细介绍了基于51单片机的智能家居防盗系统设计,包括人体红外热释电传感器的硬件连接和Proteus软件的仿真。通过硬件设计与程序设计,实现了系统的功能,确保了家庭安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

硬件设计

在这里插入图片描述

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

程序设计

//程序头函数
#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;
  }
}
### STM32 红外热传感器 Proteus 仿真教程 #### 设备准备 为了实现基于STM32单片机人体红外探测防盗报警系统Proteus仿真,需准备好相应的元件模型。主要组件包括STM32F103RCT6微控制器、HC-SR501人体感应模块(代表热红外传感器)、蜂鸣器以及LED指示灯等。 #### 组件放置与连线 在Proteus ISIS环境中打开新项目文件并依次添加上述提到的所有必要部件到工作区中。对于HC-SR501模块而言,其VCC脚应接到源正极(+5V),GND接地;OUT信号输出端口则要连接至STM32开发板上的任意GPIO引脚上用于接收中断触发信号[^1]。 ```plaintext HC-SR501 -> STM32 VCC -> +5V Power Supply GND -> GND (Ground) OUT -> GPIO Pin (e.g., PA0) ``` #### 配置STM32CubeMX工具链 利用STM32CubeMX配置目标MCU的时钟树结构及时钟频率参数,并开启外部中断功能以便处理来自PIR传感器产生的脉冲事件。同时,在Pinout&Configuration界面下指定好对应IO接口的功能定义——即把PA0设为EXTI Line In Mode模式下的输入通道之一。 #### 编写固件代码逻辑 编写适用于该应用场景下的嵌入式应用程序框架,当检测到来自外界环境变化引起的人体移动时立即激活警报装置发出声音提示并通过点亮红色警示灯光来告知用户有异常情况发生。具体来说就是监测PA0管脚状态的变化,一旦发现低平跳变转高平时就启动定时器延时一段时间后再控制继器闭合从而驱动喇叭发声和发光二极管亮起形成完整的告警机制。 ```c #include "main.h" #define LED_PIN GPIO_PIN_5 #define BUZZER_PIN GPIO_PIN_4 #define PIR_SENSOR_PIN GPIO_PIN_0 void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1){ if(HAL_GPIO_ReadPin(GPIOA, PIR_SENSOR_PIN)){ /* Trigger Alarm */ HAL_GPIO_WritePin(GPIOD, LED_PIN | BUZZER_PIN , SET); // Add delay here as needed /* Reset after alarm period ends */ HAL_GPIO_WritePin(GPIOD, LED_PIN | BUZZER_PIN , RESET); } } } // Initialization and configuration functions omitted for brevity. ``` #### 测试验证效果 完成以上步骤之后就可以运行整个工程看看能否达到预期目的了。如果一切正常的话每当有人靠近安装位置附近经过时就会听到短促而尖锐的声音并且看到红光闪烁表示系统正在执行保护措施防止非法入侵行为的发生。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值