- 基于单片机的蔬菜大棚温湿度远程测报系统设计
点击链接下载prrotues仿真设计资料:https://download.csdn.net/download/m0_51061483/92081514
- 系统概述
2.1 设计背景与应用意义
蔬菜大棚环境控制是现代设施农业中最重要的环节之一。温度与湿度作为影响作物生长的关键因素,对作物的光合作用、蒸腾作用、根系吸收、病虫害发生以及最终的产量和品质具有决定性作用。传统的大棚管理方式依赖人工巡查与经验调节,存在监测不连续、滞后性强、数据无法追溯等问题。一旦温湿度出现异常,往往不能在第一时间发现并处理,容易造成作物生长停滞、病害爆发甚至减产。
随着单片机技术与传感器技术的发展,使用嵌入式测控系统实现对大棚环境的自动采集、实时显示、远程通信与报警已成为一种高性价比且可靠的解决方案。本设计以 AT89S51(兼容 8051 内核)为核心,采用 DS18B20 温度传感器与 HS1101 湿度传感器采集大棚环境温湿度数据,并通过 RS485 接口与 PC 上位机通信,实现远程监测与报警。系统支持按键设置温湿度阈值上下限,单片机将实时测量值与预设标准值及误差范围进行比较,当超出范围时触发报警并可通过通信上报异常状态。现场端通过 LED 显示当前温湿度数值,使工作人员即使在没有上位机的情况下也能快速获取环境信息。
2.2 系统总体目标
系统围绕"大棚温湿度测量 + 远程监测 + 报警阈值可设定"实现以下目标:
1)使用 DS18B20 采集温度、使用 HS1101 采集湿度,实现稳定可靠的数据采集;
2)将传感器数据输入 AT89S51 单片机处理,进行滤波、换算与阈值比较;
3)通过 LED 显示温湿度数值,实现现场可视化;
4)通过 RS485 接口与 PC 上位机通信,实现远程监测、数据记录与报警提示;
5)支持温湿度阈值上限/下限设置,并保存参数,断电后不丢失(可选);
6)当温湿度超过阈值或误差范围时,触发现场报警并将报警信息通过 485 上传。
2.3 系统工作流程概览
系统运行流程可概括为:
- 传感器采集:DS18B20 读取温度,HS1101 读取湿度信号;
- 数据处理:单片机对采集值进行换算、校准、滤波;
- 本地显示:将温湿度数值实时显示在 LED 数码管或 LED 显示模块上;
- 阈值判断:比较温湿度与设定上下限,判断是否超限;
- 报警输出:超限时触发声光报警(可选)并形成报警标志;
- 远程通信:通过 RS485 将实时数据与报警状态发送给 PC,上位机显示并记录。
- 系统功能设计
3.1 温度采集功能(DS18B20)
DS18B20 是常用的数字温度传感器,采用 1-Wire 总线通信,仅需一根数据线即可完成数据读写。其优点包括:
- 数字输出,抗干扰能力强,适合大棚现场布线
- 温度范围宽,分辨率可配置(9~12 位)
- 每个器件具有唯一 64 位 ROM,便于多点扩展
- 无需外置 ADC,减少模拟误差
系统定时读取 DS18B20 温度值,并转换为摄氏温度数据用于显示与通信。
3.2 湿度采集功能(HS1101)
HS1101 是电容式湿度传感器,其电容量随相对湿度变化而变化。由于其输出不是直接的数字量,需要配合振荡电路或电容测量电路,将电容变化转换为频率或时间参数,再由单片机测量并换算成湿度值。HS1101 具有:
- 稳定性较好、适合长期监测
- 线性度较高但仍需要校准与温漂补偿
- 输出为电容变化,抗干扰设计需加强
本系统通过构建 RC 振荡或 555 振荡电路,将湿度变化转换成频率信号,单片机通过定时器计数测频或测周期,并根据标定曲线转换为湿度百分比。
3.3 数据处理与阈值比较功能
单片机对温湿度数据进行:
- 数字滤波(平均滤波、滑动平均、中值滤波)减少抖动
- 数据校准(零点与增益校正)提高准确性
- 阈值判断:与用户设定的上限/下限比较
系统还引入"误差范围"概念,即标准值±误差,超出则报警。例如: - 温度标准 25℃,允许误差 ±2℃,则 23~27℃ 正常
- 湿度标准 70%RH,允许误差 ±5%RH,65~75%RH 正常
也可用上下限直接定义允许范围,误差范围用于辅助设置或显示。
3.4 LED 实时显示功能
系统通过 LED 显示模块显示当前温湿度数值。显示形式可为:
- 4 位或 6 位数码管动态扫描显示
- LED 点阵或 LED 数码显示模块
典型显示方案: - 数码管循环显示温度与湿度
- 或分区显示:前两位温度,后两位湿度(需要更多位数)
显示模块必须具备: - 动态扫描刷新稳定,避免闪烁
- 数值显示与单位提示(例如温度显示 "℃",湿度显示 "%" 可用小数点或指示灯辅助)
3.5 RS485 远程通信功能(与 PC 上位机)
RS485 是工业现场常用的差分通信方式,具有:
- 抗干扰强,适合长距离传输
- 支持多点总线(一个主站多个从站)
- 成本低,兼容性好
系统通过 MAX485 等收发器与单片机 UART 相连,组成 RS485 通信链路。单片机周期性发送温湿度数据,上位机接收并显示;当超限报警时,单片机立即发送报警帧,上位机弹窗提示或发出声音报警,并可记录数据到文件。
3.6 报警功能(超限触发)
报警逻辑包括:
- 温度超上限或低于下限 → 温度报警
- 湿度超上限或低于下限 → 湿度报警
报警方式可以包括: - 本地蜂鸣器/LED 指示灯
- RS485 上传报警状态到上位机
为了防止报警抖动(临界点附近频繁报警),应引入: - 回差(Hysteresis)
- 报警延时确认(连续超限 N 次才报警)
- 恢复延时(恢复到正常范围后延时解除报警)
3.7 按键阈值设置功能(上下限设定)
系统提供按键用于设置:
- 温度上限/下限
- 湿度上限/下限
- 误差范围(可选)
按键可采用: - 独立按键(UP、DOWN、SET、OK)
- 矩阵键盘(功能扩展更方便)
设置流程建议: - SET 进入设置模式
- 选择参数(温度上限→温度下限→湿度上限→湿度下限)
- UP/DOWN 调整数值
- OK 保存并退出
参数可存储到 EEPROM(如 24C02)或单片机内部 Flash(若支持),断电后保持。
- 系统电路设计
4.1 硬件总体结构与模块划分
系统电路由以下模块组成:
1)AT89S51 单片机最小系统模块
2)DS18B20 温度采集模块
3)HS1101 湿度采集与振荡/测频模块
4)LED 显示模块(数码管驱动)
5)RS485 通信模块(MAX485 收发器)
6)按键输入模块
7)报警输出模块(蜂鸣器/报警灯,可选)
8)电源模块(稳压、滤波、保护)
9)抗干扰与隔离保护模块(ESD、防雷、终端电阻等)
4.2 AT89S51 单片机最小系统模块
4.2.1 核心组成
AT89S51 属于经典 8051 单片机,具备:
- 4 组 I/O 口
- 2 个定时器/计数器
- 1 路串口 UART
- 中断系统
其最小系统包括: - 晶振电路(常用 11.0592MHz,便于串口波特率精确)
- 复位电路(RC 上电复位 + 复位按键)
- 电源去耦(0.1uF + 10uF)
4.2.2 接口资源规划
由于系统模块较多,应合理规划 IO:
- DS18B20:1 根数据线(任意 IO,建议可配置为准双向)
- HS1101:输入测频信号到 T0/T1 或外部中断 INT0/INT1
- LED 数码管:段选/位选需要较多 IO,可用 74HC595 扩展
- RS485:串口 TXD/RXD + DE/RE 控制脚
- 按键:4 个左右 IO
- 报警:蜂鸣器/LED 1~2 IO
合理的 IO 扩展能降低布线复杂度并提升系统可维护性。
4.2.3 抗干扰设计要点
大棚现场可能存在电机、水泵、风机等大功率设备,电磁干扰强。单片机系统需:
- 复位电路加可靠性设计(防抖与滤波)
- 关键输入加 RC 滤波
- 软件看门狗(外置或定时器模拟)防止程序跑飞
- 电源分区与单点接地避免数字噪声影响模拟测量
4.3 DS18B20 温度采集模块
4.3.1 连接与上拉电阻
DS18B20 采用 1-Wire 总线,数据线需外接上拉电阻(通常 4.7k)到 VCC。工作模式可为:
- 外部供电模式(推荐):VDD 接电源,稳定可靠
- 寄生供电模式:省线但对时序要求更高
大棚远距离布线建议使用外部供电模式,并在传感器附近增加去耦电容抑制干扰。
4.3.2 总线布线与抗干扰
1-Wire 总线对布线质量敏感,建议:
- 使用屏蔽线或双绞线
- 数据线与电源线并行时避免靠近强电线
- 适当降低总线速度
- 必要时增加 TVS 或串联电阻保护(抑制浪涌)
4.3.3 温度精度与校准
DS18B20 典型精度可满足大棚监测需求,但实际系统中可通过软件校准:
- 标准温度点校准偏差
- 多次采样平均减少抖动
- 当读取异常值(如 85℃默认值)时做错误处理
4.4 HS1101 湿度采集模块
4.4.1 HS1101 输出特性
HS1101 的输出为电容值变化,不能直接由单片机 ADC 采集(AT89S51 无内置 ADC)。因此必须转换成单片机可测量的频率/脉冲宽度信号。常见方案:
- RC 振荡器(施密特触发器或反相器构成)
- 555 定时器振荡器
- CMOS 振荡器(如 CD4069 反相器)
振荡频率与电容 C 成反比,因此湿度变化可映射为频率变化。
4.4.2 振荡电路设计思路
以 555 无稳态振荡为例:
- HS1101 作为定时电容
- 频率 f 与 C 相关:f ≈ 1 / (0.693*(R1+2R2)*C)
随着湿度升高,HS1101 电容增大,频率降低。
单片机测频得到 f 后通过查表或拟合曲线转换为湿度值 RH。
4.4.3 测频输入与信号整形
由于振荡输出可能边沿不够陡峭或带噪声,建议:
- 通过施密特触发器整形(74HC14)
- 加限幅与滤波
- 输入到单片机计数器脚(T0/T1)或外部中断脚计数
这样可以提高测频稳定性与湿度换算准确性。
4.4.4 湿度标定与温度补偿
HS1101 的输出与温度相关,实际湿度测量通常需要温度补偿:
- 先用 DS18B20 得到温度 T
- 根据厂家提供的温度系数对湿度值进行补偿(简化可忽略或用线性修正)
在教学或基础设计中可以采用: - 两点校准(低湿点与高湿点)
- 查表校准(存储多点频率---湿度对应关系)
以提升整体准确度。
4.5 LED 显示模块(数码管动态扫描)
4.5.1 动态扫描原理
多位数码管常采用动态扫描:
- 段选输出对应的段码
- 位选逐位使能
- 以较高频率循环刷新(>100Hz)使人眼看到稳定显示
动态扫描的优势是节省 IO,但需要定时器周期刷新,并注意电流驱动能力。
4.5.2 驱动电路与扩展方案
由于单片机 IO 驱动能力有限,建议:
- 段选使用 74HC595 扩展 + 三极管驱动
- 位选使用三极管或 ULN2803 驱动
这样既减少 IO,又能提供足够电流,显示更亮更稳定。
若仅使用 LED 显示温湿度数值,可以采用 8 位数码管显示: - 前 4 位显示温度(含小数点)
- 后 4 位显示湿度(含小数点)
或采用轮显方式减少位数。
4.5.3 显示内容与切换逻辑
考虑数码管位数有限,可采用轮显:
- 3 秒显示温度
- 3 秒显示湿度
并用指示灯或小数点区分当前显示内容,提高可读性。
4.6 RS485 通信模块
4.6.1 MAX485 收发器功能
MAX485 作为 RS485 收发器,完成 TTL 串口与差分总线的转换。其关键引脚:
- DI:发送数据输入(接 MCU TXD)
- RO:接收数据输出(接 MCU RXD)
- DE:驱动使能(发送时置 1)
- /RE:接收使能(接收时置 0)
系统通过控制 DE 与 /RE 实现半双工通信: - 平时处于接收状态
- 发送数据前切换为发送状态
- 发送完成后切回接收状态
4.6.2 总线终端电阻与偏置电阻
RS485 长距离通信需要:
- 总线两端加 120Ω 终端电阻匹配阻抗
- 总线偏置电阻(上拉/下拉)保证空闲状态稳定
在大棚环境中线缆长、干扰强,终端与偏置配置能显著提高通信可靠性。
4.6.3 通信协议设计
为便于上位机解析,建议采用简单帧格式:
- 帧头:0xAA 0x55
- 地址:设备 ID(便于多节点扩展)
- 数据:温度、湿度、报警标志
- 校验:和校验或 CRC8
- 帧尾:0x0D 0x0A(可选)
上位机按协议解析并显示曲线、记录日志、报警提示。
4.7 按键设置模块
4.7.1 硬件结构与消抖
按键采用上拉输入,按下接地。建议:
- 外部上拉电阻或内部上拉
- RC 滤波(可选)
软件实现 10~20ms 去抖,避免误触发。
4.7.2 参数存储与掉电保持(可选)
设定阈值后若希望掉电不丢失,可增加 EEPROM(24C02),通过 I2C 存储:
- 温度上限/下限
- 湿度上限/下限
- 误差范围或报警延时参数
开机读取参数并加载,实现真正可用的现场系统。
4.8 报警模块(声光报警,可选但建议)
4.8.1 报警输出形式
- 蜂鸣器:提示异常
- LED 报警灯:直观指示
蜂鸣器可用 NPN 三极管驱动,避免直接由 IO 拉大电流。
4.8.2 报警策略优化
为避免频繁报警,可加入:
- 回差:例如温度上限 30℃,恢复阈值 29℃
- 延时确认:超限持续 5 秒才报警
- 报警锁定:报警后保持一段时间或人工确认解除
这些策略可显著提升系统在复杂环境下的稳定性。
4.9 电源模块与系统可靠性设计
4.9.1 供电方案
系统通常使用 5V 供电,可来自适配器或集中供电。若大棚供电不稳定,建议:
- 加 TVS + 滤波电感 + 大电容缓冲
- 使用稳压芯片(7805 或 DC-DC)
- 对 RS485 与传感器供电进行分区滤波
4.9.2 防雷与浪涌保护
大棚布线长,雷击感应与浪涌风险较高,建议:
- RS485 A/B 线加 TVS 管
- 电源输入加 MOV/TVS
- 传感器线加串联电阻与 TVS
可显著提高系统长期稳定性。
- 程序设计
5.1 软件总体架构
5.1.1 模块划分
系统软件可划分为:
1)系统初始化模块(时钟、IO、串口、定时器)
2)DS18B20 驱动模块(复位、读写、温度转换)
3)HS1101 测频与湿度换算模块
4)滤波与校准模块(平均、查表、补偿)
5)LED 显示驱动模块(动态扫描)
6)阈值设置与按键处理模块
7)报警逻辑模块(比较、回差、延时)
8)RS485 通信模块(发送、接收、协议解析)
9)参数存储模块(EEPROM,可选)
10)主循环与任务调度模块(定时执行)
5.1.2 任务调度策略
建议使用"定时器中断节拍 + 主循环状态机"结构:
- 1ms 中断:数码管扫描
- 10ms 任务:按键扫描去抖
- 200ms 任务:刷新传感器读数(或温度 1s 更新一次)
- 1s 任务:发送数据到上位机、更新报警状态
这样可保证显示稳定、采集可靠、通信有序。
5.2 DS18B20 驱动模块
5.2.1 基本通信时序
DS18B20 1-Wire 通信包括:
- 总线复位(Reset)
- 存在脉冲检测(Presence)
- 写时隙/读时隙
- 发送命令:Convert T、Read Scratchpad 等
温度读取流程:
1)发送 Convert T 命令启动转换
2)等待转换完成(典型 750ms@12bit)
3)读取 Scratchpad 得到温度寄存器
4)转换为摄氏温度值
5.2.2 异常处理
DS18B20 常见异常包括:
- 读回 85℃(上电默认值)
- CRC 校验失败(可选)
- 总线无响应
系统应在异常时: - 重试读取
- 若连续失败则标记传感器故障并上报
5.3 HS1101 测频与湿度换算模块
5.3.1 测频方法
常用方法有两种:
- 计数法:在固定时间窗(如 1s)内计数脉冲个数,得到频率 f
- 测周期法 :测量一个周期的时间,得到 f=1/T
计数法稳定但更新慢;测周期法更新快但易受抖动影响。
本系统建议采用: - 200ms 窗口计数并做平均,提高响应速度与稳定性。
5.3.2 湿度换算(查表/线性拟合)
HS1101 电容变化与湿度呈近似线性,但振荡电路的频率与电容是反比关系,因此换算曲线并非严格线性。工程上常用:
- 查表:存储多个 f→RH 对应点,插值计算
- 线性拟合:在工作范围内用 a·f+b 或 a/f+b 近似
为简化实现可采用分段线性或查表方案,保证在 30%~90%RH 范围内误差可控。
5.3.3 温度补偿(可选)
湿度传感器受温度影响,可使用 DS18B20 温度进行补偿:
RH_corr = RH_raw + k·(T-25)
其中 k 为经验系数或厂家提供系数。该补偿可显著改善不同季节与昼夜温差下的湿度准确性。
5.4 LED 显示驱动模块
5.4.1 动态扫描实现
定时器 1ms 中断刷新一位:
- 输出段码
- 选择位码
- 下一次中断刷新下一位
显示缓存区保存当前要显示的数字与小数点状态,主程序只需更新缓存即可。
5.4.2 显示内容组织
可设计显示模式:
- MODE0:显示温度(例如 25.6)
- MODE1:显示湿度(例如 72.3)
每隔 2~3 秒自动切换,或者按键切换。
显示状态还可加入: - 报警时闪烁显示
- 传感器故障显示
----
5.5 阈值设置与按键处理模块
5.5.1 设置参数结构
参数包括:
- T_high、T_low
- H_high、H_low
- 报警回差(可选)
- 报警延时(可选)
按键流程采用状态机实现,避免混乱: - NORMAL:正常显示
- SET_SEL:选择设置项
- SET_EDIT:编辑数值
- SAVE:保存并退出
5.5.2 数值调整与范围限制
为了避免用户设置不合理阈值,应限制范围:
- 温度阈值:-20~60℃(大棚常见范围)
- 湿度阈值:0~100%RH
同时确保:上限 > 下限,否则拒绝保存并提示错误。
5.6 报警逻辑模块
5.6.1 超限判断与回差
判断条件:
- T > T_high 或 T < T_low → 温度异常
- H > H_high 或 H < H_low → 湿度异常
加入回差: - 超限触发报警
- 恢复必须回到阈值内并跨过回差区才解除报警
避免临界点反复报警。
5.6.2 延时确认与解除
例如:
- 连续 5 次(5 秒)超限才报警
- 连续 5 次恢复正常才解除
这种机制能有效防止瞬时干扰导致的误报警,提高系统可信度。
5.7 RS485 通信模块与协议实现
5.7.1 发送流程(半双工控制)
- 切换 DE=1(发送模式),/RE=1(关闭接收)
- 发送帧头、数据、校验
- 等待发送完成(TI 置位)
- 切回接收模式 DE=0,/RE=0
5.7.2 接收与上位机命令
上位机可下发命令:
- 读取当前数据
- 设置阈值
- 清除报警
- 查询历史(若设备端存储)
单片机解析命令并返回应答帧,形成交互式远程监控系统。
- 程序示例代码(AT89S51 + DS18B20 + 测频 + RS485 + LED 显示)
c
#include <reg52.h>
#include <stdint.h>
#include <string.h>
/* =========================
硬件接口定义(按实际修改)
========================= */
// DS18B20 数据线
sbit DQ = P3^7;
// RS485 控制
sbit RS485_DE = P2^7; // 1=发送
sbit RS485_RE = P2^6; // 1=禁止接收(与/RE逻辑相反时注意)
// 按键(低电平按下)
sbit KEY_SET = P3^2;
sbit KEY_UP = P3^3;
sbit KEY_DOWN = P3^4;
sbit KEY_OK = P3^5;
// 报警输出
sbit ALARM_LED = P1^0;
/* =========================
变量与参数
========================= */
typedef struct {
int16_t t_low; // 温度下限,单位0.1℃
int16_t t_high; // 温度上限
int16_t h_low; // 湿度下限,单位0.1%RH
int16_t h_high; // 湿度上限
} limit_t;
static limit_t g_lim = { 180, 300, 600, 850 }; // 18.0~30.0℃, 60.0~85.0%RH
static int16_t g_temp = 0; // 0.1℃
static int16_t g_humi = 0; // 0.1%RH
static bit g_alarm = 0;
/* =========================
延时函数(简化)
========================= */
void delay_us(uint16_t us)
{
while(us--) _nop_();
}
void delay_ms(uint16_t ms)
{
uint16_t i, j;
for(i=0;i<ms;i++)
for(j=0;j<120;j++);
}
/* =========================
DS18B20 低层驱动(简化,不含CRC)
========================= */
static void ds18b20_reset(void)
{
DQ = 1;
delay_us(5);
DQ = 0;
delay_us(480);
DQ = 1;
delay_us(70);
// presence pulse 忽略判断也可
delay_us(410);
}
static void ds18b20_write_bit(uint8_t b)
{
DQ = 0;
if(b) {
delay_us(5);
DQ = 1;
delay_us(60);
} else {
delay_us(65);
DQ = 1;
delay_us(5);
}
}
static uint8_t ds18b20_read_bit(void)
{
uint8_t b;
DQ = 0;
delay_us(2);
DQ = 1;
delay_us(10);
b = DQ;
delay_us(55);
return b;
}
static void ds18b20_write_byte(uint8_t dat)
{
for(uint8_t i=0;i<8;i++) {
ds18b20_write_bit(dat & 0x01);
dat >>= 1;
}
}
static uint8_t ds18b20_read_byte(void)
{
uint8_t dat = 0;
for(uint8_t i=0;i<8;i++) {
dat >>= 1;
if(ds18b20_read_bit()) dat |= 0x80;
}
return dat;
}
/* 读取温度,返回0.1℃ */
int16_t ds18b20_read_temp_x10(void)
{
uint8_t tl, th;
int16_t raw;
ds18b20_reset();
ds18b20_write_byte(0xCC); // SKIP ROM
ds18b20_write_byte(0x44); // CONVERT T
delay_ms(750); // 12bit转换时间
ds18b20_reset();
ds18b20_write_byte(0xCC);
ds18b20_write_byte(0xBE); // READ SCRATCHPAD
tl = ds18b20_read_byte();
th = ds18b20_read_byte();
raw = (int16_t)((th << 8) | tl);
// DS18B20默认 1/16℃
// 转成0.1℃: raw * 0.0625 * 10 = raw * 0.625
// 使用近似: (raw * 625) / 1000
return (int16_t)((int32_t)raw * 625 / 1000);
}
/* =========================
HS1101 测频(示意:使用T0计数器)
========================= */
// 假设湿度振荡整形输出接到 T0 (P3.4) 或外部计数脚
// 这里示意:在固定窗口计数脉冲数得到频率
uint16_t hs1101_measure_freq_200ms(void)
{
uint16_t cnt;
TMOD &= 0xF0;
TMOD |= 0x05; // T0 16位计数器,外部计数
TH0 = 0;
TL0 = 0;
TR0 = 1;
delay_ms(200);
TR0 = 0;
cnt = ((uint16_t)TH0 << 8) | TL0;
return cnt * 5; // 200ms窗口 -> *5 得到Hz近似
}
/* 湿度换算:示例线性拟合(实际需查表/标定)
假设 f 在 3000~8000Hz 对应 30~90%RH(仅示例)
*/
int16_t hs1101_freq_to_rh_x10(uint16_t f_hz)
{
// 线性近似:RH = a*f + b
// 设 f=8000 -> 30, f=3000 -> 90
// a = (30-90)/(8000-3000) = -60/5000 = -0.012
// b = 90 - a*3000 = 90 + 36 = 126
// RH = -0.012*f + 126
int32_t rh = (int32_t)(-12) * (int32_t)f_hz / 1000 + 126;
if(rh < 0) rh = 0;
if(rh > 100) rh = 100;
return (int16_t)(rh * 10);
}
/* =========================
RS485 通信(简化发送)
========================= */
void uart_init_9600(void)
{
SCON = 0x50; // 8位UART,可变波特率
TMOD |= 0x20; // T1方式2
TH1 = 0xFD; // 11.0592MHz -> 9600
TL1 = 0xFD;
TR1 = 1;
ES = 0;
}
void uart_send_byte(uint8_t b)
{
SBUF = b;
while(TI == 0);
TI = 0;
}
uint8_t checksum_sum(const uint8_t *buf, uint8_t len)
{
uint8_t s = 0;
for(uint8_t i=0;i<len;i++) s += buf[i];
return s;
}
void rs485_send_frame(uint8_t addr, int16_t t_x10, int16_t h_x10, uint8_t alarm)
{
uint8_t frame[12];
frame[0] = 0xAA;
frame[1] = 0x55;
frame[2] = addr;
frame[3] = (uint8_t)(t_x10 >> 8);
frame[4] = (uint8_t)(t_x10 & 0xFF);
frame[5] = (uint8_t)(h_x10 >> 8);
frame[6] = (uint8_t)(h_x10 & 0xFF);
frame[7] = alarm;
frame[8] = checksum_sum(frame, 8);
frame[9] = 0x0D;
frame[10]= 0x0A;
frame[11]= 0x00;
// 切换发送
RS485_RE = 1;
RS485_DE = 1;
delay_us(10);
for(uint8_t i=0;i<11;i++) uart_send_byte(frame[i]);
delay_us(50);
// 切回接收
RS485_DE = 0;
RS485_RE = 0;
}
/* =========================
报警判断
========================= */
void check_alarm(void)
{
bit ta = 0, ha = 0;
if(g_temp > g_lim.t_high || g_temp < g_lim.t_low) ta = 1;
if(g_humi > g_lim.h_high || g_humi < g_lim.h_low) ha = 1;
g_alarm = (ta || ha) ? 1 : 0;
ALARM_LED = g_alarm ? 1 : 0;
}
c
/* =========================
显示模块(这里用伪函数表示)
实际项目中可用数码管动态扫描缓存实现
========================= */
extern void LED_ShowTempHumi(int16_t t_x10, int16_t h_x10);
void main(void)
{
uart_init_9600();
RS485_DE = 0;
RS485_RE = 0;
ALARM_LED = 0;
while(1)
{
// 1) 采集温度
g_temp = ds18b20_read_temp_x10();
// 2) 采集湿度(测频 + 换算)
uint16_t f = hs1101_measure_freq_200ms();
g_humi = hs1101_freq_to_rh_x10(f);
// 3) 报警判断
check_alarm();
// 4) LED显示
LED_ShowTempHumi(g_temp, g_humi);
// 5) 发送到上位机
rs485_send_frame(0x01, g_temp, g_humi, g_alarm);
// 6) 周期延时
delay_ms(800);
}
}
- 系统可靠性与工程实现要点分析
7.1 传感器布线与防水防潮措施
大棚环境湿度高且可能有水汽凝结,传感器与接线必须具备:
- 防水封装(尤其 DS18B20 可选防水探头)
- 接线端子防腐蚀
- 线缆使用耐湿材料
- 接头处使用热缩管或防水胶
否则长期运行会出现接触不良、读数异常或传感器损坏。
7.2 485 通信可靠性保障
RS485 线缆长、干扰强时,必须确保:
- 双绞线布线,远离强电线
- 合理终端电阻与偏置电阻
- TVS 防浪涌
- 通信协议带校验,避免误码
- 超时重发机制(上位机请求响应或设备主动发送)
这些措施能显著提升远程监控稳定性。
7.3 报警抖动与回差控制的重要性
大棚温湿度变化可能接近阈值,若无回差会导致报警不断切换,影响用户判断并造成上位机日志混乱。采用回差、延时确认、恢复延时等策略可有效提升报警可信度。
7.4 湿度测量标定的必要性
HS1101 输出与振荡电路强相关,不同元件容差会导致同一湿度下频率不同,因此必须进行标定。建议至少两点标定:
- 低湿点(例如 33%RH 饱和盐溶液)
- 高湿点(例如 75%RH 饱和盐溶液)
通过标定确定换算系数,能显著提升湿度测量准确性,并降低批次差异。
7.5 软件异常处理与看门狗机制
现场系统运行周期长,必须防止程序异常:
- 对 DS18B20 读取失败重试与错误码处理
- 对湿度频率异常值进行限幅与滤波
- 对通信发送失败可重复发送或上报故障
- 加入看门狗避免死循环
这样才能满足长期稳定监测需求。
- 系统扩展与优化方向
8.1 增加执行机构控制(闭环环境调节)
在测报基础上可扩展控制功能:
- 温度过高自动开启风机或卷膜
- 湿度过低开启喷雾或滴灌
- 湿度过高开启通风除湿
形成"监测 + 控制"闭环系统,真正实现智能大棚。
8.2 多点测量与网络化
DS18B20 支持多点挂载,可在大棚不同位置布置多个温度点;湿度也可扩展多个通道,通过 RS485 总线多节点联网,上位机统一管理并绘制区域分布。
8.3 数据记录与曲线分析
上位机可将温湿度数据记录为 CSV 或数据库,支持历史曲线与报表,便于分析作物生长环境与调控策略优化。
8.4 远程报警升级(短信/物联网)
在 PC 上位机基础上可进一步扩展:
- GPRS/4G 模块短信报警
- LoRa/NB-IoT 上传云平台
- 手机 App 远程查看
实现更高层级的远程农业物联网系统。
- 总结
基于单片机的蔬菜大棚温湿度远程测报系统以 AT89S51 为核心,采用 DS18B20 温度传感器与 HS1101 湿度传感器完成大棚环境温湿度采集,并在单片机端进行数据换算、滤波与阈值比较,实现现场 LED 实时显示与超限报警功能。系统通过 RS485 接口与 PC 上位机通信,支持远程监测、数据记录与异常报警提示,适用于大棚长距离、强干扰环境下的稳定运行需求。同时系统提供按键阈值上下限设定功能,使用户能够根据作物需求灵活调整报警范围,实现更精准的环境管理。通过对传感器测量、湿度频率转换、通信协议、报警回差与延时、抗干扰与防护措施等工程要点的综合设计,本系统具备结构清晰、实现成本低、可扩展性强的特点,既适合课程设计与实验教学,也可作为设施农业环境监测与远程报警系统的原型方案,为后续扩展执行控制、网络化管理与物联网平台接入奠定良好基础。