基于单片机的智能水箱温度液位控制系统设计

1、基于单片机的智能水箱温度液位控制系统设计

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

1.1、系统概述

在家庭热水供应、工业循环冷却、农业温室灌溉、水产养殖以及实验室恒温水箱等应用场景中,水箱不仅承担储水功能,还常常需要对水温与水位进行实时监测与自动控制。水温过低会影响生活舒适度或生产过程,水温过高可能导致设备损坏、能耗增加甚至安全风险;而水箱缺水则会引发加热干烧、泵空转、管路进气等问题,轻则降低系统寿命,重则造成事故。因此,设计一套具有"水温测量、水位监测、定时加热、缺水报警与自动加水、时间显示与设置、人机交互显示"等功能的智能水箱控制系统,具有明显的工程意义与实际价值。

本系统基于单片机实现智能化控制,采用DS18B20数字温度传感器对水温进行实时测量,利用水位传感器监测水箱液位状态,使用DS1302时钟芯片提供精准的日期与时间基准,从而实现"时间显示、定时加热控制、历史数据记录扩展"等功能。系统在检测到缺水时可自动触发报警,并启动加水执行装置(如电磁阀或水泵)进行补水,当水位恢复到安全范围后停止加水,确保系统连续稳定运行。

在人机交互方面,本系统采用LCD1602字符液晶显示当前日期、时间、水温、水位状态、设定温度、加热/加水状态等信息,使用户能够直观了解系统运行情况。同时通过机械按键实现系统时间设置、定时加热设置以及水温设定等功能,满足用户对个性化控制的需求。

本设计从整体上可划分为三大部分:

1)功能与控制策略设计:明确水温控制逻辑、水位控制逻辑、定时加热逻辑与报警逻辑。

2)电路设计:按模块详细介绍单片机最小系统、DS18B20、DS1302、水位传感器、加热/加水驱动、LCD1602、按键输入与蜂鸣器报警等电路设计要点。

3)程序设计:采用模块化结构实现传感器采集、实时钟读取、显示刷新、按键扫描与菜单设置、控制状态机、安全保护与异常处理等功能。

通过本系统的设计与实现,可以系统掌握单片机外设驱动、单总线通信、时钟芯片三线通信、液晶显示、按键消抖、继电器/电磁阀驱动、定时任务调度与状态机控制等综合技术,具有较强的学习与实践价值。


2、系统功能设计

2.1、DS18B20实时测量水温

DS18B20是一种常用的数字温度传感器,具有以下特点:

  • 单总线接口,只需一根数据线即可与单片机通信,节省IO口资源
  • 测温范围宽(-55℃~+125℃),适用于水箱温度采集
  • 支持9~12位分辨率配置,最高分辨率可达0.0625℃
  • 数字输出抗干扰能力强,适合工业或家庭环境

系统通过DS18B20周期性采集水温,并将采集结果显示在LCD1602上,同时用于控制加热执行装置。为了避免温度瞬时波动导致加热频繁开关,系统可采用"温度滞回控制"策略:

  • 当水温低于设定温度下限(Tset - ΔT)时启动加热
  • 当水温高于设定温度上限(Tset + ΔT)时停止加热
    其中ΔT为滞回区间(例如1℃或2℃),该策略能显著提高控制稳定性并减少继电器动作次数。

2.2、水位传感器监测水箱液位

水位监测是水箱系统安全控制的重要基础。水位传感器可根据实际需求选择不同类型:

  • 浮球开关(简单可靠,输出数字量)
  • 电极式水位探头(可实现多段水位检测)
  • 压力式液位传感器(可实现连续液位高度测量)
  • 超声波液位传感器(非接触测量,精度高但成本较高)

本系统为实现"缺水报警并自动加水"功能,通常采用两点液位检测更为可靠:

  • 低水位(LOW):低于安全水位,判定缺水,停止加热并启动加水
  • 高水位(HIGH):补水到位,停止加水
    采用双液位开关可避免单点传感器因波动造成频繁加水,形成"液位滞回控制",提高稳定性。

如果仅采用单个缺水开关,也可以实现基本功能,但补水停止需要依赖时间控制或人工停止,可靠性较低。因此在工程应用中强烈建议增加高水位检测点。


2.3、DS1302时钟芯片提供日期与时间基准

DS1302是一种常用的实时时钟(RTC)芯片,具有:

  • 内置秒、分、时、日、月、周、年寄存器
  • 支持闰年补偿(在一定范围内)
  • 可外接后备电池,在断电时继续计时
  • 三线接口:SCLK、I/O、RST,使用简单

系统通过DS1302实时获取当前时间并显示在LCD上,同时为"定时加热"功能提供精准时间基准。例如用户可设定:

  • 每天早上06:30开始加热
  • 晚上21:00停止加热或进入保温
    也可实现定时加水记录、报警时间记录等功能扩展。

通过RTC芯片,系统不再依赖单片机内部定时器计时,避免由于断电重置或时钟漂移导致时间不准的问题,使系统更贴近实际产品需求。


2.4、缺水自动报警并启动加水功能

当水箱液位低于低水位阈值时,系统应立即执行以下动作:

1)停止加热(防止加热管干烧)

2)触发报警(蜂鸣器鸣叫、LCD显示缺水提示)

3)启动加水执行装置(电磁阀打开或水泵启动)

4)持续监测水位变化

5)当水位达到高水位或恢复正常时停止加水,并解除缺水报警

加水控制同样建议采用滞回策略:

  • LOW触发加水
  • HIGH停止加水
    这样能够避免水位在临界点附近波动导致加水装置频繁启停,提高装置寿命。

报警设计应考虑用户体验:

  • 缺水初次触发:蜂鸣器连续鸣叫提示
  • 若系统已自动加水且水位恢复:蜂鸣器停止,但LCD提示"补水完成"可显示短时间
  • 若补水超时仍未达到高水位(例如供水故障):报警升级,提示人工检查并停止系统,避免水泵空转或电磁阀长时间工作

2.5、LCD1602显示日期、时间、水位与温度信息

LCD1602是常用的字符型液晶显示模块,2行×16字符,具有:

  • 显示清晰、成本低
  • 接口简单(8位或4位数据模式)
  • 可显示数字、字母与简单符号
  • 适合嵌入式控制系统状态显示

本系统需要显示内容较多,建议采用分行显示与界面切换方式:

  • 第一行:日期与时间(YY-MM-DD HH:MM)
  • 第二行:温度、水位状态、加热/加水状态
    例如:
  • 24-01-05 12:30
  • T:45.2C L:OK H:ON
    其中L表示水位状态(OK/LOW/HIGH),H表示加热状态(ON/OFF),也可显示W表示加水状态。

在设置模式下,LCD可显示:

  • 当前设定温度
  • 定时加热开始时间与结束时间
  • 正在修改的项目闪烁或光标提示

通过合理界面设计,用户无需外部设备即可完成全部设置与查看。


2.6、机械按键实现时间设置、定时加热与水温设定

机械按键是低成本、可靠的人机交互方式。系统按键功能建议设计为:

  • MODE:模式切换/进入设置
  • SET:确认/保存
  • UP:增加数值
  • DOWN:减少数值
  • NEXT:切换设置项(可选)

按键可实现:

1)系统时间设置:年、月、日、时、分、秒逐项修改并写入DS1302

2)定时加热设置:设置每天加热开始时间与结束时间,或设定某一时段加热

3)水温设定:设置目标温度Tset以及滞回范围ΔT(可选)

4)手动加热/手动加水(扩展):便于维护

按键输入必须配合软件消抖处理,避免按键抖动导致多次触发。同时可加入长按加速功能,提升设置效率。


3、电路设计

3.1、硬件总体结构说明

本系统硬件由以下模块构成:

1)单片机最小系统模块

2)电源供电模块

3)DS18B20温度采集模块

4)水位传感器输入模块

5)DS1302实时时钟模块

6)LCD1602显示模块

7)按键输入与设置模块

8)加热执行器控制模块

9)加水执行器控制模块

10)蜂鸣器报警模块

11)保护与抗干扰模块(滤波、续流、隔离)

系统核心是"采集---判断---执行---显示---报警"的闭环控制结构,所有模块围绕温度和水位控制展开。下面按模块详细介绍电路设计。


3.2、单片机最小系统模块

单片机可以选用STC89C52(典型52系列)或带ADC的STC12系列/STM32等。若水位采用数字量输入、温度DS18B20为数字传感器,则不强制需要ADC;但若水位使用模拟液位传感器,则需要ADC或比较器。为了通用性,本设计以52系列为核心说明。

最小系统包括:

  • 单片机芯片(STC89C52/AT89S52)
  • 晶振电路(11.0592MHz或12MHz)
  • 复位电路(上电复位+按键复位)
  • 去耦电容(0.1uF)
  • 下载接口(串口ISP)

设计要点:

  • LCD1602、DS1302、DS18B20、按键等需要多个IO口,建议合理分配端口
  • IO口上拉与输入保护要完善,避免水位传感器长线干扰导致误触发
  • 强电执行器(加热、加水)驱动与弱电逻辑分区布线,防止继电器干扰单片机

3.3、电源供电模块

系统常见供电方案:

  • DC12V适配器输入 → 7805或DC-DC降压得到5V
  • 或直接使用5V电源模块供电

电源模块需要同时满足:

  • 单片机与传感器稳定供电(对噪声敏感)
  • 继电器线圈或电磁阀可能需要12V(若使用12V继电器/阀)

建议采用双电压架构:

  • 12V供执行器与继电器线圈
  • 5V供单片机、LCD、DS18B20、DS1302

并加入:

  • 输入端大电解电容(470uF~1000uF)缓冲继电器动作冲击
  • 5V输出端去耦电容与0.1uF贴片电容抑制高频噪声
  • 反接保护二极管(可选)提升可靠性

3.4、DS18B20温度采集模块

DS18B20采用单总线通信,硬件连接要点:

  • 数据线DQ连接单片机IO口(如P3.7)
  • DQ需外接上拉电阻4.7k到VCC(5V)
  • 传感器供电可采用外部供电模式(VDD接5V)更稳定
  • 数据线尽量短,若较长可加小电容滤波或使用屏蔽线

在水箱环境中,传感器通常需要防水封装探头,并使用金属探头插入水箱。需要注意:

  • 探头金属外壳与系统地之间应合理绝缘,避免腐蚀与漏电
  • 线缆应具备防潮防水能力
  • 若水箱为金属容器,应考虑传感器外壳接地策略(按实际工程处理)

3.5、水位传感器输入模块

水位传感器若采用浮球开关或电极探头输出数字量,电路设计较简单:

  • 一端接IO口,另一端接GND
  • IO口上拉电阻10k
  • 增加RC滤波抑制抖动(可选)

若采用双浮球:

  • LOW浮球输入
  • HIGH浮球输入

程序根据两个输入判断水位状态:

  • LOW触发:缺水
  • HIGH触发:满水
  • 两者都未触发:正常

若采用模拟液位传感器(0~5V),需使用ADC采样或比较器阈值判断,并增加输入保护与滤波。

实际工程建议:

  • 使用双浮球开关实现可靠补水控制
  • 传感器线缆尽量远离继电器与加热线路,减少干扰
  • 输入端可加光耦隔离(可选)用于长距离传输和强电环境

3.6、DS1302实时时钟模块

DS1302采用三线接口:

  • SCLK:时钟线
  • I/O:数据线(双向)
  • RST:片选/使能线

硬件设计要点:

  • DS1302需连接32.768kHz晶振(靠近芯片放置)
  • 连接纽扣电池(3V)作为后备电源,主电源断电仍可计时
  • I/O线需上拉(可使用内部上拉或外部电阻)
  • 走线应短,避免干扰导致时钟读写错误

DS1302输出为BCD码格式,单片机需要进行BCD与十进制转换。


3.7、LCD1602显示模块

LCD1602可采用8位或4位模式。为节省IO口,推荐4位模式:

  • RS、E控制线接IO口
  • RW接地(只写模式)
  • D4~D7接IO口

电路要点:

  • V0接电位器(10k)调节对比度
  • 背光需限流(多数模块已带电阻)
  • 数据线加适当串联电阻可降低干扰(可选)

LCD显示需要稳定供电,继电器动作造成电源波动可能导致LCD乱码,因此建议LCD供电端增加去耦电容并优化电源布局。


3.8、按键输入模块

按键用于设置时间、定时加热、水温设定等。硬件连接:

  • 独立按键一端接IO口,另一端接GND(低电平有效)
  • IO口上拉电阻10k
  • 软件消抖

按键数量建议:

  • MODE、SET、UP、DOWN、NEXT(可选)

若要减少IO口,可采用矩阵键盘或电阻分压ADC键盘,但独立按键更可靠且程序简单,适合教学与项目实现。


3.9、加热执行器控制模块

加热方式通常为:

  • 电加热管/电热棒(AC220V)
  • 或低压加热器(DC12V/24V)

对于AC220V加热,控制必须采用继电器或固态继电器,并保证强弱电隔离:

  • 单片机IO → 三极管驱动 → 继电器线圈
  • 继电器触点串接加热器与市电

电路设计要点:

  • 继电器线圈并联续流二极管(直流继电器)
  • 触点侧加RC吸收或压敏电阻抑制电弧
  • 强电部分必须留足安全距离,PCB爬电距离符合安全规范
  • 可加入保险丝、漏电保护器增强安全

若使用固态继电器(SSR),可减少电磁干扰与触点磨损,适合频繁保温控制。


3.10、加水执行器控制模块

加水执行器可选:

  • 电磁阀(控制进水)
  • 水泵(抽水补水)

控制方式同样可采用继电器或MOSFET:

  • 若电磁阀为12V直流:MOSFET低侧开关驱动更高效
  • 若水泵为交流:使用继电器或SSR

加水逻辑通常为:

  • LOW触发 → 打开阀/启动泵
  • HIGH触发 → 关闭阀/停止泵
  • 若超时未达到HIGH → 报警并停止执行器,防止持续运行损坏

3.11、蜂鸣器报警模块

蜂鸣器用于缺水报警、故障提示、按键提示等。推荐有源蜂鸣器:

  • 单片机IO控制
  • NPN三极管驱动放大电流
  • 不同报警节奏区分不同报警类型
    例如:
  • 缺水报警:短短长循环
  • 故障报警:快速连续鸣叫

4、程序设计

4.1、软件总体架构与任务调度

系统软件建议采用"主循环 + 定时中断 + 状态机"的结构。核心任务包括:

  • DS18B20温度采集任务(周期1s)
  • DS1302时间读取任务(周期1s)
  • 水位检测任务(周期100ms~500ms)
  • 控制决策任务(周期100ms~1s)
  • LCD刷新任务(周期200ms~500ms)
  • 按键扫描任务(周期10ms)
  • 报警蜂鸣器任务(周期10ms)

状态机建议定义:

1)NORMAL:正常运行(自动控制温度与水位)

2)SETTING:设置模式(时间/定时/温度设定)

3)WATER_LOW:缺水补水中

4)HEATING:加热中(可视为NORMAL的子状态)

5)FAULT:故障报警状态(补水超时、传感器故障)

系统运行逻辑以安全为最高优先级:

  • 一旦缺水,立即停止加热并进入补水状态
  • 一旦干烧风险(若温度异常高且水位LOW),进入故障并报警
  • 所有控制输出均受安全条件约束

4.2、DS18B20温度采集模块程序设计

DS18B20通信流程:

1)复位(Reset)

2)存在脉冲检测(Presence)

3)发送跳过ROM命令(0xCC)

4)发送温度转换命令(0x44)

5)等待转换完成(可延时或检测DQ)

6)再次复位与存在检测

7)发送跳过ROM(0xCC)

8)发送读暂存器命令(0xBE)

9)读取温度低字节与高字节

10)转换为实际温度值并显示

程序中需要实现:

  • 单总线读写时序
  • 温度数据换算(12位:temp = raw/16)
  • 异常处理(读失败则保留上次值并报警提示)

4.3、DS1302时钟读取与时间设置模块程序设计

DS1302读写流程:

  • 通过RST使能通信
  • 通过SCLK时钟同步读写I/O线
  • 数据为BCD码,需要转换
  • 写入时间时注意暂停振荡位(CH位)处理

时间设置流程:

1)进入设置界面

2)选择年/月/日/时/分/秒项

3)UP/DOWN修改数值并自动处理合法范围(如月份1~12)

4)确认后写入DS1302寄存器

5)退出设置界面返回正常显示


4.4、水位检测与缺水补水控制模块程序设计

水位检测模块读取LOW与HIGH输入,生成水位状态:

  • LEVEL_LOW:缺水
  • LEVEL_OK:正常
  • LEVEL_HIGH:满水(或补水完成)

缺水处理逻辑:

  • 若检测到LEVEL_LOW:

    • 立即停止加热
    • 启动加水执行器
    • 报警提示
  • 若补水过程中检测到LEVEL_HIGH或LEVEL_OK:

    • 停止加水
    • 解除报警
    • 恢复正常控制

补水超时保护:

  • 记录补水开始时间

  • 若超过设定时间(如3分钟)仍未达到高水位:

    • 停止加水
    • 进入故障状态并持续报警
    • LCD提示"WATER ERR"

4.5、加热控制与水温设定模块程序设计

加热控制采用温度滞回:

  • 设定温度Tset(用户可调)
  • 滞回值Thys(固定或用户可调)

控制策略:

  • 若水位正常且当前时间在定时加热时段内:

    • 当T < Tset - Thys → HEAT=ON
    • 当T > Tset + Thys → HEAT=OFF
  • 若水位低:HEAT强制OFF

  • 若不在定时加热时段:HEAT=OFF或进入保温策略(可扩展)

定时加热:

  • 用户可设置加热开始时间Start(HH:MM)与结束时间End(HH:MM)

  • 当前时间在区间内允许加热,否则停止加热

  • 若跨天(如22:00~06:00),需特殊处理:

    • 当前时间>=Start 或 当前时间<=End 则允许加热

4.6、LCD1602显示刷新模块程序设计

LCD显示刷新建议采用固定周期刷新,避免频繁刷新导致闪烁。显示内容包含:

  • 日期:YY-MM-DD
  • 时间:HH:MM:SS
  • 温度:T=xx.xC
  • 水位:LOW/OK/HIGH
  • 加热状态:HEAT ON/OFF
  • 加水状态:WATER ON/OFF
  • 设置界面提示:SET TEMP、SET TIME、SET TIMER等

刷新策略:

  • 正常模式显示完整信息
  • 设置模式显示正在设置的参数并闪烁光标
  • 故障模式显示错误提示并闪烁报警符号

4.7、按键扫描与菜单设置模块程序设计

按键扫描每10ms进行一次,采用计数消抖。按键事件包括:

  • MODE:切换界面/进入设置
  • SET:确认/进入下一项
  • UP/DOWN:修改数值
  • NEXT:切换设置项(可选)

菜单设计建议:

1)设置时间(TIME SET)

2)设置定时加热(TIMER SET)

3)设置目标温度(TEMP SET)

4)退出(EXIT)

每个设置项都应具备范围限制与回绕机制,避免非法参数。


4.8、报警管理模块程序设计

报警管理包括:

  • 缺水报警
  • 补水超时报警
  • 传感器故障报警(DS18B20或DS1302读写异常)

蜂鸣器采用节拍控制,不阻塞主循环。可根据报警类型选择不同节奏:

  • 缺水:200ms响/200ms停
  • 超时:100ms响/100ms停(更急促)
  • 传感器故障:500ms响/500ms停

5、核心程序示例(模块化代码)

5.1、全局变量与基本定义

c 复制代码
#include <reg52.h>
#include <stdio.h>

typedef unsigned char u8;
typedef unsigned int  u16;
typedef unsigned long u32;

//---------------- DS18B20 ----------------
sbit DQ = P3^7;  // DS18B20数据线

//---------------- DS1302 ----------------
sbit DS1302_RST  = P1^0;
sbit DS1302_IO   = P1^1;
sbit DS1302_SCLK = P1^2;

//---------------- LCD1602 (4位模式示例) ----------------
sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_EN = P2^7;
#define LCD_PORT P0

//---------------- 水位输入(低电平触发示例) ----------------
sbit LV_LOW  = P3^0; // 低水位
sbit LV_HIGH = P3^1; // 高水位

//---------------- 执行器输出 ----------------
sbit HEAT  = P1^6;   // 加热继电器/SSR
sbit WATER = P1^7;   // 加水电磁阀/水泵

//---------------- 蜂鸣器 ----------------
sbit BEEP = P2^0;

//---------------- 按键 ----------------
sbit KEY_MODE = P3^2;
sbit KEY_SET  = P3^3;
sbit KEY_UP   = P3^4;
sbit KEY_DN   = P3^5;

//---------------- 系统参数 ----------------
float g_temp = 0.0f;
u8 g_level = 0;        // 0:OK 1:LOW 2:HIGH
u8 g_alarm = 0;        // 0:none 1:low water 2:timeout 3:sensor

// 设定温度与滞回
float g_tset = 45.0f;
float g_thys = 1.0f;

// 定时加热时间(小时分钟)
u8 g_heat_start_h = 6,  g_heat_start_m = 30;
u8 g_heat_end_h   = 22, g_heat_end_m   = 0;

// RTC时间缓存
u8 g_year, g_mon, g_day, g_hour, g_min, g_sec;

// 计时节拍
volatile u16 ms_tick = 0;
volatile bit flag_10ms = 0;
volatile bit flag_200ms = 0;
volatile bit flag_1000ms = 0;

// 补水计时
u32 water_run_s = 0;
#define WATER_TIMEOUT_S 180  // 补水超时 180秒

5.2、定时器中断产生任务节拍

c 复制代码
void Timer0_Init_1ms(void)
{
    TMOD &= 0xF0;
    TMOD |= 0x01;
    TH0 = (65536 - 1000) / 256;  // 12MHz近似
    TL0 = (65536 - 1000) % 256;
    ET0 = 1;
    TR0 = 1;
    EA  = 1;
}

void Timer0_ISR(void) interrupt 1
{
    TH0 = (65536 - 1000) / 256;
    TL0 = (65536 - 1000) % 256;

    ms_tick++;
    if(ms_tick % 10 == 0) flag_10ms = 1;
    if(ms_tick % 200 == 0) flag_200ms = 1;
    if(ms_tick % 1000 == 0) flag_1000ms = 1;
}

5.3、水位检测与补水控制核心逻辑

c 复制代码
void Level_Update(void)
{
    // 低电平触发:0=触发
    if(LV_LOW == 0) g_level = 1;        // LOW
    else if(LV_HIGH == 0) g_level = 2;  // HIGH
    else g_level = 0;                   // OK
}

void WaterControl_Task_1s(void)
{
    if(g_level == 1) // LOW 缺水
    {
        HEAT = 0; // 强制停止加热
        WATER = 1;
        g_alarm = 1;

        if(water_run_s < 60000) water_run_s++;

        if(water_run_s >= WATER_TIMEOUT_S)
        {
            WATER = 0;
            g_alarm = 2; // 补水超时报警
        }
    }
    else
    {
        // 非LOW时停止补水并清除补水计时
        WATER = 0;
        water_run_s = 0;

        // 若之前是缺水报警且已恢复,可解除报警
        if(g_alarm == 1) g_alarm = 0;
    }
}

5.4、加热控制(温度滞回 + 定时加热允许区间)

c 复制代码
bit TimeInRange(u8 ch, u8 cm, u8 sh, u8 sm, u8 eh, u8 em)
{
    u16 cur = ch*60 + cm;
    u16 st  = sh*60 + sm;
    u16 ed  = eh*60 + em;

    if(st <= ed)
    {
        return (cur >= st && cur <= ed);
    }
    else
    {
        // 跨天区间
        return (cur >= st || cur <= ed);
    }
}

void HeatControl_Task(void)
{
    bit allow_heat = TimeInRange(g_hour, g_min, g_heat_start_h, g_heat_start_m, g_heat_end_h, g_heat_end_m);

    // 缺水或报警超时一律不允许加热
    if(g_level == 1 || g_alarm == 2)
    {
        HEAT = 0;
        return;
    }

    if(!allow_heat)
    {
        HEAT = 0;
        return;
    }

    // 滞回控制
    if(g_temp < (g_tset - g_thys)) HEAT = 1;
    if(g_temp > (g_tset + g_thys)) HEAT = 0;
}

5.5、蜂鸣器报警任务(非阻塞节奏)

c 复制代码
void Beep_Task(void)
{
    if(g_alarm == 0) { BEEP = 0; return; }

    if(g_alarm == 1) // 缺水
    {
        BEEP = (ms_tick % 400 < 200) ? 1 : 0;
    }
    else if(g_alarm == 2) // 补水超时
    {
        BEEP = (ms_tick % 200 < 100) ? 1 : 0;
    }
    else // 传感器故障等
    {
        BEEP = (ms_tick % 1000 < 500) ? 1 : 0;
    }
}

5.6、LCD1602显示刷新(示例)

c 复制代码
char line1[17];
char line2[17];

void LCD_Refresh(void)
{
    // 第一行:日期 时间
    // 24-01-05 12:30:45
    sprintf(line1, "%02d-%02d-%02d %02d:%02d", g_year, g_mon, g_day, g_hour, g_min);

    // 第二行:温度 水位 加热/加水
    // T:45.2C L:OK H1 W0
    sprintf(line2, "T:%2d.%1dC L:%s",
            (int)g_temp, (int)(g_temp*10)%10,
            (g_level==0)?"OK":(g_level==1)?"LO":"HI");

    // 后半部分显示状态
    line2[12] = 'H';
    line2[13] = HEAT ? '1' : '0';
    line2[14] = 'W';
    line2[15] = WATER ? '1' : '0';

    // TODO: LCD_Str(0,0,line1); LCD_Str(1,0,line2);
}

5.7、主程序框架(任务调度与控制流程)

c 复制代码
void System_Init(void)
{
    HEAT = 0;
    WATER = 0;
    BEEP = 0;

    Timer0_Init_1ms();
    // LCD_Init();
    // DS1302_Init();
    // DS18B20_Init();

    g_tset = 45.0f;
    g_thys = 1.0f;
}

void main(void)
{
    System_Init();

    while(1)
    {
        if(flag_10ms)
        {
            flag_10ms = 0;
            // Key_Scan_Process();  // 按键扫描与设置
            Beep_Task();
        }

        if(flag_1000ms)
        {
            flag_1000ms = 0;

            // DS1302_ReadTime(&g_year,&g_mon,&g_day,&g_hour,&g_min,&g_sec);
            // g_temp = DS18B20_ReadTemp();

            Level_Update();
            WaterControl_Task_1s();
            HeatControl_Task();
        }

        if(flag_200ms)
        {
            flag_200ms = 0;
            LCD_Refresh();
        }
    }
}

6、系统可靠性与工程优化要点

6.1、缺水状态下强制禁止加热

缺水是最危险状态之一,无论用户是否开启定时加热,都必须强制关闭加热输出,避免加热器干烧。软件中应将缺水判断作为最高优先级条件,并可在硬件上增加温控保险丝作为最终保护。

6.2、补水超时保护与故障升级

在供水异常、管路堵塞或水泵故障时,补水可能长时间无法恢复水位。若系统持续补水,会导致:

  • 水泵空转损坏
  • 电磁阀持续工作发热
  • 误以为正常运行而隐藏故障
    因此必须设置补水超时保护,并在超时后进入故障状态,持续报警并提示人工检查。

6.3、温度采样稳定性与滤波

水箱温度变化具有惯性,但传感器读数可能受噪声影响。建议:

  • DS18B20采样周期1s
  • 对温度做滑动平均(如5次平均)
  • 控制决策使用滤波后温度,减少继电器抖动
    同时注意DS18B20单总线通信对时序要求严格,必须保证延时准确,避免读取错误。

6.4、DS1302时间设置与断电保持

DS1302使用后备电池保持计时,需注意:

  • 电池电压不足会导致时间丢失或走时不准
  • 读写寄存器需处理CH位与写保护位
  • 设置时需校验输入合法性(如月份天数、闰年)
    可在程序中加入日期合法性判断,避免用户设置非法日期导致显示异常。

6.5、抗干扰与电源设计

继电器动作、电磁阀线圈、电机启动都会产生干扰,可能导致:

  • 单片机复位
  • LCD乱码
  • DS1302读写失败
    建议:
  • 继电器线圈并联续流二极管
  • 强电触点并联RC吸收或MOV
  • 电源入口增加大电容与LC滤波
  • 强弱电分区布局,单点接地
  • 信号线加RC滤波或光耦隔离(长线时尤其必要)

7、总结

基于单片机的智能水箱温度液位控制系统通过DS18B20实现水温实时测量,通过水位传感器实现水箱液位监测,利用DS1302提供精准日期与时间基准,从而完成日期时间显示、定时加热、水温设定、缺水报警与自动加水等功能。系统采用LCD1602显示日期、时间、水温与水位状态,信息直观清晰;通过机械按键实现系统时间设置、定时加热设置与温度设定,使用户可根据不同场景灵活配置控制策略。

在控制策略上,系统采用水位优先的安全机制,缺水时强制停止加热并自动补水,同时具有补水超时保护与蜂鸣器报警提示,保障设备长期稳定运行。在程序设计上采用模块化与状态机思想,结合定时任务调度实现传感器采集、实时钟读取、显示刷新、按键交互、加热/加水控制与报警管理等功能的协同工作。

该系统具备较强的工程实用性,可广泛应用于家庭热水箱、恒温储水装置、养殖水箱与工业循环水系统。通过进一步扩展通信模块(WIFI/蓝牙)、数据记录、手机远程监控、多段水位连续检测等功能,可升级为更加智能化、网络化的水箱管理终端。

相关推荐
我先去打把游戏先11 小时前
TCP、TLS、HTTP、HTTPS、MQTT、MQTTS几种网络协议的对比与解释
嵌入式硬件·mcu·物联网·网络协议·tcp/ip·http·aws
IT方大同11 小时前
实时时钟RTC
嵌入式硬件·实时音视频
点灯小铭11 小时前
基于单片机的社区医院小型高压蒸汽灭菌自动控制器设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
youcans_12 小时前
【动手学STM32G4】(3)STM32G431之定时器
stm32·单片机·嵌入式硬件·定时器
悠哉悠哉愿意12 小时前
【嵌入式学习笔记】AD/DA
笔记·单片机·嵌入式硬件·学习
松涛和鸣12 小时前
DAY47 FrameBuffer
c语言·数据库·单片机·sqlite·html
阿凉070212 小时前
新版本JLink安装目录中缺失JLinkDevices.xml添加方法
xml·嵌入式硬件
范纹杉想快点毕业12 小时前
《嵌入式通信与数据管理:从状态机到环形队列的完整实战指南》
单片机·嵌入式硬件
点灯小铭13 小时前
基于单片机的硫化氢、氨气、甲烷、一氧化碳气体多种有害气体检测与声光报警系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
小李做物联网13 小时前
【单片机毕设】c24基于单片机stm32蓝牙温室大棚物联网毕业设计
stm32·单片机·嵌入式硬件·物联网