news 2026/8/24 12:19:14

51单片机两路超声波测距:从原理到代码实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
51单片机两路超声波测距:从原理到代码实现

51单片机程序 两路超声波测距 超声波测距,带温度补偿, 两路超声波测距,18b20测温带温度补偿,lcd1602显示温度和实测距离。 keil4程序源码,有proteus仿真文件。

在电子制作的世界里,超声波测距是一项非常实用的技术,今天咱就来讲讲51单片机如何实现两路超声波测距,并且带上温度补偿,再用18B20测温,最后通过LCD1602显示温度和实测距离,还会分享Keil4程序源码以及Proteus仿真文件哦。

超声波测距原理

超声波测距的基本原理就是通过发送超声波脉冲,然后检测反射回来的回波,根据超声波在空气中传播的时间来计算距离。公式为:距离 = 声速 × 时间 / 2 。但声速会随温度变化,所以温度补偿就很重要啦。

18B20测温原理

18B20是常用的数字温度传感器,它采用单总线通信协议。单片机只需一根线就能和它进行数据交互,读取到当前的温度值。

硬件连接

  1. 超声波模块:每个超声波模块有四个引脚,分别为VCC、GND、Trig(触发引脚)和Echo(回响引脚)。VCC接5V,GND接地,Trig和Echo分别接到51单片机的I/O口。
  2. 18B20:同样有三个引脚,VCC接5V,GND接地,DQ(数据引脚)接到51单片机的I/O口。
  3. LCD1602:VSS接地,VDD接5V,V0接电位器调节对比度,RS、RW、E分别接单片机I/O口,D0 - D7接单片机I/O口(也可以采用4位模式连接,这里为方便讲解采用8位模式)。

Keil4程序源码

头文件包含与全局变量定义

#include <reg51.h> #include <intrins.h> #include <1602.h> // 自定义的LCD1602驱动头文件 #include <18b20.h> // 自定义的18B20驱动头文件 sbit Trig1 = P1^0; // 第一路超声波触发引脚 sbit Echo1 = P1^1; // 第一路超声波回响引脚 sbit Trig2 = P1^2; // 第二路超声波触发引脚 sbit Echo2 = P1^3; // 第二路超声波回响引脚 unsigned int distance1, distance2; // 存储两路距离 float temperature; // 存储温度

这里定义了各个引脚的位变量,还有用于存储距离和温度的变量。

18B20温度读取函数

float read_temperature() { unsigned char low, high; float temp; init_18b20(); // 初始化18B20 write_byte_18b20(0xcc); // 跳过ROM操作命令 write_byte_18b20(0x44); // 启动温度转换 _nop_(); _nop_(); init_18b20(); write_byte_18b20(0xcc); write_byte_18b20(0xbe); // 读取温度寄存器 low = read_byte_18b20(); high = read_byte_18b20(); temp = (high << 8) | low; if (temp & 0xf800) { // 负数处理 temp = ~temp + 1; temp = -((float)temp * 0.0625); } else { temp = (float)temp * 0.0625; } return temp; }

这个函数先初始化18B20,然后发送命令启动温度转换,再读取温度寄存器的值,最后根据数据格式计算出实际温度值。

超声波测距函数

unsigned int measure_distance(sbit Trig, sbit Echo) { unsigned int time; Trig = 0; _nop_(); _nop_(); Trig = 1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); Trig = 0; while (!Echo); TR0 = 1; // 启动定时器0 while (Echo); TR0 = 0; // 停止定时器0 time = TH0 * 256 + TL0; TH0 = 0; TL0 = 0; return time * 0.017; // 根据声速计算距离 }

这个函数通过控制Trig引脚发送超声波脉冲,然后等待Echo引脚回响,利用定时器0记录回响时间,从而计算出距离。

主函数

void main() { init_lcd(); // 初始化LCD1602 TMOD = 0x01; // 定时器0工作在模式1 TH0 = 0; TL0 = 0; while (1) { temperature = read_temperature(); distance1 = measure_distance(Trig1, Echo1); distance2 = measure_distance(Trig2, Echo2); // 根据温度补偿声速计算更准确的距离,这里简单示意,实际可优化 // 假设声速与温度关系:v = 331.5 + 0.607 * temperature // 重新计算distance1和distance2 display_temperature(temperature); // 自定义函数显示温度到LCD1602 display_distance1(distance1); // 自定义函数显示第一路距离到LCD1602 display_distance2(distance2); // 自定义函数显示第二路距离到LCD1602 delay(500); // 延时 } }

主函数里先初始化LCD1602和定时器0,然后在循环里不断读取温度和两路距离,最后显示在LCD1602上,并适当延时。

Proteus仿真

Proteus仿真文件可以帮助我们在实际制作硬件之前验证程序的正确性。在Proteus中搭建好51单片机、超声波模块、18B20和LCD1602的电路连接,然后导入编译好的Hex文件,运行仿真就能看到LCD1602上显示出实时的温度和两路超声波测量的距离啦。

51单片机程序 两路超声波测距 超声波测距,带温度补偿, 两路超声波测距,18b20测温带温度补偿,lcd1602显示温度和实测距离。 keil4程序源码,有proteus仿真文件。

希望通过这篇博文,大家能对51单片机的两路超声波测距、18B20测温以及LCD1602显示有更深入的理解,赶紧动手试试吧!

上述代码中的自定义函数(如display_temperature等)需根据实际情况编写,这里主要展示核心逻辑代码。完整的工程文件(Keil4项目和Proteus仿真文件)可以在相关论坛或我的个人资源分享区获取哦(如有)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/23 12:12:32

探索Green–Ampt入渗模型与Richards非饱和渗流

Green–Ampt入渗模型与Richards非饱和渗流&#xff0c;适用于各类型的均质土体入渗&#xff0c;包括且不限于边坡降雨入渗等 [1]模型简介&#xff1a;使用数值模拟软件COMSOL&#xff0c;以Lima试验分析使用Green-Ampt入渗模型的入渗率变化、最大入渗能力变化及土壤不同深度的压…

作者头像 李华
网站建设 2026/8/22 5:44:47

记忆力:解锁学业成就的核心引擎

我们正经历一场学习革命。当知识总量爆炸式增长&#xff0c;决定胜负的不再是投入时间的长度&#xff0c;而是记忆力的强度。记忆力&#xff0c;这项曾被视为“死记硬背”的底层能力&#xff0c;已成为连接高效学习与卓越成绩的隐形桥梁。真正的记忆力&#xff0c;是信息的智能…

作者头像 李华
网站建设 2026/8/21 19:23:41

人群仿真软件:AnyLogic_(6).行为规则设定

行为规则设定 在AnyLogic中&#xff0c;行为规则设定是人群仿真模型的核心部分。通过设定行为规则&#xff0c;可以模拟不同场景下人群的行为模式&#xff0c;从而更准确地预测和分析人群流动情况。本节将详细介绍如何在AnyLogic中设定行为规则&#xff0c;包括个体行为、群体行…

作者头像 李华