文件下载
https://pan.baidu.com/s/1jL7i0kno_KtiTKuClOcZdw?pwd=erzh 提取码: erzh

以下代码实现了一个基于51单片机的超声波测距系统,通过LCD1602实时显示距离,并在距离过近时触发声光报警。代码逻辑清晰,适合初学者理解传感器驱动、显示控制及报警逻辑。以下是代码流程和核心思想的详细解析。


一、代码整体流程
  1. 头文件与引脚定义
    • 引入51单片机标准库头文件(reg52.h)及自定义头文件(LCD、超声波模块、延时函数)。
    • 定义蜂鸣器(Buzzer)和LED(LED)的引脚,并设置报警阈值(ALARM_DISTANCE)。

  2. 初始化模块
    超声波模块初始化:配置超声波传感器(HC-SR04)的触发和接收引脚。
    LCD1602初始化:设置液晶屏的显示模式、光标等参数。
    定时器初始化:定时器0设为模式1(16位定时器),用于超声波测距的计时。

  3. 主循环逻辑
    测量距离:通过超声波模块测量当前距离值。
    显示距离:在LCD1602上实时显示距离数值及单位(cm)。
    报警判断:若距离小于阈值,触发蜂鸣器和LED闪烁;否则关闭报警。
    延时控制:通过软件延时(Delay_ms)控制刷新频率,避免显示过快。


二、核心思想详解
1. 超声波测距原理

超声波测距基于时间差法
发射阶段:单片机向超声波模块的Trig引脚发送一个10μs的高电平脉冲,触发超声波发射。
接收阶段:超声波遇到障碍物反射后,模块的Echo引脚输出高电平,高电平持续时间与距离成正比。
计算距离:通过定时器记录Echo高电平时间( t ),利用公式 ( \text{距离} = \frac{340 \times t}{2} ) 计算实际距离(单位:cm)。

2. LCD1602动态显示

显示流程

  1. 调用 LCD_Show3Num 显示3位整数距离值(例如“025”)。
  2. 调用 LCD_ShowStr 追加单位“cm”,形成完整显示(例如“025cm”)。
    动态刷新:通过主循环的持续刷新,确保显示内容随距离变化实时更新。
3. 声光报警逻辑

阈值判断:当测量距离小于 ALARM_DISTANCE(如10cm),触发报警。
蜂鸣器控制:通过 Buzzer = 1 开启蜂鸣器,Buzzer = 0 关闭。
LED闪烁:通过 LED = ~LED 实现LED状态翻转,配合延时实现闪烁效果。

4. 软件延时的局限性

问题Delay_ms(500) 通过空循环消耗时间,期间单片机无法执行其他任务(如按键扫描)。
改进方向:建议使用定时器中断实现非阻塞延时,提升系统响应速度。


三、代码优化建议(进阶方向)
  1. 硬件定时器优化
    • 将超声波测距的时间测量改为定时器中断方式,提高精度和代码效率。
  2. 按键功能扩展
    • 增加按键设置报警阈值功能,参考外部中断或矩阵键盘扫描。
  3. 温度补偿
    • 添加DS18B20温度传感器,修正声速因温度变化带来的误差(声速公式:( v = 331.5 + 0.6T ))。
  4. 多级报警
    • 根据距离远近设置多级报警(如LED慢闪→快闪→常亮),增强交互性。

总结

本代码通过超声波模块、LCD1602和简单报警逻辑,实现了一个基础的测距系统。核心思想是传感器信号采集→数据处理→动态显示→阈值判断,适合初学者掌握51单片机的外设控制与逻辑设计。后续可结合硬件定时器、中断和温度补偿等进阶内容,进一步完善功能。
完整代码

#include <reg52.h>

// 包含原有的头文件
#include "lcd.h"
#include "altraWave.h"
#include "delay.h"

// 定义声光报警相关引脚
sbit Buzzer = P3^7;  // 蜂鸣器控制引脚
sbit LED = P3^6;     // LED灯控制引脚

// 报警距离阈值,单位:cm
#define ALARM_DISTANCE 10  

void main()
{
    // 初始化超声波模块
    Init_AltraWave();
    // 初始化LCD
    LCD_Init();  

    // 设置定时器0为模式1
    TMOD = 0x01;  
    TH0 = 0;
    TL0 = 0;

    while (1)
    {
        unsigned int distance;
        
        // 测量距离
        distance = Measure();
        
        // 在LCD上显示距离
        LCD_Show3Num(0, 0, distance);
        LCD_ShowStr(3, 0, "cm");

        // 判断是否需要触发报警
        if (distance < ALARM_DISTANCE)
        {
            // 声光报警
            Buzzer = 1;  // 蜂鸣器响
            LED = ~LED;  // LED闪烁
        }
        else
        {
            Buzzer = 0;  // 蜂鸣器关闭
            LED = 0;     // LED熄灭
        }

        // 延时500ms
        Delay_ms(500);
    }
}

// 延时函数实现

仿真图
在这里插入图片描述

Logo

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

更多推荐