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:30T: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/蓝牙)、数据记录、手机远程监控、多段水位连续检测等功能,可升级为更加智能化、网络化的水箱管理终端。