【Proteus仿真】【32单片机】温湿度光敏检测系统设计

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

联系作者

一、主要功能

1、温湿度检测,光敏检测与LCD显示
2、超过上限,降温除湿模块启动
3、低于下限,升温增湿模块启动
4、光照强度低于阈值,打开灯,若光照强度高于阈值,关闭灯
5、温湿度,光敏阈值设置
6、超限报警

二、使用步骤

系统运行后,LCD1602显示传感器检测的温湿度值和光照值;
当温度或者湿度高于上限,降温除湿模块启动,报警器启动。
若温度或者湿度低于下限,升温增湿模块启动,报警器启动。
若光照强度低于阈值,打开灯,若光照强度高于阈值,关闭灯。

三、硬件资源

1、32单片机核心模块
2、按键模块
3、DHT11温湿度传感器模块 光敏传感器
4、蜂鸣器模块
5、继电器模块
6、LCD1602显示模块

四、软件设计


//外部中断
void EXTI15_10_IRQHandler(void)
{
	delay_ms(50);
	if(KEY1 == 0)
	{	
		if(Set_num==0)
		{
			LcdClean();
			display_value();     //阈值函数
		}
		Set_num++;//设置位增加
//		TIM_ITConfig( TIM2,TIM_IT_Update,DISABLE );//关闭定时器2

		if(Set_num>5)
		{
			LcdWriteCom(0x0C);//取消光标闪烁	
			LcdClean();//清屏
			LcdInit();//主显示
//			TIM_ITConfig( TIM2,TIM_IT_Update,ENABLE );//打开定时器2	
			Set_num=0;
		}
		while(KEY1 == 0);
	}
	if(KEY2 == 0)
	{
		if(Set_num==1)//设置温度阈值L
		{
			if(TL<TH-1)
				TL++;
			LcdWriteCom(0x80+9); //第一行
			LcdWriteData(TL/10+0x30);	
			LcdWriteData(TL%10+0x30);
			LcdWriteCom(0x80+10); //第一行
			LcdWriteCom(0x0f);                                    // 光标闪烁
		}
		else if(Set_num==2)//设置阈值H
		{
			if(TH<99)
				TH++;
			LcdWriteCom(0x80+14); //第一行
			LcdWriteData(TH/10+0x30);	
			LcdWriteData(TH%10+0x30);	
			LcdWriteCom(0x80+15); //第一行
			LcdWriteCom(0x0f);                                    // 光标闪烁
		}
		else if(Set_num==3)//设置湿度阈值L
		{
			if(HL<HH-1)
				HL++;
			LcdWriteCom(0x80+0x40+9); //第二行
			LcdWriteData(HL/10+0x30);	
			LcdWriteData(HL%10+0x30);
			LcdWriteCom(0x80+0x40+10); //第二行
			LcdWriteCom(0x0f);                                    // 光标闪烁
		}
		else if(Set_num==4)//设置阈值H
		{
			if(HH<99)
				HH++;
			LcdWriteCom(0x80+0x40+14); //第二行
			LcdWriteData(HH/10+0x30);	
			LcdWriteData(HH%10+0x30);	
			LcdWriteCom(0x80+0x40+15); //第二行
			LcdWriteCom(0x0f);                                    // 光标闪烁
		}
		else if(Set_num==5)//设置光照阈值
		{
			if(Light_L<300)
				Light_L=Light_L+10;
			LcdWriteCom(0x80+0x40+2); //第二行
			LcdWriteData(Light_L/100+0x30);	
			LcdWriteData(Light_L%100/10+0x30);	
			LcdWriteData(Light_L%10+0x30);	
			LcdWriteCom(0x80+0x40+4); //第二行
			LcdWriteCom(0x0f);                                    // 光标闪烁
		}
		while(KEY2 == 0);
	}
	if(KEY3 == 0)
	{
		if(Set_num==1)//设置温度阈值L
		{
			if(TL>0)
				TL--;
			LcdWriteCom(0x80+9); //第一行
			LcdWriteData(TL/10+0x30);	
			LcdWriteData(TL%10+0x30);	
			LcdWriteCom(0x80+10); //第一行
			LcdWriteCom(0x0f);                                    // 光标闪烁
		}
		else if(Set_num==2)//设置阈值H
		{
			if(TH>TL+1)
				TH--;
			LcdWriteCom(0x80+14); //第一行
			LcdWriteData(TH/10+0x30);	
			LcdWriteData(TH%10+0x30);
			LcdWriteCom(0x80+15); //第一行
			LcdWriteCom(0x0f);                                    // 光标闪烁
		}
		else if(Set_num==3)//设置湿度阈值L
		{
			if(HL>0)
				HL--;
			LcdWriteCom(0x80+0x40+9); //第二行
			LcdWriteData(HL/10+0x30);	
			LcdWriteData(HL%10+0x30);	
			LcdWriteCom(0x80+0x40+10); //第二行
			LcdWriteCom(0x0f);                                    // 光标闪烁
		}
		else if(Set_num==4)//设置阈值H
		{
			if(HH>HL+1)
				HH--;
			LcdWriteCom(0x80+0x40+14); //第二行
			LcdWriteData(HH/10+0x30);	
			LcdWriteData(HH%10+0x30);
			LcdWriteCom(0x80+0x40+15); //第二行
			LcdWriteCom(0x0f);                                    // 光标闪烁
		}
		else if(Set_num==5)//设置光照阈值
		{
			if(Light_L>0)
				Light_L=Light_L-10;
			LcdWriteCom(0x80+0x40+2); //第二行
			LcdWriteData(Light_L/100+0x30);	
			LcdWriteData(Light_L%100/10+0x30);	
			LcdWriteData(Light_L%10+0x30);	
			LcdWriteCom(0x80+0x40+4); //第二行
			LcdWriteCom(0x0f);                                    // 光标闪烁
		}
		while(KEY3 == 0);
	}
	if(EXTI_GetITStatus(EXTI_Line13) != RESET)//判断中断标志线是否13
	{				
		EXTI_ClearITPendingBit(EXTI_Line13); //清除LINE13上的中断标志位
	}
  if(EXTI_GetITStatus(EXTI_Line14) != RESET)//判断中断标志线是否14
	{				
		EXTI_ClearITPendingBit(EXTI_Line14); //清除LINE14上的中断标志位
	}		
  if(EXTI_GetITStatus(EXTI_Line15) != RESET)//判断中断标志线是否15
	{	
		EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE15上的中断标志位
	}
	 
}

#include "delay.h"
#include "sys.h"
#include "1602.h"
#include "exti.h"
#include "key.h"
#include "dht11.h"
#include "Tool.h"
#include "ADC.h"
u8 temperature;  //温度	
u8 humidity;     //湿度
u16 Light_value; //光照检测值
u8 TH = 35;      //温度阈值H
u8 TL = 25;      //温度阈值L
u8 HH = 60;      //湿度阈值H
u8 HL = 20;      //湿度阈值L
u16 Light_L=100;     //光照阈值

u8 Set_num=0;		//设置标志位
void Delay(int num)
{
	while(num--) ;
}
void display_data(void)///显示
{	
	LcdWriteCom(0x0C);	  		                            //取消光标闪烁	
	LcdWriteCom(0x80+2); //第一行
	LcdWriteData(temperature%100/10+0x30);
	LcdWriteData(temperature%100%10+0x30);	
	LcdWriteCom(0x80+11); //第一行
	LcdWriteData(humidity%100/10+0x30);
	LcdWriteData(humidity%100%10+0x30);
	LcdWriteCom(0x80+0x40+7); //第二行
	LcdWriteData(Light_value%1000/100+0x30);
	LcdWriteData(Light_value%100/10+0x30);
	LcdWriteData(Light_value%10+0x30);
}
void display_value(void)//显示阈值
{	
	LcdWriteCom(0x80); //第一行
	LcdWritestr("Set   TL:00-H:00");
  LcdWriteCom(0x80+4); //第一行
	LcdWriteCom(0x80+0x40); //第二行
	LcdWritestr("G:000 HL:00-H:00");
	
	LcdWriteCom(0x80+9); //第一行
	LcdWriteData(TL/10+0x30);	
	LcdWriteData(TL%10+0x30);	
	LcdWriteCom(0x80+14); //第一行
	LcdWriteData(TH/10+0x30);	
	LcdWriteData(TH%10+0x30);	
	
	LcdWriteCom(0x80+0x40+2); //第二行
	LcdWriteData(Light_L/100+0x30);	
	LcdWriteData(Light_L%100/10+0x30);	
	LcdWriteData(Light_L%10+0x30);	
		
	LcdWriteCom(0x80+0x40+9); //第二行
	LcdWriteData(HL/10+0x30);	
	LcdWriteData(HL%10+0x30);	
	LcdWriteCom(0x80+0x40+14); //第二行
	LcdWriteData(HH/10+0x30);	
	LcdWriteData(HH%10+0x30);	
}
void Alarm(void)//警报函数
{	
	if(Light_value<Light_L)
		LED = 0;//开灯
	else
		LED = 1;//关灯
	if(temperature<=TL||humidity<=HL)//温度过低或湿度过低
	{
		BEEP=0;
		MOT1=0;
		MOT2=1;
	}
	else if(temperature>=TH||humidity>=HH)//温度过高或湿度过大
	{
		BEEP=0;
		MOT1=1;
		MOT2=0;
	}
	else
	{
		BEEP=1;
		MOT1=1;
		MOT2=1;
	}
}
int main()
{	
	delay_init();	    	 //延时函数初始化
	LCD1602_Init();      //lcd函数初始化
	ADC1_Init();      //adc函数初始化
	NVIC_Configuration(); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 
	EXTIX_Init();//外部中断初始化 
	DHT11_Init();	
	DHT11_Read_Data(&temperature,&humidity);//获取温湿度度

	TOOL_Init();         //工具初始化

	while(1) 
	{		
		DHT11_Read_Data(&temperature,&humidity);//获取温湿度度
		middleAverageFilter();//获取光照强度
		switch(Set_num)
		{
			case 0:display_data();Alarm();//警报函数		
				break;
			case 1:
	
					BEEP=1;MOT1=1;MOT2=1;//设置阈值关闭警报
					LcdWriteCom(0x80+10); //第一行
				  LcdWriteCom(0x0f);  // 光标闪烁				
				break;//温度阈值L
			case 2:
					LcdWriteCom(0x80+15); //第一行
				  LcdWriteCom(0x0f);  // 光标闪烁				
				break;//温度阈值H
			case 3:
					BEEP=1;MOT1=1;MOT2=1;//设置阈值关闭警报
					LcdWriteCom(0x80+0x40+10); //第二行
				  LcdWriteCom(0x0f);  // 光标闪烁				
				break;//湿度阈值L
			case 4:
					LcdWriteCom(0x80+0x40+15); //第二行
				  LcdWriteCom(0x0f);  // 光标闪烁				
				break;//湿度阈值H
			case 5:
					LcdWriteCom(0x80+0x40+4); //第二行
				  LcdWriteCom(0x0f);  // 光标闪烁				
				break;//光照阈值

			
		}
	}	  
}






五、实验现象

B站演示视频:

基于STM32单片机温湿度光敏检测系统仿真_哔哩哔哩_bilibili本项目使用Proteus8仿真STM32单片机的温湿度光敏检测系统使用LCD1602液晶、按键、蜂鸣器、升温模块、降温、DHT11传感器,光敏传感器等。主要功能如下:1、温湿度检测,光敏检测与LCD显示2、超过上限,降温除湿模块启动3、低于下限,升温增湿模, 视频播放量 1、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 1, 视频作者 单片机设计室, 作者简介 Q:215138327 V:Kinpar 承接51,32单片机设计定做,51,32单片机protues仿真,实物,程序等。,相关视频:基于STM32单片机DS18B20温度检测系统仿真,基于STM32单片机DHT11温湿度检测系统仿真,邻国日本创新的人形机器人关节结构,以军袭击将目标“团灭”,五点分析战况,“抵抗之弧”箭在弦上,基于51单片机的RLC测量仪系统,15 款独特的飞行器,顶级驱逐舰055有多强?主炮堪比陆军重炮!防空反舰全精通,8086汇编语言的八路抢答器,基于51单片机的篮球计分器,科技元素火柴人https://www.bilibili.com/video/BV1RUxve7Eu9/

联系作者

作者B站链接:https://space.bilibili.com/3493294220773802

专注于51单片机、STM32、Proteus、物联网软件开发,PCB设计。

作者:qq_215138327

物联沃分享整理
物联沃-IOTWORD物联网 » 【Proteus仿真】【32单片机】温湿度光敏检测系统设计

发表回复