第十二章:超声波测距

控制原理:

第十二章:超声波测距_第1张图片

时序图

第十二章:超声波测距_第2张图片

详细解释:

 

第十二章:超声波测距_第3张图片

第十二章:超声波测距_第4张图片    引脚图

定义引脚:
 

/*

*/
sbit gTrig = P2^0; 					// 脉冲产生引脚
sbit gEcho = P2^1; 					// 回波产生引脚

一:开启触发信号

void StartModule(void) 		 				// 启动模块一次
{
	gTrig = 1;			 					// 启动一次模块

	delay20us();			   				// 数据手册要求至少10us延时

	gTrig = 0;
}

二:监测是否有信号返回(同时打开中断),原理:当回波信号发生到结束,则触发定时器中断,定时器中的值开始计数,通过这种方式我们可以得到接受到的信号时间。然后再去处理得到距离。

void HcSr04Test(void)
{
	TMOD = 0x01;		   					// 设T0为方式1,GATE=1;
	TH0 = 0;
	TL0 = 0;          
	ET0 = 1;             					// 允许T0中断
	EA = 1;			   						// 开启总中断			
	
	while(1)
	{
		StartModule();
	    while (!gEcho);						// 当RX为零时等待
	    TR0 = 1;			    			// 开启计数
	    while (gEcho);						// 当RX为1计数并等待
		TR0 = 0;							// 关闭计数
 		MesureDistance();					// 计算距离并显示
		delay100ms();						// 以100ms为测距周期
	}
}


void Timer0Isr(void) interrupt 1 		 	// T0中断用来计数器溢出,超过测距范围
{
	gFlag = 1;							 	// 中断溢出标志标记
}

三:距离处理

static void MesureDistance(void)
{
	u16 time = 0;							// 定时器计时结果值
	unsigned long dCm = 0;	 				// 计算结果以cm为单位的距离值


	time = TH0 * 256 + TL0;
	TH0 = 0;
	TL0 = 0;
	
	dCm = (time * 1.7) / 100;     			// 按此公式计算出以CM为单位的距离

	if ((dCm >= 700) || (gFlag == 1)) 		// 超出测量范围显示“-.--M”
	{	 
		gFlag = 0;
	  	Lcd1602ShowStr(0, 0, "-.--M");
	}
	else
	{
	  gDisBuf[0] = '0' + dCm % 1000 / 100;	// 正常显示格式类似于:1.26M

	  gDisBuf[2] = '0' + dCm % 1000 % 100 / 10;
	  gDisBuf[3] = '0' + dCm % 1000 % 10 % 10;

	  Lcd1602ShowStr(0, 0, gDisBuf);
	}
}

解释:将得到的计数值,求出time,在将声音速度*声音时间=距离,在去判断该值有没有大于范围距离,如果大于范围则显示

-.--M

负责正常显示:

要去申请一个存放的buf

u8 gFlag = 0;						// 超限标志
u8 gDisBuf[] = "2.85M";				// 显示缓冲区

 

你可能感兴趣的:(第十二章:超声波测距)