HC-SR04
超声波测距模块是用来测量距离的一种产品,通过发送和接受超声波,利用时间差和声音传播速度,计算出到前方障碍物的距离。HC-SR04的测距范围是2cm--400cm,精度可达到3mm。
1. 怎么让他发送波?给Trig端口一个至少10us的高电平,即可使该模块开始循环发送8个40Khz的脉冲方波。(2023/6/25:终于发现了问题,此处应该是10ms而不是10us....!!!!!!!!!!)
2. 怎么知道开始发了?Echo信号由低电平跳转到高电平,代表开始发送。
3. 怎么知道接收了返回波?Echo信号由高电平跳转回低电平,代表波已经回来。
4. 怎么算时间?波发出去的那一瞬,开启定时器,波回来的那一瞬,停止定时器,计算经过了多少时间,即计算Echo信号高电平持续的时间。
5. 怎么算距离?距离 = 速度(340m/s) * 时间 / 2。
编写代码实现距离小于10cm就切换LED亮灯状态:
#include "reg52.h"
//距离小于10cm,LED1亮,LED2灭,反之相反
sbit LED1 = P3^7; //D5
sbit LED2 = P3^6; //D6
sbit Trig = P1^3;
sbit Echo = P1^4;
void Timer0Init()
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TH0 = 0;
TL0 = 0;
TF0 = 0; //清除TF0标志
TR0 = 0; //先不计时
}
void Delay5ms() //@11.0592MHz
{
unsigned char i, j;
i = 9;
j = 244;
do
{
while (--j);
} while (--i);
}
void startHC() //先要给Trig一个至少10us的高电平方波
{
Trig = 0;
Delay5ms();
Trig = 1;
Delay5ms();
Delay5ms();
Trig = 0;
}
void main()
{
double time; //double的精度是float的两倍
double dist;
Timer0Init();
Echo = 0;
Trig = 0;
while(1){
startHC();
while(Echo == 0){//程序会卡在这里直到Echo变高的一瞬间
//LED1 = 0; //蓝亮
}
TR0 = 1; //定时器0开始计时
while(Echo == 1){ //程序会卡在这里直到Echo变低的一瞬间
//LED2 = 0; //黄亮
}
TR0 = 0;
//十进制2左移1位,变成20,相当于乘以10
//二进制1左移1位,变成10,相当于乘以2
//所以16进制左移1位需要乘以16,通过左移2位(16*16=256)之后将TH0和TL0进行拼接,就可以得到定时器的计数值
time = (TH0 * 256 + TL0)*1.085; //us为单位
dist = 0.034 * time * 0.5; //340m/s换算到cm为34000cm/s;换算到us为34000cm/1000000us = 0.034cm/us
if(dist < 10){ //70-75
LED1 = 0; //D5亮蓝
LED2 = 1;
}else{
LED1 = 1;
LED2 = 0; //D6亮黄
}
TH0 = 0;
TL0 = 0; //重新给初值!!!!!
}
}
实现效果: