51单片机-HC-SR04超声波
HC_SR04介绍
特点
HC-SR04
超声波测距模块可提供 2cm-400cm
的非接触式距离感测功能,测距精度可达高到 3mm
;模块包括超声波发射器、接收器与控制电路。
基本工作原理
- 采用IO口 TRIG触发测距,给最少
10us
的高电平信呈。 - 模块自动发送
8个40khz的方波
,自动检测是否有信号返回; - 有信号返回,通过IO口
ECHO输出一个高电平
,高电平持续的时间就是超声波从发射到返回的时间。 测试距离=
- 建议测量周期为
60ms以上
,以防止发射信号对回响信号的影响(比如你发射信号发出去还没回来你就把距离测出来了,是不是很离谱) - 测距时,
被测物体面积不少于0.5平方米
且平面尽量平整,否则影响测量结果
[{"url":"https://image-1309791158.cos.ap-guangzhou.myqcloud.com/其他/202204031536335.jpg","alt":""},{"url":"https://image-1309791158.cos.ap-guangzhou.myqcloud.com/其他/202204031536620.jpg","alt":""},{"url":"https://image-1309791158.cos.ap-guangzhou.myqcloud.com/其他/202204031544637.jpg","alt":""}]
软件编写
Sonar.h
# ifndef __SONAR_H_YAOWU__
# define __SONAR_H_YAOWU__
# ifndef uchar
# define uchar unsigned char
# endif
# ifndef uint
# define uint unsigned int
# endif
# include <reg51.h>
sbit TRIG = P2^1; //将这里调整下你就可以正常使用这个模块了
sbit ECHO = P2^0;
void Sonar_Init(void); //声呐传感器初始化
void Sonar_Trig(void);
void Sonar_Echo(void);
void Sonar_Precision(float,float); //利用温度值与晶振频率运算出声音传播速度从而修正距离
float Sonar_Distance(void); //返回与目标的距离,这里可以较为精准测量 0.5cm ~ 5m 内的距离
# endif
Sonar.c
# include "Sonar.h"
float WEIGHT = 0.017; //权值.这里不需要改动.除非你看懂原理
void Sonar_Sleep10us(uint times)
{
unsigned char a,b;
while(times--){
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
}
void Sonar_OverFlow() interrupt 1 //INT0:0 T0:1 INT1:2 T1:3
{
TH0 = 0;
TL0 = 0;
}
void Sonar_Precision(float Temperature,float OCXO) //利用温度与晶振修正距离
{
float speed=0,Time=12/OCXO; //机器周期=晶振周期*12=(1/晶振频率)*12 单位是us
speed = (331.4 + 0.607 * Temperature); //速度与温度的关系
//距离 = (速度 * 时间) / 2 下面的 Time 是单位!不是时间!!!
//权值 = (speed*100 * (时间*Time)/1000000) / 2 统一单位为 cm/s
WEIGHT = (speed*Time)/20000;
}
void Sonar_Init(void)
{
TMOD = 0x01; //模式1的计时间
TH0 = 0;
TL0 = 0; //计时器
ET0 = 1; //响应中断
TR0 = 0; //运行控制位
EA = 1; //总中断
}
void Sonar_Trig(void)
{
TRIG = 1;
Sonar_Sleep10us(1); //10us
TRIG = 0;
}
void Sonar_Echo(void)
{
while(!ECHO); //ECHO到高电平 开始计时
TR0 = 1; //开始计时
while(ECHO); //ECHO到低电平 结束计时
TR0 = 0; //关闭计时
}
float Sonar_Distance(void)
{
int k;
uint Time = 0;
float Distance=0;
Sonar_Trig(); // 发出探测信号
Sonar_Echo(); // 检测回声时长
Time |= (TH0 << 8);
Time |= TL0; //获取时间
TH0 = 0; //清空计时器
TL0 = 0;
Sonar_Sleep10us(850); //延时85ms,这个值可以超声波垂直地面.微调直到距离为 0
Distance = Time * WEIGHT; //运算结果的单位是 cm
return Distance<500?Distance:0; //距离 = 高电平时间 * 声速(340M/S) / 2
}