news 2026/5/12 0:14:21

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/5/10 11:29:19

基于Qt的温度湿度传感器采样上位机:从代码到应用

Qt温度湿度传感器采样上位机源代码C语言Qt源代码数据记录功能1.功能介绍&#xff1a; 采用C/C语言编写的&#xff0c;通过串口发送AT指令&#xff0c;获取温度、湿度传感器的采样数据并显示的Qt上位机程序源 采用独立的文本类型串口通信处理类&#xff0c;可方便进行二次开发。…

作者头像 李华
网站建设 2026/5/2 22:26:52

论文AI率98%怎么办?5步降到10%以下超全攻略

论文AI率98%怎么办&#xff1f;5步降到10%以下超全攻略 TL;DR&#xff1a;论文AI率太高不要慌&#xff0c;核心策略是「两步走」——先用DeepSeek做粗处理把AI率降到50%-60%&#xff0c;再用专业工具深度降到10%以下。本文详细拆解5个步骤&#xff0c;从定位问题到最终校对&…

作者头像 李华
网站建设 2026/5/8 8:59:54

AI实时监控测试进度:预警延误与风险‌

测试进度管理的范式变革 随着DevOps与持续交付的普及&#xff0c;传统手工跟踪测试进度的模式已难以应对复杂系统迭代。本文基于2025年行业调研数据&#xff08;Gartner报告显示83%企业遭遇测试延误&#xff09;&#xff0c;深度解析AI监控系统的技术架构、预警机制及落地路径…

作者头像 李华
网站建设 2026/5/11 5:12:45

测试团队的知识管理:AI自动归纳最佳实践

知识管理的迫切性与AI的变革作用 在软件测试领域&#xff0c;知识管理是团队效率与质量保障的核心支柱。测试团队每日产生海量数据——从缺陷报告、测试用例到经验总结——但传统手动管理方式面临诸多挑战&#xff1a;知识碎片化导致重复劳动&#xff0c;隐性经验难以传承&…

作者头像 李华