视频讲解
简介
HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达3mm,包括发射器、接收器与控制电路,它是一种压电式传感器,利用电致伸缩现象而制成。在压电材料切片上(如石英晶体、压电陶瓷、钛酸铅钡等)施加交变电压,使它产生电致伸缩振动而产生超声波。当外加交变电压的频率等于晶片的固有频率而产生共振,这时产生的超声波最强。压电式超声波接收器一般是利用超声波发生器的逆效应进行工作的,其结构和超声波发生器基本相同,有时就用同一个换能器兼作发生器和接收器两种用途。当超声波作用到压电晶片上时使晶片伸缩,在晶片的两个界面上便产生交变电荷后转换成电压经放大送到测量电路,最后记录或显示出来。
采用IO口TRIG触发测距,给最少10us的高电平信号。模块自动发送8个40khz的方波,自动检测是否有信号返回。
通过IO口ECHO输出一个高电平,同时开定时器计时,当此口变为低电平时就可以读定时器的值,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;us/58=厘米或者us/148=英寸;(us为回响高电平信号持续时间)建议测量周期为 60ms以上,以防止发射信号对回响信号的影响。
软件流程图
程序分析
hc-sr04.c
/**********************************
作者:特纳斯电子
网站:https://www.mcude.com
联系方式:46580829(QQ)
淘宝店铺:特纳斯电子
**********************************/
/**********************************
包含头文件
**********************************/
#include "hc-sr04.h"
/*********************************************************
函数功能:毫秒级的延时函数,time是要延时的毫秒数
传入值:time:要延时的毫秒数
返回值:无
*********************************************************/
void Hcsr04_DelayMs(uint time)
{
uint i,j;
for(i=0;i<time;i++)
for(j=0;j<112;j++);
}
/*********************************************************
函数功能:T0定时器初始化
传入值:无
返回值:无
*********************************************************/
void Time0_Init(void)
{
TMOD|=0x01; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1; //允许T0中断
EA=1; //开启总中断
}
/*********************************************************
函数功能:计算测到的距离
传入值:当前的环境温度
返回值:测得的距离(距离单位cm)
*********************************************************/
uint Hcsr04_GetDistance(uint Hcsr04_temp)
{
uint distance; // 用于记录测得的距离
float gSpeed; // 保存超声波的速度值
gSpeed = 0.607*Hcsr04_temp+331.4; // 根据公式 v=0.607T+331.4 计算出当前温度值对应的超声波速度,这时的单位是“米/秒”
gSpeed = gSpeed/10000; // 将超声波的速度从单位“m/s”转为“cm/us”,方便后面的计算
TH0 = 0; //如果使用了两个超声波距离传感器,则需要改成T1的HT1
TL0 = 0;
HCSR04_Trig = 1; // 给超声波模块一个开始脉冲
Hcsr04_DelayMs(1);
HCSR04_Trig = 0;
TR0 = 1;
while(!HCSR04_Echo) // 等待超声波模块的返回脉冲
{
if(TH0*256+TL0 >= 50000) //防止超声波卡死
break;
}
TH0 = TL0 = 0; //计时清零
TR0 = 1; // 启动定时器,开始计时
while(HCSR04_Echo) // 等待超声波模块的返回脉冲结束
{
if(TH0*256+TL0 >= 50000) //防止超声波卡死
break;
}
TR0 = 0; // 停止定时器,停止计时
distance=((TH0*256+TL0)*gSpeed)/2; // 距离cm=(时间us * 速度cm/us)/2
if(distance > 500) // 把检测结果限制500厘米内
distance = 500;
return distance;
}
hc-sr04.h
/**********************************
作者:特纳斯电子
网站:https://www.mcude.com
联系方式:46580829(QQ)
淘宝店铺:特纳斯电子
**********************************/
#ifndef _HC_SR04_H_
#define _HC_SR04_H_
/**********************************
包含头文件
**********************************/
#include "main.h"
/**********************************
PIN口定义
**********************************/
sbit HCSR04_Trig = P1^0; // 超声波模块的Trig引脚P1.0
sbit HCSR04_Echo = P1^1; // 超声波模块的Echo引脚P1.1
/**********************************
函数声明
**********************************/
void Time0_Init(void); //定时器0初始化函数
uint Hcsr04_GetDistance(uint Hcsr04_temp); //超声波获取距离值(距离单位cm)
#endif