前期准备:
超声波模块
简介:
超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。
硬件
电路板上有4个引脚:
VCC(正级)
Trig(触发)
Echo(回应)
GND(接地-负极)
主要参数:
工作电压与电流:5V、15mA
感测距离:2~400cm
感测角度:不大于15°
被测物体的面积:不要小于50cm²,且尽量平整
具备温度补偿电路
在超声波模块的触发脚位输入10微秒以上的高电位,即可发射超声波,发射超声波之后,与接收到传回的超声波之前,“响应”脚位呈现高电位。因此,程序可以从“响应”脚位的高位脉冲持续时间,换算出被测物的距离。
超声波模块工作原理
超声波时序图
T(发波)
R(接受)
先给 Trig 引脚发送一个 10uS(微秒)的 TTL(高电平)
T就可以发波了
发出的是循环 8 个 40KHz 的脉冲
波发出去后,Echo 引脚就会一直维持高电平,也就是说波在空中传播的过程是一直维持高电平
那么就可以根据Echo 引脚的高电平维持时间,超声波在空气中的物理性质的传输速度,就可以算出障碍物跟发波点的距离
即超声波能在空气中1秒能跑多远,那么就可以通过Echo 引脚的高电平维持时间,换算距离了
代码测试(D5D6灯亮灭):
#include "reg52.h"
sbit D5 = P3^7;
sbit D6 = P3^6;
sbit Trig = P1^5;
sbit Echo = P1^6;
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
//配置定时器1
void Timer1Init(void)
{
TMOD &= 0xF0;
TMOD |= 0x10;
TH1 = 0;
TL1 = 0;
}
void startHc()
{
Trig = 0;
Trig = 1;
Delay10us();
Trig = 0;
}
double get_distance()
{
double time;
//定时器数据清零,以便下一次测距
TH1 = 0;
TL1 = 0;
//1.Trig,给Trig端口至少10us的高电平
startHc();
//2.echo由低电平跳转到高电平,表示开始发送波
while(Echo == 0);
//波发出去的那一下,开启定时器
TR1 = 1;
//3.由高电平跳转回店店铺,表示波回来了
while(Echo == 1);
//波回来的那一下,我们开始停止定时器
TR1 = 0;
//4.计算出中间经过多少时间
time=(TH1 *256 +TL1)*1.085;//us为单位
//5.距离=速度(340m/s)*时间/2
return (time*0.017);
}
void openStatusLight()
{
D5 = 0;
D6 = 1;
}
void closeStatusLight()
{
D5 = 1;
D6 = 0;
}
void main()
{
double dis;
Timer1Init();
while(1){
dis = get_distance();
if(dis < 10)