基于单片机设计的超声波测距仪(采用HC-SR04模块)

一、前言

本项目是基于单片机设计的超声波测距仪,主要采用了STC89C52单片机和HC-SR04超声波测距模块。通过LCD1602液晶显示屏来展示测量的距离信息。

超声波测距技术是一种常见的非接触式测距方法,利用超声波的传播速度测量物体与测距器之间的距离。它具有测量范围广、精度高、反应迅速等特点,在自动控制、机器人导航、无人驾驶等领域得到广泛应用。

本项目选用了STC89C52作为主控芯片,它是一款常见且功能强大的8051系列单片机,具有较强的计算和控制能力,适合用于各种嵌入式系统设计。

同时,采用了HC-SR04超声波测距模块作为测距模块。HC-SR04模块能够向前发射超声波信号,并接收回波信号,通过测量发射到接收之间的时间差来计算出距离。

通过STC89C52单片机与HC-SR04超声波测距模块的连接和控制,可以实时获取测得的距离,并通过LCD1602液晶显示屏进行显示。LCD1602液晶显示屏具有简单、直观、易于读取的优点,可以方便地展示测量的距离信息。

本项目目的是设计一款简单而实用的超声波测距仪,为用户提供准确、可靠的距离测量功能,以满足不同领域对测距需求的应用。

image-20230913142057168

image-20230913142143839

二、项目设计思路

2.1 硬件设计

本项目的硬件设计思路主要包括以下几个方面:主控芯片选择、超声波测距模块选择、电源设计与连接方式。

(1)主控芯片选择:在本项目中,选用STC89C52单片机作为主控芯片。STC89C52是一款基于8051架构的单片机,具有丰富的外设资源和强大的计算能力,适合用于嵌入式系统设计。

(2)超声波测距模块选择:在本项目中,选用HC-SR04超声波测距模块作为测距模块。HC-SR04模块具有发送超声波信号和接收回波信号的功能,能够准确测量物体与测距器之间的距离。

(3)电源设计与连接方式:为了给单片机和超声波测距模块提供稳定的工作电源,可以选择使用直流电源适配器或者电池供电。通常情况下,将电源正极连接到单片机和超声波测距模块的VCC引脚上,将电源负极连接到GND引脚上。

2.2 软件设计

(1)初始化设置:在程序的开始部分,需要对单片机进行初始化设置,包括引脚模式设置、定时器设置等。

(2)发送超声波信号:通过单片机控制超声波测距模块的发送引脚,发射一定频率和持续时间的超声波信号。

(3)接收回波信号:单片机通过控制超声波测距模块的接收引脚,监听回波信号并计时,记录回波信号的持续时间。

(4)距离计算:根据回波信号的持续时间,可以计算出物体与测距器之间的距离。在软件中进行相关的计算,并将计算结果保存在变量中。

(5)数据显示:通过LCD1602液晶显示屏,将测量得到的距离信息显示出来。可以通过单片机控制液晶显示屏的引脚,向其发送相应的数据和命令。

2.3 硬件模块与单片机的连接方式

将HC-SR04超声波测距模块和LCD1602液晶显示屏连接到STC89C52单片机的IO口:

HC-SR04模块引脚连接:

(1)Trig引脚连接到单片机的P1.0口

(2)Echo引脚连接到单片机的P1.1口

(3)VCC引脚连接到单片机的VCC引脚

(4)GND引脚连接到单片机的GND引脚

LCD1602液晶显示屏引脚连接:

(1)RS引脚连接到单片机的P2.0口

(2)RW引脚连接到单片机的P2.1口

(3)E引脚连接到单片机的P2.2口

(4)D4引脚连接到单片机的P2.4口

(5)D5引脚连接到单片机的P2.5口

(6)D6引脚连接到单片机的P2.6口

(7)D7引脚连接到单片机的P2.7口

(8)VCC引脚连接到单片机的VCC引脚

(9)GND引脚连接到单片机的GND引脚

三、HC-SR04 模块介绍

HC-SR04 是一种常用的超声波测距模块,能够通过发射超声波脉冲并接收其回波来测量物体与模块之间的距离。以下是 HC-SR04 超声波测距模块的详细介绍:

(1)原理:HC-SR04 模块利用超声波的回波时间来计算物体与模块之间的距离。它由两个主要部分组成:超声波发射器和超声波接收器。发射器向前方发射短脉冲的超声波,然后接收器接收到回波。通过测量发射和接收之间的时间差,可以计算出物体到模块的距离。

(2)测量原理:HC-SR04 模块使用的超声波是不可闻的高频声波,通常工作频率为40 kHz。模块通过发送一个10微秒的脉冲来触发超声波的发射,然后等待接收回波。当接收到回波时,模块会停止计时,并将测量到的时间转换为距离。

(3)测量范围:HC-SR04 模块的测量范围通常在2cm到400cm之间,具体取决于环境条件和模块质量。较远距离的测量可能会有一定的误差。

(4)工作电压:HC-SR04 模块的工作电压通常为5V,可以通过连接到微控制器或其他适配器来供电。

(5)接口:HC-SR04 模块通常使用四个引脚进行连接。其中,两个引脚用于电源供电(VCC 和 GND),一个引脚用于触发超声波发射(Trig),另一个引脚用于接收超声波回波并输出测量结果(Echo)。

(6)使用方法:使用 HC-SR04 模块进行测距通常需要以下步骤:

  • 将模块连接到适当的电源和控制器。
  • 发送一个短脉冲触发信号到 Trig 引脚,使模块发射超声波。
  • 检测 Echo 引脚上的回波信号,并计算回波时间。
  • 根据回波时间和声速的关系,计算出物体到模块的距离。
  • 可以通过适当的算法和校准来提高测量的准确性。

(7)应用领域:HC-SR04 模块被广泛应用于距离测量、避障、无人机高度控制、智能车辆导航、自动门控制等领域。它具有简单易用、成本低廉和较好的测距精度等特点,适用于许多电子和机器人项目。

HC-SR04 超声波测距模块利用超声波的发射和接收来测量物体到模块之间的距离。它是一种常用的测距模块,具有简单易用、成本低廉和较好的测量精度等特点,适用于各种距离测量和避障应用。

四、项目完整代码设计

#include <reg52.h>
#include <intrins.h>

#define LCD_RS P2_0  // 液晶显示屏的RS引脚连接到P2.0口
#define LCD_RW P2_1  // 液晶显示屏的RW引脚连接到P2.1口
#define LCD_E  P2_2  // 液晶显示屏的E引脚连接到P2.2口
#define LCD_D4 P2_4  // 液晶显示屏的D4引脚连接到P2.4口
#define LCD_D5 P2_5  // 液晶显示屏的D5引脚连接到P2.5口
#define LCD_D6 P2_6  // 液晶显示屏的D6引脚连接到P2.6口
#define LCD_D7 P2_7  // 液晶显示屏的D7引脚连接到P2.7口

#define TRIG P1_0    // 超声波测距模块的Trig引脚连接到P1.0口
#define ECHO P1_1    // 超声波测距模块的Echo引脚连接到P1.1口

sbit RS = LCD_RS;
sbit RW = LCD_RW;
sbit E = LCD_E;
sbit D4 = LCD_D4;
sbit D5 = LCD_D5;
sbit D6 = LCD_D6;
sbit D7 = LCD_D7;

void delay(unsigned int time) {
    while (time--) {
        for (int i = 0; i < 120; i++);
    }
}

void lcd_enable() {
    E = 1;
    _nop_();
    E = 0;
}

void lcd_write_cmd(unsigned char cmd) {
    RS = 0;
    RW = 0;
    P0 = cmd;
    lcd_enable();
}

void lcd_write_data(unsigned char dat) {
    RS = 1;
    RW = 0;
    P0 = dat;
    lcd_enable();
}

void lcd_init() {
    lcd_write_cmd(0x38);    // 初始化8位数据接口,2行显示,5x7点阵字符
    lcd_write_cmd(0x0c);    // 开启显示,不显示光标
    lcd_write_cmd(0x06);    // 光标右移,不移动显示
    lcd_write_cmd(0x01);    // 清屏
}

void lcd_clear() {
    lcd_write_cmd(0x01);
}

void lcd_print(const unsigned char *str) {
    while (*str) {
        lcd_write_data(*str++);
    }
}

unsigned int measure_distance() {
    unsigned int distance;
    TRIG = 0;   // 发送触发信号
    delay(10);
    TRIG = 1;
    delay(12);
    TRIG = 0;
    while (!ECHO);  // 等待回波信号
    TH0 = 0;    // 初始化定时器初值
    TL0 = 0;
    TR0 = 1;    // 启动定时器
    while (ECHO);  // 等待回波信号结束
    TR0 = 0;    // 停止定时器
    distance = TH0 * 256 + TL0; // 计算距离
    distance = distance / 58;   // 将时间转换为距离(单位:厘米)
    return distance;
}

void main() {
    unsigned int distance;
    lcd_init();
    lcd_clear();
    while (1) {
        distance = measure_distance();  // 测量距离
        lcd_clear();
        lcd_print("Distance: ");
        if (distance >= 100) {
            lcd_write_data(distance / 100 % 10 + '0');
            lcd_write_data(distance / 10 % 10 + '0');
            lcd_write_data('.');
            lcd_write_data(distance % 10 + '0');
            lcd_print(" m");
        } else {
            lcd_write_data(distance / 10 % 10 + '0');
            lcd_write_data('.');
            lcd_write_data(distance % 10 + '0');
            lcd_print(" cm");
        }
        delay(200);
    }
}

五、总结

本项目成功地设计和实现了一个基于STC89C52单片机和HC-SR04超声波测距模块的超声波测距仪。实现了距离测量和LCD显示的功能。这个简单而实用的设备可以广泛应用于距离测量和自动控制领域,为生活带来了便利。通过项目的实施,可以获得丰富的经验和知识。学会如何正确地连接硬件设备,理解和操作单片机的IO口,以及使用超声波测距模块进行距离测量。同时,可以提高C语言编程的技巧,掌握LCD1602液晶显示屏的控制方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/195077.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GDOUCTF2023-Reverse WP

文章目录 [GDOUCTF 2023]Check_Your_Luck[GDOUCTF 2023]Tea[GDOUCTF 2023]easy_pyc[GDOUCTF 2023]doublegame[GDOUCTF 2023]L&#xff01;s&#xff01;[GDOUCTF 2023]润&#xff01;附 [GDOUCTF 2023]Check_Your_Luck 根据 if 使用z3约束求解器。 EXP&#xff1a; from z3 i…

【C++】探索C++模板编程

文章目录 什么是C模板&#xff1f;模板的基本语法类型模板参数模板函数的示例类模板的示例总结 C模板是一种强大的编程工具&#xff0c;它可以实现泛型编程&#xff0c;使代码更加灵活和可重用。本篇博客将介绍C模板的基本语法、类型模板参数和模板函数的使用&#xff0c;并通过…

第20章:多线程

20.1 线程简介 在Java中&#xff0c;并发机制非常重要&#xff0c;程序员可以在程序中执行多个线程&#xff0c;每个线程完成一个功能&#xff0c;并与其他线程并发执行&#xff0c;这种机制被称为多线程。但是&#xff0c;并不是所有编程语言都支持多线程。 线程的特点&#…

集群 CPU 利用率均值达 45% ,揭秘小红书规模化混部技术实践

根据 Gartner 预测数据显示&#xff1a;2024 年全球 IT 支出预计将达到 5.1 万亿美元&#xff0c;比 2023 年增长 8 %。然而&#xff0c;该机构的另一项调查数据显示&#xff1a;全球数据中心服务器平均 CPU 利用率普遍低于 20%&#xff0c;存在巨大的资源浪费。据测算&#xf…

Python内置函数与标准库函数的解释示例

一、内置函数与标准库函数的区分 Python 解释器自带的函数叫做内置函数&#xff0c;这些函数可以直接使用&#xff0c;不需要导入某个模块。 Python 解释器也是一个程序&#xff0c;它给用户提供了一些常用功能&#xff0c;并给它们起了独一无二的名字&#xff0c;这些常用功能…

C语言——标识符

一、标识符是什么 标识符是C程序的最基本组成部分&#xff0c;例如&#xff1a;变量名称、函数名称、数据类型等等&#xff0c;都是一个标识符。标识符的要求是&#xff1a;必须由字母&#xff08;区分大小写&#xff09;、数字、下划线组成。而且&#xff0c;标识符的第一个字…

Django回顾【一】

一、Web应用程序 Web应用程序是一种可以通过Web访问的应用程序&#xff0c;程序的最大好处是用户很容易访问应用程序&#xff0c;用户只需要有浏览器即可&#xff0c;不需要再安装其他软件。应用程序有两种模式C/S、B/S。 C/S&#xff1a;客户端<----->服务端 例如My…

共筑关基安全防线,开源网安加入中关村华安关键信息基础设施安全保护联盟

近日&#xff0c;开源网安正式加入“中关村华安关键信息基础设施安全保护联盟”&#xff08;以下简称&#xff1a;关保联盟&#xff09;成为会员单位&#xff0c;进一步加强与行业内重要机构、企业的协同合作&#xff0c;推动关键信息基础设施安全保护领域的生态建设。 未来&am…

9.Spring 整合 Redis

引入依赖&#xff1a;spring-boot-starter-data-redis配置 Redis&#xff1a;配置数据库参数、编写配置类&#xff0c;构造 RedisTemplate访问 Redis&#xff1a; redisTemplate.opsForValue() redisTemplate.opsForHash() redisTemplate.opsForList() redisTemplate.opsForSe…

Codebeamer—软件全生命周期管理轻量级平台

产品概述 Codebeamer涵盖了软件研发的生命周期&#xff0c;在一个整合的平台内支持需求管理、测试管理、软件开发过程管理以及项目管理等&#xff0c;同时具有IToperations&DevOps相关的内容&#xff0c;并支持变体管理的功能。对于使用集成的应用程序生命周期管理&#xf…

LVS-DR实验

实验前准备 DR服务器&#xff1a;192.168.188.11 192.168.188.15 NFS服务器&#xff1a;192.168.188.14 Web服务器1&#xff1a;192.168.188.12 Web服务器2&#xff1a;192.168.188.13 Vip&#xff1a;192.168.188.188 客户端&#xff1a;192.168.188.200 配置负载均衡调度…

Stable Video Diffusion重磅发布:基于稳定扩散模型的AI生成视频

最近&#xff0c;stability.ai发布了稳定视频扩散&#xff0c;这是stability.ai第一个基于图像模型稳定扩散的生成视频基础模型。现在可以在研究预览中看到&#xff0c;这个最先进的生成人工智能视频模型代表着stability.ai在为每种类型的人创建模型的过程中迈出了重要的一步。…

C++学习之路(七)C++ 实现简单的Qt界面(消息弹框、按钮点击事件监听)- 示例代码拆分讲解

这个示例创建了一个主窗口&#xff0c;其中包含两个按钮。第一个按钮点击时会显示一个简单的消息框&#xff0c;第二个按钮点击时会执行一个特定的操作&#xff08;在这个例子中&#xff0c;仅打印一条调试信息&#xff09;。 功能描述&#xff1a; 创建窗口和布局&#xff1a;…

linux 内核线程

内核线程类似于用户进程&#xff0c;通常用于并发处理些工作&#xff0c;它是一种在内核空间实现后台任务的方式&#xff0c;并且可以参与时间片轮转调度。 内核线程可以进行繁忙的异步事件处理&#xff0c;也可以睡眠等待某事件的发生&#xff0c;内核线程可以访问内核函数和…

名词解释之EID和SR

大家在聊辅助驾驶时&#xff0c;经常会发现有名词叫SR&#xff0c;或者EID&#xff0c;理想的环境感知界面叫EID&#xff0c;而其他很多车型里大家管那个界面叫SR。我们下面具体看下这两个词具体指什么。 SR是“Situational Awareness”的缩写,意思是环境感知或场景认知。 SR系…

【2023CANN训练营第二季】——Ascend C自定义算子工程介绍及实验

一、自定义算子工程介绍与创建 自定义算子工程是一个包含用户编写的host侧和kerne|侧算子实现文件的&#xff0c;用于编译和安装自定义算子run包的工程框架。 CANN软件包中提供了工程创建工具msopgen&#xff0c;开发者可以输入算子原型定义文件生成Ascend C算子开发工程。 需…

每日一题--寻找重复数

蝶恋花-王国维 阅尽天涯离别苦&#xff0c; 不道归来&#xff0c;零落花如许。 花底相看无一语&#xff0c;绿窗春与天俱莫。 待把相思灯下诉&#xff0c; 一缕新欢&#xff0c;旧恨千千缕。 最是人间留不住&#xff0c;朱颜辞镜花辞树。 目录 题目描述&#xff1a; 思路分析…

JVM运行时数据区域、对象内存分配、内存溢出异常总结

深入理解java虚拟机第二章 二、运行时数据区域2.2.1 程序计数器2.2.2 Java虚拟机栈2.2.3 本地方法栈2.2.4 Java堆2.2.5 方法区2.2.6 运行时常量池2.2.7 直接内存 三、HotSpot虚拟机对象解密2.3.1 对象的创建对象如何分配内存&#xff1f;对象的创建如何处理并发问题&#xff1f…

浏览器触发下载Excel文件-Java实现

目录 1:引入maven 2:代码实现 3.导出通讯录信息到Excel文件 4.生成并下载Excel文件部分解释 1:引入maven 添加依赖:首先,在你的项目中添加EasyExcel库的依赖。你可以在项目的构建文件(如Maven的pom.xml)中添加以下依赖项:<dependency><groupId>com.alib…

vue3 setup语法糖,常用的几个:defineProps、defineEmits、defineExpose、

vue3和vue2组件之间传参的不同 <script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。 <script setup> 中的代码会在每次组件实例被创建的时候执行。 任何在 <script setup> 声明的顶层的绑定 (包括变量&#xff0c;函数声明&#xff0…