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

打印 上一主题 下一主题

主题 827|帖子 827|积分 2481

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

超声波模块(如HC-SR04)广泛应用于间隔丈量、避障系统、自动驾驶等嵌入式项目中。它能够通过发射超声波信号并接收反射波来计算物体的间隔。本文将介绍怎样使用单片机(如51系列单片机)驱动超声波模块,举行间隔丈量。
1. 项目需求分析

目的:


  • 超声波发送:通过控制超声波模块发射超声波。
  • 超声波接收:接收超声波的反射波并丈量反射时间。
  • 间隔计算:根据反射波的返回时间计算物体与超声波模块之间的间隔。
  • 数据输出:将丈量得到的间隔通过串口、LCD屏幕或LED显示器等方式输出。
功能需求:


  • 发射超声波:通过触发超声波模块的Trig脚发射超声波。
  • 接收回波:通过Echo脚检测超声波回波的到达时间。
  • 间隔计算:使用公式 间隔 = 速度 × 时间 / 2 计算物体与传感器的间隔。
  • 显示:通过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 超声波模块控制


  • 发送超声波:通过给Trig引脚发送一个持续10微秒的高电平脉冲,触发超声波发射。
  • 接收回波:通过Echo引脚读取回波信号的高电平持续时间,得到信号传播的时间。
3.2 间隔计算

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

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

下面是使用51单片机控制HC-SR04模块,丈量间隔并通过LCD显示的代码示例。
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #include <intrins.h>
  4. // 定义HC-SR04引脚
  5. #define TRIG P1_0  // TRIG引脚连接到P1.0
  6. #define ECHO P1_1  // ECHO引脚连接到P1.1
  7. // 定义LCD控制端口
  8. #define LCD_DATA P2   // LCD数据口连接到P2口
  9. #define LCD_CTRL P3   // LCD控制口连接到P3口
  10. #define RS P3^0
  11. #define RW P3^1
  12. #define EN P3^2
  13. unsigned int time_us = 0;  // 超声波返回时间(微秒)
  14. // 延时函数
  15. void delay(unsigned int time) {
  16.     unsigned int i, j;
  17.     for(i = 0; i < time; i++) {
  18.         for(j = 0; j < 120; j++);
  19.     }
  20. }
  21. // LCD控制函数:写命令
  22. void lcd_write_cmd(unsigned char cmd) {
  23.     LCD_DATA = cmd;
  24.     RS = 0;    // 选择命令寄存器
  25.     RW = 0;    // 选择写操作
  26.     EN = 1;    // 使能LCD
  27.     delay(5);
  28.     EN = 0;    // 关闭使能
  29. }
  30. // LCD控制函数:写数据
  31. void lcd_write_data(unsigned char data) {
  32.     LCD_DATA = data;
  33.     RS = 1;    // 选择数据寄存器
  34.     RW = 0;    // 选择写操作
  35.     EN = 1;    // 使能LCD
  36.     delay(5);
  37.     EN = 0;    // 关闭使能
  38. }
  39. // LCD初始化
  40. void lcd_init() {
  41.     lcd_write_cmd(0x38);    // 设置显示模式
  42.     lcd_write_cmd(0x0C);    // 打开显示,光标不可见
  43.     lcd_write_cmd(0x06);    // 设置光标移位方向
  44.     lcd_write_cmd(0x01);    // 清屏
  45.     delay(10);
  46. }
  47. // LCD清屏
  48. void lcd_clear() {
  49.     lcd_write_cmd(0x01);    // 清屏命令
  50.     delay(10);
  51. }
  52. // LCD显示字符串
  53. void lcd_display_string(char* str) {
  54.     while(*str) {
  55.         lcd_write_data(*str);
  56.         str++;
  57.     }
  58. }
  59. // 初始化HC-SR04模块
  60. void ultrasonic_init() {
  61.     TRIG = 0;   // 初始化TRIG为低电平
  62.     ECHO = 0;   // 初始化ECHO为低电平
  63. }
  64. // 获取超声波的回波时间
  65. unsigned int get_ultrasonic_time() {
  66.     unsigned int count = 0;
  67.    
  68.     // 发送一个10us的脉冲触发超声波
  69.     TRIG = 1;
  70.     delay(1);  // 延时1微秒
  71.     TRIG = 0;
  72.     // 等待ECHO变为高电平,开始计时
  73.     while(ECHO == 0);
  74.    
  75.     // 开始计数
  76.     while(ECHO == 1) {
  77.         count++;
  78.         delay(1);  // 每1微秒增加计数
  79.     }
  80.     return count;
  81. }
  82. // 主程序
  83. void main() {
  84.     unsigned int distance;
  85.     unsigned int time_in_us;
  86.     float distance_cm;
  87.    
  88.     lcd_init();  // 初始化LCD
  89.     ultrasonic_init();  // 初始化超声波模块
  90.     while(1) {
  91.         // 获取回波时间
  92.         time_in_us = get_ultrasonic_time();
  93.         // 计算距离:声速343米/秒,1米=100厘米,1秒=1000000微秒
  94.         distance_cm = (float)(time_in_us * 343) / 20000;  // 距离 = (时间 * 声速) / 2
  95.         
  96.         // 显示距离
  97.         lcd_clear();
  98.         lcd_display_string("Distance:");
  99.         lcd_write_data(' ');
  100.         lcd_write_data((unsigned char)(distance_cm / 10) + '0');  // 显示十位
  101.         lcd_write_data((unsigned char)(distance_cm % 10) + '0');  // 显示个位
  102.         delay(500);
  103.     }
  104. }
复制代码
4. 代码解析


  • 超声波发送与接收

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

  • 间隔计算

    • 使用公式 间隔 = (时间 * 声速) / 2 来计算物体与超声波模块之间的间隔。声速为343米/秒,单元转换后得出公式。

  • LCD显示

    • LCD显示函数通过将计算出来的间隔显示在LCD屏幕上。
    • 每次丈量时,LCD显示更新一次,展示当前间隔。

  • 超声波初始化

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

  • 延时函数

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

5. 总结

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

  • 多点丈量:使用多个超声波模块举行多点间隔丈量,形成完整的环境感知系统。
  • 数据存储与处理:将丈量数据存储并举行进一步分析,如将结果发送到上位机举行显示或处理。
  • 障碍物检测与避障:将丈量数据与其他传感器联合,形成自动避障系统。
此项目是一个典范的嵌入式应用,可以资助开辟者深入了解传感器控制、信号处理以及输出显示等根本技能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表