使用HC-SR04实现超声波测距

HC-SR04

超声波测距模块是用来测量距离的一种产品,通过发送和接受超声波,利用时间差和声音传播速度,计算出到前方障碍物的距离。HC-SR04的测距范围是2cm--400cm,精度可达到3mm。

使用HC-SR04实现超声波测距_第1张图片

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; //重新给初值!!!!!   
	}
}

实现效果:

 

你可能感兴趣的:(c语言,单片机)