基于51单片机的超声波液位检测OLED显示设计
1 系统功能介绍
本设计是一个 基于 51 单片机的超声波液位检测与控制系统。其核心思想是利用超声波传感器来测量水面的高度,从而计算出实际水深,再结合设定的低水位和高水位阈值,智能地控制水泵与排水阀(舵机),并通过 OLED 显示屏实时显示相关信息。
该系统具有 自动水位调节、声光报警、参数可调、掉电保存、无线扩展 等多重功能,适用于水箱、储水池、工业液位控制等场合,保证了用水的安全性和便捷性。
主要功能如下:
-
实时测量与显示
- OLED 显示屏实时显示:超声波到水底距离、到水面的距离、计算后的水深、低水位阈值、高水位阈值以及水位状态提示。
-
自动控制逻辑
- 当水位低于低水位阈值时:蜂鸣器报警,水泵启动加水,舵机关闭排水;
- 当水位高于高水位阈值时:蜂鸣器报警,舵机打开排水阀,水泵关闭;
- 当水位在正常范围时:所有执行机构保持关闭状态,OLED 提示“水位正常”。
-
参数设置与掉电保存
- 通过按键设置水箱总深度(超声波到水底距离)、低水位阈值、高水位阈值;
- 阈值数据保存在 EEPROM 中,掉电不丢失。
-
无线扩展功能(选配蓝牙/WIFI 模块)
-
手机 APP 可以实时查看水位数据;
-
APP 能够下发指令设置参数,例如:
*SA138#
→ 设置总深度 1.38m;*SL085#
→ 设置低水位阈值 0.85m;*SH100#
→ 设置高水位阈值 1.0m。
-
数据显示与 OLED 保持一致。
-
2 系统电路设计
2.1 单片机最小系统
采用 STC89C52 单片机作为核心控制器。其具备丰富的 I/O 资源,可同时处理超声波测距、OLED 显示、按键输入、EEPROM 存储和外设控制。最小系统包括:
- 晶振电路:11.0592MHz 晶振+电容;
- 复位电路:上电复位保证程序运行可靠;
- 电源电路:提供 5V 稳定电压。
2.2 超声波测量模块
超声波传感器采用 HC-SR04,主要通过发射和接收超声波计算水面高度:
-
Trig 脚由单片机输出高电平触发,发射 8 个 40kHz 声波脉冲;
-
Echo 脚返回高电平,持续时间与距离成正比;
-
单片机通过计时计算出超声波到达水面的距离:
距离=时间×声速2 距离 = \frac{时间 × 声速}{2} 距离=2时间×声速
-
系统安装时,传感器固定在水箱上方,测得的“水面距离”与“水底距离”相减,得到实时水深。
2.3 显示模块(OLED)
采用 0.96 寸 OLED 屏(I2C 接口),具有分辨率高、功耗低的特点。显示内容包括:
- 总深度(超声波到水底距离);
- 当前水面距离;
- 实际水深;
- 低水位和高水位阈值;
- 当前水位状态(加水中、排水中、水位正常)。
2.4 蜂鸣器驱动电路
使用有源蜂鸣器,单片机通过 GPIO 控制:
- 水位异常时开启蜂鸣器报警;
- 水位正常时关闭蜂鸣器。
2.5 水泵与舵机驱动电路
- 水泵驱动:通过继电器控制水泵电源,当水位低于下限时开启加水;
- 舵机驱动:用于模拟排水阀控制,当水位高于上限时,舵机转动打开阀门排水。
2.6 按键电路
设计了 3 个按键:
- K1:进入设置模式;
- K2:数值加 1;
- K3:数值减 1。
配合 OLED 界面上的“<<”或“>>”提示,用户可方便地设置总深度、低水位、高水位阈值。
2.7 无线模块(可选)
可选用 HC-05 蓝牙模块或 ESP8266 WiFi 模块:
- 通过串口与单片机通信;
- 支持 APP 查看数据和发送控制命令;
- 实现远程液位管理。
3 程序设计
3.1 主程序框架
#include <reg52.h>
#include "oled.h"
#include "ultrasonic.h"
#include "eeprom.h"
#include "key.h"
#include "relay.h"
#include "servo.h"
#include "beep.h"
#include "uart.h"unsigned int depth_set = 100; // 总深度 (cm)
unsigned int low_set = 30; // 低水位阈值 (cm)
unsigned int high_set = 80; // 高水位阈值 (cm)unsigned int water_surface; // 水面距离
unsigned int water_depth; // 实际水深void main()
{System_Init();EEPROM_ReadConfig(&depth_set,&low_set,&high_set);while(1){water_surface = Ultrasonic_Measure();water_depth = depth_set - water_surface;Display_Info(water_surface, water_depth, low_set, high_set);Key_Scan();Auto_Control();Uart_Process(); // 无线模块命令处理}
}
3.2 超声波测距程序
unsigned int Ultrasonic_Measure(void)
{unsigned int time;unsigned int distance;Trig = 1;Delay10us();Trig = 0;while(!Echo);TR0 = 1;while(Echo);TR0 = 0;time = TH0*256 + TL0;distance = (time * 0.017); // cmreturn distance;
}
3.3 自动控制逻辑
void Auto_Control(void)
{if(water_depth < low_set){Relay_On(); // 开启水泵加水Servo_Close(); // 关闭排水阀Beep_On();OLED_ShowString(0,6,"加水中..");}else if(water_depth > high_set){Relay_Off(); // 关闭水泵Servo_Open(); // 打开排水阀Beep_On();OLED_ShowString(0,6,"排水中..");}else{Relay_Off();Servo_Close();Beep_Off();OLED_ShowString(0,6,"水位正常 ");}
}
3.4 按键设置程序
void Key_Scan(void)
{if(K1 == 0){DelayMs(20);if(K1 == 0){Enter_SettingMode();}}
}
设置模式下,OLED 上会显示 <<
光标,用户通过 K2 加、K3 减 修改参数,修改完成后自动写入 EEPROM。
3.5 EEPROM 数据存储
void EEPROM_SaveConfig(unsigned int depth, unsigned int low, unsigned int high)
{IapWriteByte(0x0000, depth);IapWriteByte(0x0002, low);IapWriteByte(0x0004, high);
}
该部分保证用户设置掉电不丢失。
3.6 无线模块命令解析
void Uart_Process(void)
{if(RxFlag){if(strncmp(rx_buf,"*SA",3)==0){depth_set = atoi(rx_buf+3);}else if(strncmp(rx_buf,"*SL",3)==0){low_set = atoi(rx_buf+3);}else if(strncmp(rx_buf,"*SH",3)==0){high_set = atoi(rx_buf+3);}RxFlag=0;}
}
4 总结
本设计基于 STC89C52 单片机,通过 超声波测距+OLED 显示+按键设置+EEPROM 保存+蜂鸣器报警+水泵与舵机控制 等模块,实现了一个功能完善的 智能水位检测与控制系统。
其优势主要体现在:
- 检测准确:超声波测距避免了电极法易腐蚀问题,适合长期使用;
- 功能全面:支持自动/手动调节,报警提示,掉电不丢失;
- 交互性强:OLED 图文清晰,按键操作直观;
- 可扩展性好:增加蓝牙/WIFI 模块后,用户可通过手机 APP 查看和控制水位。
该设计不仅适用于家庭水箱液位控制,还能推广到农业灌溉、工业液位管理等领域,具有较高的实用价值和应用前景。