51单片机温室大棚温湿度光照控制系统资料包括原理图,PCB文件,源程序,一些软件等,仿真文件。 设计简介: (1)51单片机+DHT11温湿度传感器+GY-30光照传感器+1602液晶; (2)温度检测范围0-50度; (3)湿度检测范围20%-95%; (4)光照检测范围1-65535勒克斯; (5)有3个按键,用来设置温度、湿度和光照强度的报警范围; (6)有6个指示灯,分别代表温度过高、温度过低、湿度过高、湿度过低、光照过低、光照过高; (7)超出设置的正常范围,声光报警(蜂鸣器+LED灯); 程序有详细注释。
这个51单片机项目挺有意思的,核心就是让单片机当大棚管家,实时盯着温湿度光照。咱们直接上干货,看看怎么用STC89C52配上一堆传感器实现环境监控。
硬件全家福:DHT11负责温湿度(注意这货不能测零下),GY-30光照传感器(I2C接口挺省事),1602液晶显示数据。三个按键用来调阈值,六个LED当状态指示灯,超标了就亮红灯+蜂鸣器哔哔叫。
主程序骨架:
`c
void main() {
init_all(); // 外设初始化三连
read_thresholds(); // 从EEPROM读取上次设定的阈值
while(1) {
read_sensors(); // 采集三要素
update_display(); // 液晶刷数据
check_alarm(); // 阈值比对
key_scan(); // 按键检测
delay(1000); // 悠着点采样
}
}
`
这个主循环像极了打工人的日常——每隔1秒就采集数据、刷新屏幕、检查异常,顺带看看有没有人按按键改设置。
DHT11数据读取要点:
这个温湿度传感器有点小脾气,时序必须卡准。代码里专门用nop()做精准延时:
`c
// 启动信号
void DHT11_start() {
DATA = 0;
delay18ms(); // 主机拉低18ms
DATA = 1;
delay30us(); // 然后拉高20-40us
}
`
注意DATA引脚需要切换输入输出模式,这里用了端口模式寄存器配置技巧。数据格式是5字节,校验和得算对,不然数据会抽风。
GY-30光照采集:
这个BH1750模块比ADC光敏电阻稳多了,I2C通讯要注意地址0x23。连续测量模式代码:
`c
void BH1750Write(uint8t cmd) {
I2C_Start();
I2C_SendByte(0x46); // 写指令
I2C_WaitAck();
I2C_SendByte(cmd);
I2C_WaitAck();
I2C_Stop();
}
`
读取时直接取两字节数据,拼成lux值。实测在强光下能到上万勒克斯,比传统方法量程大很多。
按键处理技巧:
三个按键分别对应温度、湿度、光照的阈值设置。长按进入设置模式,短按加减数值。状态机写法最靠谱:
`c
enum KEY_STATE { IDLE, PRESSED, HOLD };
static enum KEYSTATE keystate = IDLE;
51单片机温室大棚温湿度光照控制系统资料包括原理图,PCB文件,源程序,一些软件等,仿真文件。 设计简介: (1)51单片机+DHT11温湿度传感器+GY-30光照传感器+1602液晶; (2)温度检测范围0-50度; (3)湿度检测范围20%-95%; (4)光照检测范围1-65535勒克斯; (5)有3个按键,用来设置温度、湿度和光照强度的报警范围; (6)有6个指示灯,分别代表温度过高、温度过低、湿度过高、湿度过低、光照过低、光照过高; (7)超出设置的正常范围,声光报警(蜂鸣器+LED灯); 程序有详细注释。
void key_scan() {
if(KEY1 == 0) {
if(key_state == IDLE) {
key_state = PRESSED;
thresholdmode = (thresholdmode +1)%3; // 切换设置项
}
// 长按处理...
} else {
key_state = IDLE;
}
}
`
EEPROM存储设定值,断电不丢失。注意AT24C02的页写入限制,别跨页写入。
报警逻辑:
六个LED对应不同异常状态,用位域结构体管理最省RAM:
`c
struct AlarmFlags {
uint8t temphigh :1;
uint8t templow :1;
uint8t humihigh :1;
uint8t humilow :1;
uint8t lighthigh:1;
uint8t lightlow :1;
} alarms;
`
判断逻辑就是简单的大小比较,但加了回差防止临界值抖动:
`c
if(currenttemp > temphigh + 2) {
alarms.temp_high = 1;
beep_on();
}
`
蜂鸣器驱动加了脉冲调制,比直接电平驱动更省电,用定时器做个1KHz的PWM效果更佳。
1602显示优化:
液晶显示要避免频繁刷新,采用差异更新策略:
`c
static char last_temp[5] = " ";
void update_display() {
sprintf(current_temp, "%2dC", temp);
if(strcmp(currenttemp, lasttemp) != 0) {
lcdwrite(1, 5, currenttemp);
strcpy(lasttemp, currenttemp);
}
// 其他数据同理...
}
`
这样处理能避免屏幕闪烁,同时降低总线负载。
源码里还有看门狗、软件抗干扰这些实战技巧。比如在DHT11读取失败时自动重试,I2C总线超时检测等。整个工程结构清晰,模块化程度高,拿来改造成其他监控系统也很方便。