您当前的位置:首页 > 电子 > 单片机

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

时间:11-01来源:作者:点击数:

一、前言

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
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐