本文将详细介绍如何使用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 数码管显示优化

  1. 动态扫描技术

    • 每2ms刷新一位数码管
    • 4位数码管共8ms刷新周期
    • 刷新频率125Hz,远超视觉暂留极限
  2. 自动消隐算法

       // 百位消隐处理
       Buff[0] = (distance/1000)? Array[distance/1000] : 0;

  3. 小数点处理
       Buff[2] = Array[(distance/10)%10] | 0x80; // 添加小数点

4.3 抗干扰设计

  1. 触发信号前先置低电平
  2. 测量前重置定时器
  3. 限制最大测量范围(400cm)
  4. 数据滤波处理(均值滤波)

五、资源下载

完整工程包含

  1. Proteus 8.9仿真文件
  2. Keil C51完整源代码
  3. 编译好的HEX烧录文件

点击下载资源

💬 如有任何问题,欢迎评论区留言交流!

六、总结

本项目实现了基于51单片机的超声波测距系统,具有以下特点:

  1. 测量精准:误差控制在±1cm范围内
  2. 显示专业:4位数码管带小数点显示
  3. 运行稳定:动态扫描无闪烁
  4. 资源开源:提供完整仿真和源码

通过本项目的学习,可以掌握:

  • 超声波测距原理与实践
  • 数码管动态显示技术
  • 51单片机定时器应用
  • Proteus电路设计与仿真

建议学习路线

  1. 先运行Proteus仿真
  2. 阅读并理解源码
  3. 尝试修改显示格式
  4. 添加温度补偿功能
  5. 实物制作与调试

版权声明:本文代码可自由用于学习目的,商业使用请联系作者授权。 技术讨论:欢迎在评论区留下您的宝贵建议和问题!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐