基于51单片机的超声波测距仪(Proteus仿真+完整代码)
本文介绍基于51单片机的超声波测距系统设计,采用HC-SR04模块实现2-400cm范围测量(精度±1cm)。系统通过4位数码管实时显示带小数点的距离值(格式XXX.Xcm),具有自动消隐前导零功能。内容包括硬件设计(STC89C52主控、数码管显示等)、Proteus仿真电路、Keil程序开发(含测距算法和动态扫描显示代码)等完整实现方案。项目重点解析了超声波测距原理(距离=回波时间×0.017
·
本文将详细介绍如何使用51单片机实现超声波测距系统,包含完整的Proteus 8.9仿真文件和Keil C代码。项目采用HC-SR04超声波模块进行距离测量,结果实时显示在4位数码管上(格式:XXX.X cm)。
一、项目概述
1.1 核心功能
- 高精度测距:测量范围2-400cm,精度±1cm
- 实时显示:4位数码管显示带小数点的距离值
- 智能优化:自动消隐前导零,专业显示效果
- 稳定可靠:动态扫描技术确保无闪烁显示
1.2 硬件组成
| 模块 | 器件 |
|---|---|
| 主控制器 | STC89C52/AT89C51 |
| 显示模块 | 4位共阴数码管 |
| 测距模块 | HC-SR04超声波传感器 |
| 辅助电路 | 电阻排、晶振、电容等 |
二、Proteus仿真设计
2.1 电路原理图

2.2 引脚分配
| 功能 | 单片机引脚 |
|---|---|
| 数码管段选 | P0 |
| 数码管位选1-4 | P2.4-P2.7 |
| HC-SR04 TRIG | P1.0 |
| HC-SR04 ECHO | P1.1 |
| 晶振电路 | XTAL1/2 |
| 复位电路 |
RST |
2.3 仿真演示

三、程序设计
3.1 程序流程图

3.2 关键代码解析
3.2.1 超声波测距函数
uint Measure() {
// 发送10us触发信号
TRIG = 1;
_nop_(); _nop_(); // 精确延时
TRIG = 0;
// 等待回波信号变高
while(!ECHO);
// 开始计时
TR1 = 1;
TH1 = 0;
TL1 = 0;
// 等待回波信号变低
while(ECHO);
TR1 = 0;
// 计算距离(单位0.1cm)
uint time_us = TH1 * 256 + TL1;
return (uint)(time_us * 0.17);
}
3.2.2 显示数据处理
void UpdateDisplay() {
// 每200ms更新一次距离
static uint cnt = 0;
if(++cnt >= 100) {
cnt = 0;
distance = Measure(); // 获取距离
}
// 分解显示数据(格式:XX.X)
Buff[3] = Array[distance % 10]; // 小数位
Buff[2] = Array[(distance/10)%10] | 0x80; // 个位+小数点
Buff[1] = Array[(distance/100)%10]; // 十位
Buff[0] = (distance/1000)? Array[distance/1000] : 0; // 百位(消隐)
}
3.2.3 数码管动态扫描
void Timer0() interrupt 1 {
TH0 = 0xF8; // 重装初值(2ms)
TL0 = 0x30;
// 关闭所有数码管
P0 = 0x00;
w1 = w2 = w3 = w4 = 1;
// 动态扫描
switch(ShowID) {
case 1: w1 = 0; P0 = Buff[0]; break;
case 2: w2 = 0; P0 = Buff[1]; break;
case 3: w3 = 0; P0 = Buff[2]; break;
case 4: w4 = 0; P0 = Buff[3]; break;
}
// 位选切换
if(++ShowID > 4) ShowID = 1;
}
3.3 主要参数配置
// 数码管显示编码(0-9+小数点)
uchar code Array[11] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f,
0x80 // 小数点
};
// 定时器初始化
void TimerInit() {
TMOD = 0x11; // 定时器0和1都设为模式1
TH0 = 0xF8; // 2ms定时初值
TL0 = 0x30;
ET0 = 1; // 允许定时器0中断
EA = 1; // 开总中断
TR0 = 1; // 启动定时器0
}
四、关键技术点
4.1 超声波测距原理
距离计算公式: 距离=回波时间×声速2距离=2回波时间×声速
其中:
- 声速 ≈ 340m/s = 0.034cm/μs
- 除以2是因为声波往返时间
- 程序中使用简化计算:距离=时间(μs)×0.017(cm)距离=时间(μs)×0.017(cm)
4.2 数码管显示优化
-
动态扫描技术:
- 每2ms刷新一位数码管
- 4位数码管共8ms刷新周期
- 刷新频率125Hz,远超视觉暂留极限
-
自动消隐算法:
// 百位消隐处理 Buff[0] = (distance/1000)? Array[distance/1000] : 0; - 小数点处理:
Buff[2] = Array[(distance/10)%10] | 0x80; // 添加小数点
4.3 抗干扰设计
- 触发信号前先置低电平
- 测量前重置定时器
- 限制最大测量范围(400cm)
- 数据滤波处理(均值滤波)
五、资源下载
完整工程包含:
- Proteus 8.9仿真文件
- Keil C51完整源代码
- 编译好的HEX烧录文件
💬 如有任何问题,欢迎评论区留言交流!
六、总结
本项目实现了基于51单片机的超声波测距系统,具有以下特点:
- 测量精准:误差控制在±1cm范围内
- 显示专业:4位数码管带小数点显示
- 运行稳定:动态扫描无闪烁
- 资源开源:提供完整仿真和源码
通过本项目的学习,可以掌握:
- 超声波测距原理与实践
- 数码管动态显示技术
- 51单片机定时器应用
- Proteus电路设计与仿真
建议学习路线:
- 先运行Proteus仿真
- 阅读并理解源码
- 尝试修改显示格式
- 添加温度补偿功能
- 实物制作与调试
版权声明:本文代码可自由用于学习目的,商业使用请联系作者授权。 技术讨论:欢迎在评论区留下您的宝贵建议和问题!
更多推荐



所有评论(0)