HC_SR04介绍

特点

HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能,测距精度可达高到 3mm ;模块包括超声波发射器、接收器与控制电路。

基本工作原理

  • 采用IO口 TRIG触发测距,给最少 10us 的高电平信呈。
  • 模块自动发送 8个40khz的方波,自动检测是否有信号返回;
  • 有信号返回,通过IO口 ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。 测试距离=

(高电平时间×声速(340M/S))2\frac{(\text{高电平时间}\times\text{声速}(340M/S))}{2}

  • 建议测量周期为 60ms以上,以防止发射信号对回响信号的影响(比如你发射信号发出去还没回来你就把距离测出来了,是不是很离谱)
  • 测距时, 被测物体面积不少于0.5平方米 且平面尽量平整,否则影响测量结果

软件编写

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
}