当前位置: 首页 > article >正文

【Proteus仿真】【51单片机】智能家居检测与控制系统

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用Proteus8仿真51单片机控制器,使用按键、LCD1602液晶、DHT11温湿度模块、HC05/06蓝牙、人体红外传感器、继电器、加湿器、空调制冷制热、热水器等。
主要功能:
系统运行后,LCD1602显示检测温度和湿度、系统模式、安防状态、有无人、时间;
系统处于自动模式,可按下K5键打开安防,如果检测有人,蜂鸣器报警;无人,报警取消;
可按下K3键进入阈值设置模式,K3切换参数和时间,K1和K2调节,K4键确定并返回主界面;
如果检测温度高于上限,打开空调制冷,如果低于下限,打开空调制热;
如果检测湿度高于上限,关闭加湿器,如果低于下限,打开加湿器;
如果热水器开启时间到达,热水器打开;如果热水器关闭时间到达,热水器关闭;
可按下K4键切换为手动模式,K1控制加湿器开关,K2控制空调开关,K5控制热水器开关;
可通过蓝牙发送检测温湿度数据,并控制加湿器、空调、热水器设备;
蓝牙控制指令如下:(十六进制)
0X01–>K1键功能
0X02–>K2键功能
0X03–>K3键功能
0X04–>K4键功能
0X05–>K5键功能


二、软件设计

/*
作者:嗨小易(QQ技术交流群:570487280)

*/



//系统数据设置
void sys_data_set(void)
{
	u8 key=0;
	key=key_scan(0);

	//设置
	if(key==KEY3_PRESS || UART_RX_BUF[0]==KEY3_CMD)
	{
		sys_ctrl.mode++;
		if(sys_ctrl.mode>10)sys_ctrl.mode=1;
		sys_parm_set_show();//系统参数设置界面显示
	}
	//设置模式
	if(sys_ctrl.mode!=0)
	{
		//加
		if(key==KEY1_PRESS || UART_RX_BUF[0]==KEY1_CMD)
		{
			switch(sys_ctrl.mode)
			{
				case 1://温度下
					sys_ctrl.set_temp[0]++;
					if(sys_ctrl.set_temp[0]>99)sys_ctrl.set_temp[0]=0;
					break;
				case 2://温度上
					sys_ctrl.set_temp[1]++;
					if(sys_ctrl.set_temp[1]>99)sys_ctrl.set_temp[1]=0;
					break;
				case 3://湿度下
					sys_ctrl.set_humi[0]++;
					if(sys_ctrl.set_humi[0]>99)sys_ctrl.set_humi[0]=0;
					break;
				case 4://湿度上
					sys_ctrl.set_humi[1]++;
					if(sys_ctrl.set_humi[1]>99)sys_ctrl.set_humi[1]=0;
					break;
				case 5://开-时
					sys_ctrl.set_time[0][0]++;
					if(sys_ctrl.set_time[0][0]>23)sys_ctrl.set_time[0][0]=0;
					break;
				case 6://开-分
					sys_ctrl.set_time[0][1]++;
					if(sys_ctrl.set_time[0][1]>59)sys_ctrl.set_time[0][1]=0;
					break;
				case 7://开-秒
					sys_ctrl.set_time[0][2]++;
					if(sys_ctrl.set_time[0][2]>59)sys_ctrl.set_time[0][2]=0;
					break;
				case 8://关-时
					sys_ctrl.set_time[1][0]++;
					if(sys_ctrl.set_time[1][0]>23)sys_ctrl.set_time[1][0]=0;
					break;
				case 9://关-分
					sys_ctrl.set_time[1][1]++;
					if(sys_ctrl.set_time[1][1]>59)sys_ctrl.set_time[1][1]=0;
					break;
				case 10://关-秒
					sys_ctrl.set_time[1][2]++;
					if(sys_ctrl.set_time[1][2]>59)sys_ctrl.set_time[1][2]=0;
					break;
			}	
		}
		//减
		else if(key==KEY2_PRESS || UART_RX_BUF[0]==KEY2_CMD)
		{
			switch(sys_ctrl.mode)
			{
				case 1://温度下
					sys_ctrl.set_temp[0]--;
					if(sys_ctrl.set_temp[0]<0)sys_ctrl.set_temp[0]=99;
					break;
				case 2://温度上
					sys_ctrl.set_temp[1]--;
					if(sys_ctrl.set_temp[1]<0)sys_ctrl.set_temp[1]=99;
					break;
				case 3://湿度下
					sys_ctrl.set_humi[0]--;
					if(sys_ctrl.set_humi[0]<0)sys_ctrl.set_humi[0]=99;
					break;
				case 4://湿度上
					sys_ctrl.set_humi[1]--;
					if(sys_ctrl.set_humi[1]<0)sys_ctrl.set_humi[1]=99;
					break;
				case 5://开-时
					sys_ctrl.set_time[0][0]--;
					if(sys_ctrl.set_time[0][0]<0)sys_ctrl.set_time[0][0]=23;
					break;
				case 6://开-分
					sys_ctrl.set_time[0][1]--;
					if(sys_ctrl.set_time[0][1]<0)sys_ctrl.set_time[0][1]=59;
					break;
				case 7://开-秒
					sys_ctrl.set_time[0][2]--;
					if(sys_ctrl.set_time[0][2]<0)sys_ctrl.set_time[0][2]=59;
					break;
				case 8://关-时
					sys_ctrl.set_time[1][0]--;
					if(sys_ctrl.set_time[1][0]<0)sys_ctrl.set_time[1][0]=23;
					break;
				case 9://关-分
					sys_ctrl.set_time[1][1]--;
					if(sys_ctrl.set_time[1][1]<0)sys_ctrl.set_time[1][1]=59;
					break;
				case 10://关-秒
					sys_ctrl.set_time[1][2]--;
					if(sys_ctrl.set_time[1][2]<0)sys_ctrl.set_time[1][2]=59;
					break;
			}	
		}
		//确定
		else if(key==KEY4_PRESS || UART_RX_BUF[0]==KEY4_CMD)
		{
			sys_ctrl.mode=0;
			sys_open_show();//系统开机界面显示	
		}	
	}
	//正常模式
	else
	{
		//自动手动模式
		if(key==KEY4_PRESS || UART_RX_BUF[0]==KEY4_CMD)
		{
			sys_ctrl.auto_flag=!sys_ctrl.auto_flag;	
		}
		//安防
		else if(key==KEY5_PRESS || UART_RX_BUF[0]==KEY5_CMD)
		{
			sys_ctrl.af_onoff=!sys_ctrl.af_onoff;
		}

		//手动模式
		if(sys_ctrl.auto_flag==1)
		{
			//加湿
			if(key==KEY1_PRESS || UART_RX_BUF[0]==KEY1_CMD)
			{
				sys_ctrl.js_onoff=!sys_ctrl.js_onoff;
			}
			//空调
			else if(key==KEY2_PRESS || UART_RX_BUF[0]==KEY2_CMD)
			{
				sys_ctrl.kt_onoff++;
				if(sys_ctrl.kt_onoff>2)sys_ctrl.kt_onoff=0;
			}
			//热水器
			else if(key==KEY5_PRESS || UART_RX_BUF[0]==KEY5_CMD)
			{
				sys_ctrl.rsq_onoff=!sys_ctrl.rsq_onoff;
			}		
		}	
	}
	
	if(UART_RX_BUF[0]!=0)UART_RX_BUF[0]=0;			
}

//系统功能控制
void sys_fun_ctrl(void)
{
	//正常模式
	if(sys_ctrl.mode==0)
	{
		//自动模式
		if(sys_ctrl.auto_flag==0)
		{
			//如果温度高于上限,打开空调制冷
			if(sys_ctrl.temp>sys_ctrl.set_temp[1])sys_ctrl.kt_onoff=1;
			//如果温度低于下限,打开空调制热
			else if(sys_ctrl.temp<sys_ctrl.set_temp[0])sys_ctrl.kt_onoff=2;
			else sys_ctrl.kt_onoff=0;
			
			//如果湿度高于上限,关闭加湿器
			if(sys_ctrl.humi>sys_ctrl.set_humi[1])sys_ctrl.js_onoff=0;
			//如果湿度低于下限,打开加湿器
			else if(sys_ctrl.humi<sys_ctrl.set_humi[0])sys_ctrl.js_onoff=1;

			//如果热水器开启时间到达
			if(sys_ctrl.time[0]==sys_ctrl.set_time[0][0] && 
				sys_ctrl.time[1]==sys_ctrl.set_time[0][1] &&
				sys_ctrl.time[2]==sys_ctrl.set_time[0][2])
			{
				sys_ctrl.rsq_onoff=1;
			}
			//如果热水器关闭时间到达
			if(sys_ctrl.time[0]==sys_ctrl.set_time[1][0] && 
				sys_ctrl.time[1]==sys_ctrl.set_time[1][1] &&
				sys_ctrl.time[2]==sys_ctrl.set_time[1][2])
			{
				sys_ctrl.rsq_onoff=0;
			}
		}
		//如果安防开启,检测有人,报警
		if(sys_ctrl.af_onoff==1)
		{
			if(sys_ctrl.man==1)beep_alarm(10,1000);//报警	
		}

		//设备控制
		if(sys_ctrl.js_onoff==0)JS_PIN=1;
		else JS_PIN=0;
		if(sys_ctrl.rsq_onoff==0)RSQ_PIN=1;
		else RSQ_PIN=0;
		if(sys_ctrl.kt_onoff==0){ZL_PIN=1;ZR_PIN=1;}
		else if(sys_ctrl.kt_onoff==1){ZL_PIN=0;ZR_PIN=1;}
		else if(sys_ctrl.kt_onoff==2){ZL_PIN=1;ZR_PIN=0;}
	}
}

//应用控制系统
void appdemo_show(void)
{
	u8 i=10;
	sys_parm_init();//系统参数初始化
	lcd1602_init();
	DHT11_Init();
	time0_init();//定时器初始化,10ms
	TR0=1;//打开定时器
	UART_Init();//波特率4800
	UART_SendString("UART Init OK\r\n");
	sys_open_show();//系统开机界面显示

	while(1)
	{	
		sys_data_get();//系统数据获取
		sys_data_show();//系统数据显示
		sys_data_set();//系统数据设置
		sys_fun_ctrl();//系统功能控制
	}
}

//定时器0中断函数
void time0() interrupt 1 
{	
	static u8 i=0;

	TH0=0XDC;	//给定时器赋初值,定时10ms
	TL0=0X00;

	i++;
	if(i>=100)//1S
	{
		i=0;
		sys_ctrl.time[2]++;
		if(sys_ctrl.time[2]>59)
		{
			sys_ctrl.time[2]=0;
			sys_ctrl.time[1]++;
			if(sys_ctrl.time[1]>59)
			{
				sys_ctrl.time[1]=0;
				sys_ctrl.time[0]++;
				if(sys_ctrl.time[0]>23)sys_ctrl.time[0]=0;
			}
		}
	}	
}




三、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

联系作者

视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。


http://www.kler.cn/a/575865.html

相关文章:

  • mfc140u.dll是什么?当程序遭遇mfc140u.dll问题:快速恢复正常的秘诀
  • 【基础1】冒泡排序
  • 微信小程序注册组件
  • GaussDB安全配置指南:从认证到防御的全方面防护
  • Centos操作系统大全(附ISO镜像下载)
  • 【附源码】Java动漫视频网站源码【带弹幕系统】+SpringBoot+VUE+前后端分离
  • 遵义市招生管理信息系统的开发与实现
  • CentOS7安装Mysql5.7(ARM64架构)
  • 基于SNR估计的自适应码率LDPC编译码算法matlab性能仿真,对比固定码率LDPC的系统传输性能
  • windows:curl: (60) schannel: SEC_E_UNTRUSTED_ROOT (0x80090325)
  • 使用Galaxy创建生物信息学工作流的步骤详解
  • 可视化大屏出圈密码:地图组件深度解析
  • 淘宝关键字搜索接口爬虫测试实战指南
  • TypeError: Cannot create property ‘xxx‘ on string ‘xxx‘
  • STM32 子设备通过CAN发送数据到主设备
  • 【游戏】【客户端性能测试】
  • QILSTE灯珠:尺寸光电全解析
  • 1688平台API接口实战:Python实现店铺全量商品数据抓取
  • 工程化与框架系列(22)--前端性能优化(中)
  • OpenHarmony子系统开发编译构建指导