51单片机超声波测距代码详解(LCD1602显示)仿真图+完整代码
以下代码实现了一个基于51单片机的超声波测距系统,通过LCD1602实时显示距离,并在距离过近时触发声光报警。:通过定时器记录Echo高电平时间( t ),利用公式 ( \text{距离} = \frac{340 \times t}{2} ) 计算实际距离(单位:cm)。:超声波遇到障碍物反射后,模块的Echo引脚输出高电平,高电平持续时间与距离成正比。:单片机向超声波模块的Trig引脚发送一个1
文件下载:
https://pan.baidu.com/s/1jL7i0kno_KtiTKuClOcZdw?pwd=erzh 提取码: erzh
以下代码实现了一个基于51单片机的超声波测距系统,通过LCD1602实时显示距离,并在距离过近时触发声光报警。代码逻辑清晰,适合初学者理解传感器驱动、显示控制及报警逻辑。以下是代码流程和核心思想的详细解析。
一、代码整体流程
-
头文件与引脚定义
• 引入51单片机标准库头文件(reg52.h)及自定义头文件(LCD、超声波模块、延时函数)。
• 定义蜂鸣器(Buzzer)和LED(LED)的引脚,并设置报警阈值(ALARM_DISTANCE)。 -
初始化模块
• 超声波模块初始化:配置超声波传感器(HC-SR04)的触发和接收引脚。
• LCD1602初始化:设置液晶屏的显示模式、光标等参数。
• 定时器初始化:定时器0设为模式1(16位定时器),用于超声波测距的计时。 -
主循环逻辑
• 测量距离:通过超声波模块测量当前距离值。
• 显示距离:在LCD1602上实时显示距离数值及单位(cm)。
• 报警判断:若距离小于阈值,触发蜂鸣器和LED闪烁;否则关闭报警。
• 延时控制:通过软件延时(Delay_ms)控制刷新频率,避免显示过快。
二、核心思想详解
1. 超声波测距原理
超声波测距基于时间差法:
• 发射阶段:单片机向超声波模块的Trig引脚发送一个10μs的高电平脉冲,触发超声波发射。
• 接收阶段:超声波遇到障碍物反射后,模块的Echo引脚输出高电平,高电平持续时间与距离成正比。
• 计算距离:通过定时器记录Echo高电平时间( t ),利用公式 ( \text{距离} = \frac{340 \times t}{2} ) 计算实际距离(单位:cm)。
2. LCD1602动态显示
• 显示流程:
- 调用
LCD_Show3Num显示3位整数距离值(例如“025”)。 - 调用
LCD_ShowStr追加单位“cm”,形成完整显示(例如“025cm”)。
• 动态刷新:通过主循环的持续刷新,确保显示内容随距离变化实时更新。
3. 声光报警逻辑
• 阈值判断:当测量距离小于 ALARM_DISTANCE(如10cm),触发报警。
• 蜂鸣器控制:通过 Buzzer = 1 开启蜂鸣器,Buzzer = 0 关闭。
• LED闪烁:通过 LED = ~LED 实现LED状态翻转,配合延时实现闪烁效果。
4. 软件延时的局限性
• 问题:Delay_ms(500) 通过空循环消耗时间,期间单片机无法执行其他任务(如按键扫描)。
• 改进方向:建议使用定时器中断实现非阻塞延时,提升系统响应速度。
三、代码优化建议(进阶方向)
- 硬件定时器优化
• 将超声波测距的时间测量改为定时器中断方式,提高精度和代码效率。 - 按键功能扩展
• 增加按键设置报警阈值功能,参考外部中断或矩阵键盘扫描。 - 温度补偿
• 添加DS18B20温度传感器,修正声速因温度变化带来的误差(声速公式:( v = 331.5 + 0.6T ))。 - 多级报警
• 根据距离远近设置多级报警(如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);
}
}
// 延时函数实现
仿真图
更多推荐



所有评论(0)