单片机:实现驱动超声波(附带源码)

单片机实现驱动超声波模块

超声波模块(如HC-SR04)广泛应用于距离测量、避障系统、自动驾驶等嵌入式项目中。它能够通过发射超声波信号并接收反射波来计算物体的距离。本文将介绍如何使用单片机(如51系列单片机)驱动超声波模块,进行距离测量。

1. 项目需求分析

目标:
  1. 超声波发送:通过控制超声波模块发射超声波。
  2. 超声波接收:接收超声波的反射波并测量反射时间。
  3. 距离计算:根据反射波的返回时间计算物体与超声波模块之间的距离。
  4. 数据输出:将测量得到的距离通过串口、LCD屏幕或LED显示器等方式输出。
功能需求:
  1. 发射超声波:通过触发超声波模块的Trig脚发射超声波。
  2. 接收回波:通过Echo脚检测超声波回波的到达时间。
  3. 距离计算 :利用公式 距离 = 速度 × 时间 / 2 计算物体与传感器的距离。
  4. 显示:通过LCD屏、LED或者串口输出测量结果。

2. 硬件设计

2.1 单片机选择

可以选择具有较多I/O口的单片机,如51系列单片机,用于控制超声波模块和显示模块。

2.2 超声波模块(HC-SR04)

超声波模块HC-SR04具有两个主要引脚:

  • Trig引脚:用于触发超声波的发射,发送一个高电平脉冲。
  • Echo引脚:用于接收回波信号,返回一个脉冲宽度,表示超声波从发射到接收的时间。
2.3 显示模块

为了显示距离结果,可以选择:

  • LCD显示屏:如1602 LCD,用于显示距离。
  • 串口输出:通过UART接口将计算结果输出到PC或其他设备。
2.4 连接方式
  • Trig引脚连接到单片机的一个GPIO口,用于触发超声波。
  • Echo引脚连接到单片机的一个输入口,接收反射波信号。
  • LCD或串口模块用于显示测量结果。

3. 软件设计

3.1 超声波模块控制
  1. 发送超声波:通过给Trig引脚发送一个持续10微秒的高电平脉冲,触发超声波发射。
  2. 接收回波:通过Echo引脚读取回波信号的高电平持续时间,得到信号传播的时间。
3.2 距离计算

假设声速为343米/秒(在常温下)。根据超声波的传播公式:

具体来说,回波时间是超声波从传感器到物体并返回的时间,因此除以2来得到物体与传感器之间的实际距离。

3.3 代码实现

下面是使用51单片机控制HC-SR04模块,测量距离并通过LCD显示的代码示例。

cpp 复制代码
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>

// 定义HC-SR04引脚
#define TRIG P1_0  // TRIG引脚连接到P1.0
#define ECHO P1_1  // ECHO引脚连接到P1.1

// 定义LCD控制端口
#define LCD_DATA P2   // LCD数据口连接到P2口
#define LCD_CTRL P3   // LCD控制口连接到P3口
#define RS P3^0
#define RW P3^1
#define EN P3^2

unsigned int time_us = 0;  // 超声波返回时间(微秒)

// 延时函数
void delay(unsigned int time) {
    unsigned int i, j;
    for(i = 0; i < time; i++) {
        for(j = 0; j < 120; j++);
    }
}

// LCD控制函数:写命令
void lcd_write_cmd(unsigned char cmd) {
    LCD_DATA = cmd;
    RS = 0;    // 选择命令寄存器
    RW = 0;    // 选择写操作
    EN = 1;    // 使能LCD
    delay(5);
    EN = 0;    // 关闭使能
}

// LCD控制函数:写数据
void lcd_write_data(unsigned char data) {
    LCD_DATA = data;
    RS = 1;    // 选择数据寄存器
    RW = 0;    // 选择写操作
    EN = 1;    // 使能LCD
    delay(5);
    EN = 0;    // 关闭使能
}

// LCD初始化
void lcd_init() {
    lcd_write_cmd(0x38);    // 设置显示模式
    lcd_write_cmd(0x0C);    // 打开显示,光标不可见
    lcd_write_cmd(0x06);    // 设置光标移位方向
    lcd_write_cmd(0x01);    // 清屏
    delay(10);
}

// LCD清屏
void lcd_clear() {
    lcd_write_cmd(0x01);    // 清屏命令
    delay(10);
}

// LCD显示字符串
void lcd_display_string(char* str) {
    while(*str) {
        lcd_write_data(*str);
        str++;
    }
}

// 初始化HC-SR04模块
void ultrasonic_init() {
    TRIG = 0;   // 初始化TRIG为低电平
    ECHO = 0;   // 初始化ECHO为低电平
}

// 获取超声波的回波时间
unsigned int get_ultrasonic_time() {
    unsigned int count = 0;
    
    // 发送一个10us的脉冲触发超声波
    TRIG = 1;
    delay(1);  // 延时1微秒
    TRIG = 0;

    // 等待ECHO变为高电平,开始计时
    while(ECHO == 0);
    
    // 开始计数
    while(ECHO == 1) {
        count++;
        delay(1);  // 每1微秒增加计数
    }
    return count;
}

// 主程序
void main() {
    unsigned int distance;
    unsigned int time_in_us;
    float distance_cm;
    
    lcd_init();  // 初始化LCD
    ultrasonic_init();  // 初始化超声波模块

    while(1) {
        // 获取回波时间
        time_in_us = get_ultrasonic_time();

        // 计算距离:声速343米/秒,1米=100厘米,1秒=1000000微秒
        distance_cm = (float)(time_in_us * 343) / 20000;  // 距离 = (时间 * 声速) / 2
        
        // 显示距离
        lcd_clear();
        lcd_display_string("Distance:");
        lcd_write_data(' ');
        lcd_write_data((unsigned char)(distance_cm / 10) + '0');  // 显示十位
        lcd_write_data((unsigned char)(distance_cm % 10) + '0');  // 显示个位
        delay(500);
    }
}

4. 代码解析

  1. 超声波发送与接收

    • TRIG引脚:通过给TRIG引脚发送一个10微秒的高电平脉冲来触发超声波的发射。
    • ECHO引脚:当超声波返回时,ECHO引脚会变为高电平,持续时间与回波时间成正比。我们通过计时检测这个高电平的持续时间。
  2. 距离计算

    • 使用公式 距离 = (时间 * 声速) / 2 来计算物体与超声波模块之间的距离。声速为343米/秒,单位转换后得出公式。
  3. LCD显示

    • LCD显示函数通过将计算出来的距离显示在LCD屏幕上。
    • 每次测量时,LCD显示更新一次,展示当前距离。
  4. 超声波初始化

    • ultrasonic_init() 函数用于初始化TRIG和ECHO引脚,确保在程序运行时它们的初始状态正确。
  5. 延时函数

    • delay() 函数用于生成延时,避免在按键扫描或超声波回波检测时过快响应。

5. 总结

本项目使用单片机和超声波模块(如HC-SR04)实现了距离测量功能。通过TRIG和ECHO引脚控制超声波的发送与接收,计算回波的时间并转换为距离。结果可以通过LCD显示屏显示出来。此项目适用于简单的距离测量和避障系统,也可以扩展为更复杂的功能,如多点测量、物体追踪等。

扩展方向:

  1. 多点测量:使用多个超声波模块进行多点距离测量,形成完整的环境感知系统。
  2. 数据存储与处理:将测量数据存储并进行进一步分析,如将结果发送到上位机进行显示或处理。
  3. 障碍物检测与避障:将测量数据与其他传感器结合,形成自动避障系统。

此项目是一个典型的嵌入式应用,可以帮助开发者深入了解传感器控制、信号处理以及输出显示等基本技术。

相关推荐
智商偏低2 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen3 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
森焱森5 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白5 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D6 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术9 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt9 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘9 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang9 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c
几个几个n12 小时前
STM32-第二节-GPIO输入(按键,传感器)
单片机·嵌入式硬件