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

【开源】基于51单片机的温湿度检测报警系统 - 少年

项目开源链接

参数
VX公众号 少年潜行(可关注回复 A002温湿度检测 在对应文中获得网盘链接免费开源
Proteus8.9 链接:https://pan.baidu.com/s/1kkgFmRBlh268m_ESl83weg 提取码:9bde 复制这段内容后打开百度网盘手机App,操作更方便哦

📖 欢迎交流 如果对你有帮助,希望可以帮我点个赞👍和收藏,谢谢

有问题请在公众号后台回复,博客不能及时查看

V1.1 (2025_07_05更新)

更新内容

1、在V1.0基础上优化了LCD显示延时,使得LCD的显示更加迅速。
2、如果有问题,大家可以继续提出。大家就不要去下资源绑定里面的内容了,那个不能实时更新。

LCD显示优化

在实际仿真使用的时候LCD刷新会比较慢,使用实物的时候可以用原来的代码,仿真的时候可以把延时注释了,使用下面的函数,开头要加个1ms的延时,因为没有忙检测。

void LcdWriteCom(uint8_t com)	  //写入命令
{Lcd1602_Delay1ms(1);LCD1602_E = 0;     //使能LCD1602_RS = 0;	   //选择发送命令LCD1602_RW = 0;	   //选择写入LCD1602_DATAPINS = com;     //放入命令
//	Lcd1602_Delay1ms(1);		//等待数据稳定LCD1602_E = 1;	          //写入时序
//	Lcd1602_Delay1ms(5);	  //保持时间LCD1602_E = 0;
}void LcdWriteData(uint8_t dat)			//写入数据
{Lcd1602_Delay1ms(1);LCD1602_E = 0;	//使能清零LCD1602_RS = 1;	//选择输入数据LCD1602_RW = 0;	//选择写入LCD1602_DATAPINS = dat; //写入数据
//	Lcd1602_Delay1ms(1);LCD1602_E = 1;   //写入时序
//	Lcd1602_Delay1ms(5);   //保持时间LCD1602_E = 0;
}	

V1.0 基础内容

项目说明

该设计是一个简易的基于51单片机的温湿度检测报警系统,功能说明:

  1. 使用LCD1602实时显示当前的温湿度。
  2. 读取DHT11的温湿度值,如果温度大于最大设定值,LED1亮,如果温度小于最小设定值,LED2亮。如果湿度大于最大设定值,LED3亮,如果湿度小于最小设定值,LED4亮。
  3. 可以设置温度和湿度的上下限。

硬件设计

image

硬件设计如图,主要使用的是LED来展示当前值是否超过限制。使用DHT11做温湿度传感器,使用串口端口做一些简单的调试,LCD屏幕可以显示当前的温湿度,也可以显示最大最小的设置限制,通过按键改变目标值。

软件设计

按键的扫描和温湿度的最大最小值比较都在5ms中断中实现,界面显示和DHT11的读取放置在while循环中,使用的晶振是11.0592MHz,注意就是DHT11对时间比较敏感,我的时间us级别的延时都是使用的STCISP生成的,而且在读取值的时候需要把中断全部关闭,读取完成后再开启,中断打断也会有影响,如果你没有使用中断就不用管。
页面page变量等于1的时候,写了一个闪烁,其实原理就是使用一个计数器,计数到偶数的时候,使用空白字符将原来的数字覆盖,这样看着就好像是没显示了。

#include "main.h"
#include "delay.h"
#include "LCD1602.h"
#include "key.h"
#include "dht11.h"
#include "usart.h"
// 变量定义
sbit LED1 = P2^0;      
sbit LED2 = P2^1;    
sbit LED3 = P2^2;    
sbit LED4 = P2^3;    uint8_t  key_value = 0;   // 按键按下的值
uint8_t  hum_high  = 60, hum_low  = 30;//设置的湿度最大值和最小值
uint8_t  temp_high = 40, temp_low = 20;//设置的温度最大值和最小值
uint8_t humidity=0,      temperature=0;//实际的湿度值和温度值
uint8_t ui_page = 0;//实际的湿度值和温度值
uint8_t set_pos = 0;//设置序号 0:设置hum_high 1:设置hum_low 2:设置temp_high 3:设置temp_low
// 函数声明
void Timer0_Init(void);		//5毫秒@11.0592MHzvoid main()
{uint8_t  ret;uint8_t  blink_count = 0;LcdInit();Timer0_Init();UartInit();EA = 1;                 //打开所有中断SendBuffLen("hello world\r\n",sizeof("hello world\r\n"));while(1){	EA = 0;ret = DHT11_Get_Data(&humidity, &temperature) ;EA = 1;if(ui_page == 0){LcdShowStr(0,0,"  real  data  ");LcdShowStr(0,1,"hum:");LcdShowNumInt(4,1,humidity,2,1);LcdShowStr(6,1,"   ");LcdShowStr(9,1,"temp:");LcdShowNumInt(14,1,temperature,2,1);}else if(ui_page == 1){blink_count ++;LcdShowStr(0,0,"HumH:");LcdShowNumInt(5,0,hum_high,2,1);if(set_pos == 0 && (blink_count % 2 == 0) ){LcdShowStr(5,0,"  ");}LcdShowStr(7,0,"  ");LcdShowStr(9,0,"HumL:");LcdShowNumInt(14,0,hum_low,2,1);if(set_pos == 1 && (blink_count % 2 == 0) ){LcdShowStr(14,0,"  ");}LcdShowStr(0,1,"TmpH:");LcdShowNumInt(5,1,temp_high,2,1);if(set_pos == 2 && (blink_count % 2 == 0) ){LcdShowStr(5,1,"  ");}LcdShowStr(7,1,"  ");LcdShowStr(9,1,"TmpL:");LcdShowNumInt(14,1,temp_low,2,1);if(set_pos == 3 && (blink_count % 2 == 0) ){LcdShowStr(14,1,"  ");}}delay_ms(200);}
}// 检查当前温湿度的状态
// 如果温度大于设定值,LED1亮,如果温度小于设定值,LED2亮。
// 如果湿度大于设定值,LED3亮,如果湿度小于设定值,LED4亮。
void CheckLimits()
{if(temperature > temp_high){LED1 = 0;LED2 = 1;}else if(temperature < temp_low){LED1 = 1;LED2 = 0;}else  {LED1 = 1;LED2 = 1;}if(humidity > hum_high){LED3 = 0;LED4 = 1;}else if(humidity < hum_low){LED3 = 1;LED4 = 0;}else  {LED3 = 1;LED4 = 1;}
}// 5ms定时器中断,5MS执行一次
void Timer0Routine(void) interrupt 1
{
//	static int count = 0;// 5ms 定时值重置TL0 = 0x00;				//设置定时初始值TH0 = 0xEE;				//设置定时初始值// 按键扫描并获得值key_value = KeyScan();// 按键0按下 if(key_value == KEY0_PRES){if(ui_page == 1){if(set_pos == 0) hum_high++;else if(set_pos == 1) hum_low++;else if(set_pos == 2) temp_high++;else if(set_pos == 3) temp_low++;}}// 按键1按下 else if(key_value == KEY1_PRES){if(ui_page == 1){if(set_pos == 0) hum_high--;else if(set_pos == 1) hum_low--;else if(set_pos == 2) temp_high--;else if(set_pos == 3) temp_low--;}}// 按键2按下 else if(key_value == KEY2_PRES){if(ui_page == 0)ui_page = 1;else if(ui_page == 1)ui_page = 0;}// 按键3按下 else if(key_value == KEY3_PRES){if(ui_page == 1){set_pos ++;if(set_pos > 3)set_pos = 0;}}CheckLimits();
}void Timer0_Init(void)		//5毫秒@11.0592MHz
{TMOD &= 0xF0;			//设置定时器模式TMOD |= 0x01;			//设置定时器模式TL0 = 0x00;				//设置定时初始值TH0 = 0xEE;				//设置定时初始值TF0 = 0;				//清除TF0标志TR0 = 1;				//定时器0开始计时ET0 = 1;                //打开定时器中断
}

调试效果

1、显示当前的温度和湿度值

image

2、点击KEY2后,显示设定值,在显示过程中,对应可修改位的数字会闪烁,但是是因为是仿真,就闪的比较慢。点击KEY3,会修改当前的想要修改的数字位,比如原来在改湿度最大值HumH,按下KEY3后,增加减少按键就会改HumL,再按又换一个。改完后点击设置又返回主界面。

image

http://www.jsqmd.com/news/480566/

相关文章:

  • 2026年诚信PVDF工厂揭秘:行业前五如何靠品质赢得市场? - 企业推荐官【官方】
  • 小型粉碎机品牌众多,三创作为源头厂家排名怎样 - mypinpai
  • 鑫澜古建铝代木性价比高吗,2026年古建铝代木市场分析 - 工业品网
  • 绿色采暖时代加速:2026年主流空气能热水器品牌市场竞争力与格局解析 - 品牌推荐
  • MySQL迁移到金仓的集合类型支持实践:CREATE TYPE + SET 的兼容实现
  • 2026年苏州性价比高的家装公司盘点,说说苏州全屋定制装修 - 工业设备
  • 智能建筑入口全面升级:2026年主流自动门品牌市场竞争力与行业格局解析 - 品牌推荐
  • 剖析苏州室内装修,品牌推荐及个性化需求满足情况和报价探讨 - 工业品牌热点
  • 2026年广州价格优惠的衬衣定制厂家推荐,哪家服务周到 - mypinpai
  • 2026年行业内口碑好的彩印包装生产厂家有哪些,工业纸箱/彩印包装/纸箱/纸盒/农产品纸箱,彩印包装源头厂家口碑推荐 - 品牌推荐师
  • 2026年大型项目选型必看:自动门品牌精准适配指南与核心场景实测分析 - 品牌推荐
  • 2026徐州空间榜样装饰设计公司价格贵吗,成本控制揭秘 - 工业推荐榜
  • 2026年自动门品牌深度测评:基于极端环境适应性与智能集成的五维对比 - 品牌推荐
  • 聊聊2026年徐州有实力的装修公司推荐榜,费用怎么算 - 工业设备
  • 剖析上海AI录音笔品牌,芯连芯价格贵不贵? - myqiye
  • 分析2026年舟山亲子主题度假酒店性价比排名,选哪家不踩雷 - 工业品牌热点
  • 2026年万渠水泥制品好用吗,河南地区使用体验分享 - 工业品牌热点
  • 2026年3月自动门品牌决策咨询评测报告 - 品牌推荐
  • 国产openclaw重磅来袭,阿里 CoPaw vs 腾讯 WorkBuddy 安装部署全攻略
  • 周末安排生成器,输入预算,人数,偏好,自动推荐活动方案,告别选择困难。
  • 2026年危废暂存间领域,这些公司表现亮眼,防爆危废间/危废间/危废暂存间,危废暂存间制作厂商排行 - 品牌推荐师
  • 2026年不错的戒网瘾学校推荐,重庆冠毅教育育人模式怎么样 - 工业推荐榜
  • 消耗4000万Token后,我发现了OpenClaw的“吞金“真相(附完整优化方案)
  • 2026年苏州热门的GEO推广代理公司推荐,苏州蓝戈链企性价比高值得选 - myqiye
  • 兰州装修公司排名前十强施工质量对比——紫兰装饰德系工艺,匠心打造 - 装修热点在线
  • 2026年用户口碑最佳的自动门品牌推荐:五大品牌项目案例与稳定表现对比 - 品牌推荐
  • 2026年高端建筑项目必看:自动门品牌选型指南与核心性能指标实测对比 - 品牌推荐
  • 99%的人都在用的携程任我行礼品卡回收技巧 - 团团收购物卡回收
  • 实证分析中的代理变量:理论基础与应用案例
  • 2026年山东远大锅炉口碑推荐,生产工艺是否先进揭秘 - 工业推荐榜