#超声波原理#
①超声波测距原理:声波反射原理
声波分类:
超声波测距原理
超声波频率越高,波长越短,反身性越强,衍射性越弱
②超声波模块原理
发射原理
跳线帽
接收原理
问题:
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=1TX= ~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.000MHzEA=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;
}