超声波模块
型号:HC-SR04
产品介绍:
超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度, 计算出模块到前方障碍物的距离
手上的是老版本
应用注意事项:
1:此模块不宜带电连接,如果要带电连接,则先让模块的 GND 端先连接。否则会影响模块工作。
2:测距时,被测物体的面积不少于 0.5 平方米且要尽量平整。否则会影响测试结果。
接口定义:
VCC:5V电源
GND:接地
Trig:控制端
Echo:接收端
工作原理:
1、采用IO触发测距,给至少10us的高电平信号,实际40-50uS效果好
2、模块自动发送8个40KHz的方波
3、有信号返回,通过lO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间
4、测试距离=(高电平时间*声速(340M/S))/2
本产品使用方法:控制口发一个 10US 以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此不断的周期测,就可以达到你移动测量的值了。
接线参考:
模块除了两个电源引脚外,还有TRIG,ECHO引脚,这两个引脚分别接我们开发板的P1.5和 P1.6端口
代码时序:
- 怎么让它发送波 Trig :给Trig端口至少10us的高电平
- 怎么知道它开始发了:Echo信号由低电平跳转到高电平,表示开始发送波
- 怎么知道接收了返回波:Echo由高电平跳转回低电平,表示波回来了
- 怎么算时间: Echo引脚维持高电平的时间!波发出去的那一下,开始启动定时器波回来的那一下,我们开始停止定时器,计算出中间经过多少时间
- 怎么算距离:距离 = 速度 (340m/s)* 时间/2,时间单位是us
#include <REGX52.H>
#include "Timer0.h" //定时器TH0和TL0初始化为0,TR0为0,后面根据时序开启TR0
sbit LED1 = P3^7;
sbit LED2 = P3^6;
sbit Trig = P1^5;
sbit Echo = P1^6;
/**
* @brief延时10us
* @param无
* @retval无
*/
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
/**
* @brief 触发信号
* @param无
* @retval无
*/
void Trig_Start()
{
Trig = 0;
Trig = 1;
Delay10us();
Trig = 0;
}
void main()
{
double time; //时间
double distance; //距离
Timer0Init();
while(1)
{
Trig_Start(); //发送触发信号
Echo = 0;
while(Echo == 0); //Echo信号,由低电平跳转到高电平,表示开始发送波
TR0 = 1; //开启定时器
while(Echo == 1); //Echo信号,由高电平跳转回低电平,表示波回来了
TR0 = 0; //停止定时器
time = (TH0*256+TL0)*1.085; //计算出Echo口高电平的时间,单位是us
//distance = 340m/s*time/2,声音的传播速率是340m/s,要统一单位
//340m/s = 34000cm/s = 34cm/ms = 0.034cm/us , 0.034cm/us/2 =0.017cm/us;
distance = time*0.017;
if(distance < 20) //距离小于20cm
{
LED1 = 0;
LED2 = 1;
}
else
{
LED1 = 1;
LED2 = 0;
}
TH0 = 0; //重新置0,为下一次测距作准备
TL0 = 0;
}
}
注意:
11.0592MHz的晶振频率的机器周期是1.085us,计算方法:12 * 1/110592Hz = 1.085us
12MHz的晶振频率的机器周期是1us