超声波工作原理:
HC-SR04 介绍
HC-SR04 模块可以测量 3cm - 4m 的距离,精确度可以达到 3mm。这个模块包括 超声波发射器、超声波接收器和控制电路三部分。有 4 个引脚。
1. 单片机向 Trig 脚发送一个持续 10us 的脉冲信号。
2. HC-SR04 接收到单片机发送的脉冲信号,开始发送超声波,并把 Echo置为高电平。然后准备接收返回的超声波。
3. 当 HC-SR04 接收到返回的超声波时,把 Echo 置为低电平。从上述过程可以看出, Echo 高电平持续的时间就是超声波从发射到返回所经过的时间间隔。
程序:
#include<reg52.h>
#include<stdio.h>
sbit Echo=P1^0;
sbit Trig=P1^1;
sbit in=P0^0;
void initUart_115200()
{
SCON=0x50; //0101 0000
TH2=0xFF;
TL2=0xFD;
RCAP2H=0xFF;
RCAP2L=0xFD;
T2CON=0x34; //波特率115200
}
void init_timer()
{
TMOD=0x01;
TH0=0xff; //设置初始值为10us
TL0=0xf6;
}
void delay(int n){
int i,j;
for(i=0;i<100;i++){
for(j=0;j<n;j++);
}
}
void sendbyte(char date){
SBUF=date;
while(TI!=1);
TI=0;
}
void sendString(char* pstr){
while(*pstr!='\0'){
sendbyte(*pstr);
pstr++;
}
delay(200);
}
void delay10us()
{
TMOD|=0x1;
TH0=0xFF;
TL0=0xF6;
TR0=1;
while(!TF0){}
TF0=0;
}
void init_CSB()
{
Trig=0;
Trig=1;
delay10us();
Trig=0;
}
void starttime()
{
TH0=0;
TL0=0;
TR0=1;
}
void endtime()
{
TR0=0;
}
float getbotime()
{
unsigned int time=0;
time=TH0<<8|TL0;
return time;
}
float getdis( unsigned int time)
{
float dis;
dis=(float)0.017*time;
return dis;
}
int main()
{
unsigned int time=0;
float dis;
char buf[24]={'\0'};
initUart_115200();
sendbyte('a');
init_timer();
while(1)
{
init_CSB();
while(Echo!=1);
starttime();
while(Echo!=0);
endtime();
time=getbotime();
dis=getdis(time);
sprintf(buf,"dis=%f cm\r\n",dis);
sendString(buf);
delay(200);
}
return 0;
}
运行结果: