STC90C51+HC-SR04超声波测距模块完成测距仪设计(测量距离实现壁障)

举报
DS小龙哥 发表于 2024/07/15 11:27:40 2024/07/15
【摘要】 本项目的开发背景源于对机器人或自动化设备中安全壁障功能的需求。在诸如无人驾驶车辆、自动搬运机器人、智能家居系统以及工业自动化等应用场景中,为了避免设备与环境中的障碍物发生碰撞,确保设备和人员安全,实时、准确地检测并测量与障碍物之间的距离变得至关重要。

一、前言

1.1 功能介绍

本项目的开发背景源于对机器人或自动化设备中安全壁障功能的需求。在诸如无人驾驶车辆、自动搬运机器人、智能家居系统以及工业自动化等应用场景中,为了避免设备与环境中的障碍物发生碰撞,确保设备和人员安全,实时、准确地检测并测量与障碍物之间的距离变得至关重要。

HC-SR04超声波测距模块以其高精度、低成本和易于集成的特点,成为了实现这一功能的理想选择。该模块通过发射超声波并接收其反射信号来测量距离,具有测量范围广、响应速度快、抗干扰能力强等优点。结合ST90C51微控制器的强大处理能力和丰富的I/O接口,可以实现对HC-SR04模块的精确控制,并快速处理测距数据,实现实时的壁障功能。

本项目结合ST90C51微控制器和HC-SR04超声波测距模块,设计并实现一个能够实时测量与障碍物之间距离,并根据距离信息执行相应壁障动作的系统。通过编写合适的程序算法,可以实现对测量数据的分析、判断和控制,当检测到设备接近障碍物时,自动触发壁障机制,如减速、转向或停止,以避免发生碰撞事故。这一项目的成功实施,不仅可以提升设备的安全性能,降低维护成本,还可以为相关领域的自动化和智能化发展提供有力的技术支持。

image-20240612133714577

image-20240612133741173

1.2 HC-SR04超声波测距模块介绍

image-20240612133618209

image-20240612133630913

image-20240612133650068

image-20240612133701989

HC-SR04超声波测距模块是一种基于超声波原理进行测距的传感器模块,被广泛应用于机器人导航、智能家居、安防系统等领域。该模块主要由两个压电陶瓷超声传感器构成,一个用于发射超声波信号,另一个用于接收被目标物体反射回来的超声波信号。由于超声波信号在空气中的传播速度已知(约为340米/秒),模块通过测量超声波从发射到接收的时间差,可以精确计算出目标与传感器之间的距离。

HC-SR04模块的主要技术参数包括:使用电压为DC 5V,静态电流小于2mA,感应角度不大于15度,探测距离范围从2cm到450cm(部分资料提到400cm),并具有高精度特性,可达0.2cm或0.3cm。模块的工作原理是通过IO口触发测距,给至少10us的高电平信号后,模块会自动发送8个40kHz的方波,并自动检测是否有信号返回。当有信号返回时,模块会通过IO口输出一个高电平信号,高电平持续的时间就是超声波从发射到返回的时间。根据这个时间差和超声波在空气中的传播速度,可以计算出目标与传感器之间的距离。

HC-SR04超声波测距模块的性能稳定,测距精确,能够与国外的SRF05、SRF02等超声波测距模块相媲美。其接线方式简单,通常包括VCC(电源正极)、Trig(控制端)、Echo(接收端)和GND(电源负极)四个引脚。此外,HC-SR04模块还提供了丰富的编程接口和参考程序,支持多种微控制器和编程语言,如Arduino、C51、PIC等,方便用户进行二次开发和集成。

HC-SR04超声波测距模块以其高精度、高可靠性和易用性,成为了许多项目中不可或缺的一部分,为机器人导航、智能家居、安防系统等领域的发展提供了有力的支持。

二、代码实现

2.1 main.c

#include <reg51.h>
#include <INTRINS.H>
#include "delay.h"
#include "type.h"
#include "uart.h"
#include "ds1302.h"
#include "pcf8591.h"
//#include "key.h"
//#include "led.h"
#include "timer.h"
//#include "exti.h"
//#include "infrared.h"
//#include "ds18b20.h"
//#include "at24c02.h"

sbit ECHO=P1^0;  //超声波的回响信号输出脚
sbit TRIG=P1^1;  //触发超声波测距的引脚
u32 timt0_cnt=0; //记录定时器0溢出的次数
u16 time_val=0;
float distance=0.0; //保存测量的距离
int main()
{
    ECHO=0;  
    TRIG=0;
    UART_Init(); //初始化串口波特率为4800
    while(1)
    {
        TRIG=1;//触发测距
        delay20us(); //延时20us
        TRIG=0;          //停止触发
        while(ECHO==0){} //等待回响信号返回
        Timer0_16bit_Init(65535); //初始化定时器0,并开始计数
        while(ECHO==1){} //等待回响信号结束
        TR0=0;           //关闭定时器0
        time_val=(TH0<<8|TL0)+timt0_cnt*65535; //计算时间
        distance=time_val/58.0; //得到距离。单位是厘米
        printf("distance=%f CM\r\n",distance);
        timt0_cnt=0; //溢出次数清零  
        DelayMs(1000); //延时1秒
    }
}


2.2 exit.c

#include "exti.h"
/*
配置外部中断0下降沿触发中断
IO口: P3.2
*/
sfr IPH=0xB7; //定义特殊功能寄存器
void EXTI0_Init(void)
{
   IPH|=1<<0; //配置PX0H=1 
   PX0=1;     //当PX0H=1且PX0=1时,外部中断0为最高优先级中断(优先级3)
   EA=1;  //开启总中断
   IT0=1; //外部中断0下降沿触发
   EX0=1; //允许外部中断0产生中断
}

///*
//外部中断0中断服务函数
//*/
//void EXTI0_IRQHandler(void) interrupt 0
//{
//    LED=~LED; //改变LED灯的状态
//    IE0=0; //清除外部中断0的标志位
//}

/*
配置外部中断1下降沿触发中断
IO口: P3.2
*/
void EXTI1_Init(void)
{
   EA=1;  //开启总中断
   IT1=1; //外部中断1下降沿触发
   EX1=1; //允许外部中断1产生中断
}
/*
外部中断1中断服务函数
IO口: P3.3
*/
void EXTI1_IRQHandler(void) interrupt 2
{
    while(1){}  //死循环
    LED=~LED; //改变LED灯的状态
    IE1=0; //清除外部中断1的标志位
}

2.3 exit.h

#ifndef _EXTI_H
#define _EXTI_H
#include <reg51.h>
#include "led.h"
void EXTI0_Init(void);
void EXTI1_Init(void);
#endif
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。