目录
介绍
超声波HC-SR04模块
超声波模块HC-SR04的工作原理是SONAR和RADAR系统:
- HC-SR04模块具有超声波发射器,接收器和控制电路。
- 该模块只有4个引脚,Vcc,Gnd,Trig和Echo。
- 当给Trig引脚施加10μsec或更多的脉冲时,产生8个40kHz的脉冲。此后,模块中的控制电路使Echo引脚变为高电平。
- 回声引脚保持高电平,直到它发回传输脉冲的回波信号。
- 回声引脚保持高电平的时间,即Echo引脚的宽度,给出了产生的超声波传播到物体并返回所需的时间。
- 利用这个时间和空气中的声速,我们可以使用一个简单的距离公式,使用速度和时间来找到物体的距离。
为了测量时间,我们可以使用8051的内置定时器。
电路连接原理图
HC-SR04超声波模块与8051连接
例
在这里,我们设计一个应用程序,通过将超声波模块HC-SR04与8051(此处使用AT89S52)连接,我们将找到与物体的距离,并在16×2 LCD上显示距离。
编程步骤
- 8051微控制器需要向HC-SR04 Trig Pin发送至少10 us触发脉冲。
- 在获得触发脉冲后,HC-SR04自动发送8个40 kHz声波,并等待Echo引脚的上升沿输出。
- 当上升沿捕捉发生在连接到8051输入的Echo引脚时,启动8051的定时器并再次等待Echo引脚的下降沿。
- 一旦在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);
}
}
本教程完整工程下载:
请问有电路原理图的下载吗?
没有哦 只有连接图
?