0°

(十三)51进阶:超声波模块HC-SR04与8051连接教程

介绍

(十三)51进阶:超声波模块HC-SR04与8051连接教程

超声波HC-SR04模块

超声波模块HC-SR04的工作原理是SONAR和RADAR系统:

  • HC-SR04模块具有超声波发射器,接收器和控制电路。
  • 该模块只有4个引脚,Vcc,Gnd,Trig和Echo。
  • 当给Trig引脚施加10μsec或更多的脉冲时,产生8个40kHz的脉冲。此后,模块中的控制电路使Echo引脚变为高电平。
  • 回声引脚保持高电平,直到它发回传输脉冲的回波信号。
  • 回声引脚保持高电平的时间,即Echo引脚的宽度,给出了产生的超声波传播到物体并返回所需的时间。
  • 利用这个时间和空气中的声速,我们可以使用一个简单的距离公式,使用速度和时间来找到物体的距离。

为了测量时间,我们可以使用8051的内置定时器。

电路连接原理图

(十三)51进阶:超声波模块HC-SR04与8051连接教程

HC-SR04超声波模块与8051连接

在这里,我们设计一个应用程序,通过将超声波模块HC-SR04与8051(此处使用AT89S52)连接,我们将找到与物体的距离,并在16×2 LCD上显示距离。

编程步骤

  1. 8051微控制器需要向HC-SR04 Trig Pin发送至少10 us触发脉冲。
  2. 在获得触发脉冲后,HC-SR04自动发送8个40 kHz声波,并等待Echo引脚的上升沿输出。
  3. 当上升沿捕捉发生在连接到8051输入的Echo引脚时,启动8051的定时器并再次等待Echo引脚的下降沿。
  4. 一旦在Echo引脚捕获下降沿,微控制器就会读取定时器的计数。此时间计数用于计算到对象的距离。

计算(以cm为单位的距离):

Distance = Sound Velocity*Time/2

声速= 34300(厘米/秒)

这里,AT89S52(8051)的振荡器频率为11.0592 MHz,8051的定时器频率为921.6 kHz。因此,执行1条指令所需的时间是1.085 us。

因此,计时器在1.085us时间过后增加。

例如

 = (34300 * TimerCount * 1.085 * 10 ^-6)/2

程序

/*
	通过将Ultrasonic HC-SR04模块与8051(AT89S52)连接来查找物体的距离
	http:s//www.qutaojiao.com
*/
#include<reg52.h>
#include <stdio.h>
#include <LCD_8_bit.h>
#include <math.h>

#define sound_velocity 34300  	/* sound velocity in cm per second */

#define period_in_us pow(10,-6)
#define Clock_period 1.085*period_in_us		/* period for clock cycle of 8051*/

sbit Trigger_pin=P2^6;        	/* Trigger pin */
sbit Echo_pin=P2^7;		/* Echo pin */

void Delay_us()
{
	TL0=0xF5;
	TH0=0xFF;
	TR0=1;
	while (TF0==0);
	TR0=0;
	TF0=0;
}

void init_timer(){
	TMOD=0x01;										/*initialize Timer*/
	TF0=0;
	TR0 = 0;
}

void send_trigger_pulse(){
	Trigger_pin= 1;           	/* pull trigger pin HIGH */
	Delay_us();               	/* provide 10uS Delay*/
	Trigger_pin = 0;          	/* pull trigger pin LOW*/
}

void main()
{
	float distance_measurement, value;
	unsigned char distance_in_cm[10];
	LCD_Init();			/* Initialize 16x2 LCD */	
	LCD_String_xy(1,1,"Distance:");	
	init_timer();			/* Initialize Timer*/
	
	while(1)
	{		
		send_trigger_pulse();			/* send trigger pulse of 10us */
		while(!Echo_pin);           		/* Waiting for Echo */
		TR0 = 1;                    		/* Timer Starts */
    		while(Echo_pin && !TF0);    		/* Waiting for Echo goes LOW */
    		TR0 = 0;                    		/* Stop the timer */
	  
		/* calculate distance using timer */
		value = Clock_period * sound_velocity; 
		distance_measurement = (TL0|(TH0<<8));	/* read timer register for time count */
		distance_measurement = (distance_measurement*value)/2.0;  /* find distance(in cm) */
	
		sprintf(distance_in_cm, "%.2f", distance_measurement);
		LCD_String_xy(2,1,distance_in_cm);	/* show distance on 16x2 LCD */
		LCD_String("  cm  ");		
					
		delay(100);
}
}

本教程完整工程下载:

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论