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

2023-11-28 12:56:28 浏览数 (2)

一、前言

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

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

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

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

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

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

二、项目设计思路

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

四、项目完整代码设计

代码语言:javascript复制
#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液晶显示屏的控制方法。

0 人点赞