基于单片机的蔬菜大棚温湿度远程测报系统设计

  1. 基于单片机的蔬菜大棚温湿度远程测报系统设计

点击链接下载prrotues仿真设计资料:https://download.csdn.net/download/m0_51061483/92081514


  1. 系统概述

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,上位机显示并记录。

  1. 系统功能设计

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(若支持),断电后保持。

  1. 系统电路设计

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
    可显著提高系统长期稳定性。

  1. 程序设计

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 接收与上位机命令

上位机可下发命令:

  • 读取当前数据
  • 设置阈值
  • 清除报警
  • 查询历史(若设备端存储)
    单片机解析命令并返回应答帧,形成交互式远程监控系统。

  1. 程序示例代码(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);
    }
}

  1. 系统可靠性与工程实现要点分析

7.1 传感器布线与防水防潮措施

大棚环境湿度高且可能有水汽凝结,传感器与接线必须具备:

  • 防水封装(尤其 DS18B20 可选防水探头)
  • 接线端子防腐蚀
  • 线缆使用耐湿材料
  • 接头处使用热缩管或防水胶
    否则长期运行会出现接触不良、读数异常或传感器损坏。

7.2 485 通信可靠性保障

RS485 线缆长、干扰强时,必须确保:

  • 双绞线布线,远离强电线
  • 合理终端电阻与偏置电阻
  • TVS 防浪涌
  • 通信协议带校验,避免误码
  • 超时重发机制(上位机请求响应或设备主动发送)
    这些措施能显著提升远程监控稳定性。

7.3 报警抖动与回差控制的重要性

大棚温湿度变化可能接近阈值,若无回差会导致报警不断切换,影响用户判断并造成上位机日志混乱。采用回差、延时确认、恢复延时等策略可有效提升报警可信度。

7.4 湿度测量标定的必要性

HS1101 输出与振荡电路强相关,不同元件容差会导致同一湿度下频率不同,因此必须进行标定。建议至少两点标定:

  • 低湿点(例如 33%RH 饱和盐溶液)
  • 高湿点(例如 75%RH 饱和盐溶液)
    通过标定确定换算系数,能显著提升湿度测量准确性,并降低批次差异。

7.5 软件异常处理与看门狗机制

现场系统运行周期长,必须防止程序异常:

  • 对 DS18B20 读取失败重试与错误码处理
  • 对湿度频率异常值进行限幅与滤波
  • 对通信发送失败可重复发送或上报故障
  • 加入看门狗避免死循环
    这样才能满足长期稳定监测需求。

  1. 系统扩展与优化方向

8.1 增加执行机构控制(闭环环境调节)

在测报基础上可扩展控制功能:

  • 温度过高自动开启风机或卷膜
  • 湿度过低开启喷雾或滴灌
  • 湿度过高开启通风除湿
    形成"监测 + 控制"闭环系统,真正实现智能大棚。

8.2 多点测量与网络化

DS18B20 支持多点挂载,可在大棚不同位置布置多个温度点;湿度也可扩展多个通道,通过 RS485 总线多节点联网,上位机统一管理并绘制区域分布。

8.3 数据记录与曲线分析

上位机可将温湿度数据记录为 CSV 或数据库,支持历史曲线与报表,便于分析作物生长环境与调控策略优化。

8.4 远程报警升级(短信/物联网)

在 PC 上位机基础上可进一步扩展:

  • GPRS/4G 模块短信报警
  • LoRa/NB-IoT 上传云平台
  • 手机 App 远程查看
    实现更高层级的远程农业物联网系统。

  1. 总结

基于单片机的蔬菜大棚温湿度远程测报系统以 AT89S51 为核心,采用 DS18B20 温度传感器与 HS1101 湿度传感器完成大棚环境温湿度采集,并在单片机端进行数据换算、滤波与阈值比较,实现现场 LED 实时显示与超限报警功能。系统通过 RS485 接口与 PC 上位机通信,支持远程监测、数据记录与异常报警提示,适用于大棚长距离、强干扰环境下的稳定运行需求。同时系统提供按键阈值上下限设定功能,使用户能够根据作物需求灵活调整报警范围,实现更精准的环境管理。通过对传感器测量、湿度频率转换、通信协议、报警回差与延时、抗干扰与防护措施等工程要点的综合设计,本系统具备结构清晰、实现成本低、可扩展性强的特点,既适合课程设计与实验教学,也可作为设施农业环境监测与远程报警系统的原型方案,为后续扩展执行控制、网络化管理与物联网平台接入奠定良好基础。

相关推荐
v先v关v住v获v取7 小时前
自动搬运车结构设计9张cad+三维图+设计说明书
科技·单片机·51单片机
一路往蓝-Anbo9 小时前
STM32单线串口通讯实战(二):链路层核心 —— DMA环形缓冲与收发切换时序
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网
悠哉悠哉愿意10 小时前
【嵌入式学习笔记】UART
笔记·单片机·嵌入式硬件·学习
QK_0010 小时前
STM32--工程移植
stm32·单片机·嵌入式硬件
QK_0010 小时前
STM32--DMA
stm32·单片机·嵌入式硬件
福尔摩斯张11 小时前
STM32数码管和LCD显示技术深度解析(超详细)
数据库·stm32·单片机·嵌入式硬件·mongodb
d111111111d11 小时前
STM32 DMA传输配置详解:数据宽度与传输方向设置指南
笔记·stm32·单片机·嵌入式硬件·学习
清风66666611 小时前
基于单片机的多路热电偶温度监测与报警器
数据库·单片机·mongodb·毕业设计·课程设计·期末大作业
Archie_IT11 小时前
基于STM32F103C8T6标准库的OLED显示屏中文汉字显示实现_资料编号39
stm32·单片机·嵌入式硬件·mcu·硬件工程·信息与通信·信号处理