#超声波原理#
①超声波测距原理:声波反射原理
声波分类:
超声波测距原理
超声波频率越高,波长越短,反身性越强,衍射性越弱
②超声波模块原理
发射原理
跳线帽
接收原理
问题:
1.超声波发射模块需要一直发射吗?
不需要,否则很难确定接收的回波对应哪一个发射波
所以我们一般发射较短时间
2.发射持续时间多久?
一般是5~8个周期,这个就大致取一个即可
若为5个周期,t=12us*10
程序设计:
一般用定时器0
①产生一个24us周期,占空比50%方波,持续时间五个周期
(高/低电平12us)
②发送完毕后开始计时,当检测到P11引脚为低电平时停止计时(已接收到回波)
③开始计算距离
④若在测量范围内无障碍物,则较长的时间未收到回波,则停止计时
将距离设为255cm,一般测距范围是2m
s=0.017cm/us *t
超声波wave.c代码编写
#include "main.h"
sbit TX=P1^0;//发射
sbit RX=P1^1;//接收
uchar distance;
//定时器2不可以。使用定时器0
void Timer2_Init(void) //12微秒@12.000MHz
{
T2MOD = 0; //初始化模式寄存器
T2CON = 0; //初始化控制寄存器
TL2 = 0xF4; //设置定时初始值
TH2 = 0xFF; //设置定时初始值
RCAP2L = 0xF4; //设置定时重载值
RCAP2H = 0xFF; //设置定时重载值
TR2 = 0; //先不 计时 定时器2开始计时
ET2 = 1; //使能定时器2中断
TF2=0;//清除TF标志
}
uchar distance_read()
{
uchar distance;
uchar num=10;//5个周期
//不发射超声波,并设定初始时间
TX=0;
TL2 = 0xF4; //设置定时初始值
TH2 = 0xFF; //设置定时初始值
//开始计时
TR2=1;
while(num--)
{
while(!TF2);//结束发射超声波,TF2=1
TX= ~TX;
TF2=0;
}
//发射五个超声波完成,停止计时,并且初始化定时初始值,开始计时,接收到的时间
TR2=0;
TL2 = 0x00; //设置定时初始值
TH2 = 0x00; //设置定时初始值
TR2=1;
while(RX &&!TF2);//等待收到的脉冲(RX为低电平)和长时间未接受到脉冲
//判断溢出现象
if(TF2)
{
TF2=0;
distance=255;
}
else
{
distance=((TH2<<8)|TL2)*0.017;//340/2=170m/s
}
return distance;
}
void display()
{
distance=distance_read();
}
void main()
{
Timer2_Init();//12微秒@12.000MHz
EA=1;
while(1)
{
display();
}
}
wave.h代码编写
#ifndef __MAIN_H_
#define __MAIN_H_
#include "intrins.h"
#include <STC15F2K60S2.H>
#define uchar unsigned char
#define uint unsigned int
uchar distance_read();
void Timer2_Init(void); //12微秒@12.000MHz
#endif
根据原理进行代码编写
最好知道原理代码编写,便于熟悉各个引脚的作用
根据定时器12us计时→发射器开始发射→5个周期→发射器停止发射进行代码编写
wave.c(方便但误差较大版)
#include "wave.h"
sbit TX=P1^0;
sbit RX=P1^1;
//5个周期12us
void Delay12us(void) //@12.000MHz
{
unsigned char data i;
_nop_();
_nop_();
i = 33;
while (--i);
}
void wave()
{
uchar i;
for(i=0;i<5;i++)
{
TX=1;
Delay12us();
TX=0;
Delay12us();
}
}
uchar read_distance()
{
uchar distance;
CMOD=0;
CH=CL=0;
wave();
CR=1;
while(RX &&!CF);
CR=0;
if(CF)
{
CF=0;
distance=255;
}
else
{
distance=((CH<<8)|CL)*0.017;
}
return distance;
}