超声波模块工作原理分析及程序
2017-10-12 20:15
246 查看
模块发出一定频率的超声波,超声波遇到物体发生反射,返回到发射处可以被模块检测到
通过x=v*t,可得distance=x/2
模块工作原理:
以常见的HY-SRF05模块为例介绍,其它型号的工作原理与此模块大相径庭。
5个引脚分别为vcc、trig、echo、out、gnd,5v供电,采用io引脚trig触发测距,给至少10us的高电平,即可开启测距功能。如果自动检测到有信号返回时,通过io引脚echo输出一个高电平。
由上面的工作原理结合单片机的中断定时器可以确定如下的工作方案,我以51单片机为例进行说明:
开始给trig一个大于10us的脉冲,使模块开始工作,同时开启定时器开始计时,将外部中断接到echo引脚上,当模块检测到回波时echo被置高电平,这时外部中断被触发,进入中断程序,因此我们可以在中断程序中将时间读出来,有了时间就可以根据distance=v*t/2,计算出距离,距离值就可以用于进一步的工作
以51为控制,数码管显示距离的代码:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
int time,flag;
uchar timeL,timeH;
uint distance;
sbittrig=P2^0;
sbit echo=P3^2;
uchar codeduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f}; //数码管段选
uchar code wei[]={0xfe,0xfd,0xfb,0xf7};//数码管位选
uchar shuju[4];
//延时函数
void delay(uint a)
{
uintb;
while(a--)
for(b=113;b>0;b--);
}
//延时20微秒
void delay20us()
{
uchar c;
for(c=0;c<100;c++);
}
void shujuxuan ()//确定送的数据
{
shuju[3]=distance/1000;
shuju[2]=distance/100%10;
shuju[1]=distance/10%10;
shuju[0]=distance%10;
}
void xianshi()//显示函数
{
uchar i;
for(i=0;i<4;i++)
{
P0=wei[i];//送位码
P1=duan[shuju[i]];//送段码
delay(4);
//j=10;
//while(j--);
}
}
void main()
{
//uint distance;
trig=0;//拉低脉冲输入引脚
EA=1;//打开总中断
TMOD=0x10;//定时器1,16位工作方式
while(1)
{
EA=0;//关总中断
trig=1;//超声波输入端
delay20us();//延时20微秒
trig=0;//产生一个20微秒的脉冲
while(echo==0);//等待echo回波引脚变高电平
flag=0;//清测量成功标志
EA=1;
EX0=1;//打开外部中断0
TH1=0;
TL1=0;//定时器清零
TF1=0;//计数器溢出标志清零
TR1=1;//启动定时器1
delay(20);//等待测量的结果
TR1=0;//关闭定时器1
EX0=0;//关闭外部中断0
if(flag==1)
{
time=timeH*256+timeL;
distance=time*0.172;//毫米
}
if(flag==0)
{
distance=0;//没有回波则清零
}
shujuxuan();
xianshi();
}
}
//外部中断0,用做判断回波电平
void zhongduan() interrupt 0
{
timeH=TH1;
timeL=TL1;//取出定时器1的值
flag=1;//置位测量成功的标志
EX0=0;//关闭外部中断
}
//定时器1中断,用作超声波测距计时
void timer1() interrupt 3
{
TH1=0;
TL1=0;
}
通过x=v*t,可得distance=x/2
模块工作原理:
以常见的HY-SRF05模块为例介绍,其它型号的工作原理与此模块大相径庭。
5个引脚分别为vcc、trig、echo、out、gnd,5v供电,采用io引脚trig触发测距,给至少10us的高电平,即可开启测距功能。如果自动检测到有信号返回时,通过io引脚echo输出一个高电平。
由上面的工作原理结合单片机的中断定时器可以确定如下的工作方案,我以51单片机为例进行说明:
开始给trig一个大于10us的脉冲,使模块开始工作,同时开启定时器开始计时,将外部中断接到echo引脚上,当模块检测到回波时echo被置高电平,这时外部中断被触发,进入中断程序,因此我们可以在中断程序中将时间读出来,有了时间就可以根据distance=v*t/2,计算出距离,距离值就可以用于进一步的工作
以51为控制,数码管显示距离的代码:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
int time,flag;
uchar timeL,timeH;
uint distance;
sbittrig=P2^0;
sbit echo=P3^2;
uchar codeduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f}; //数码管段选
uchar code wei[]={0xfe,0xfd,0xfb,0xf7};//数码管位选
uchar shuju[4];
//延时函数
void delay(uint a)
{
uintb;
while(a--)
for(b=113;b>0;b--);
}
//延时20微秒
void delay20us()
{
uchar c;
for(c=0;c<100;c++);
}
void shujuxuan ()//确定送的数据
{
shuju[3]=distance/1000;
shuju[2]=distance/100%10;
shuju[1]=distance/10%10;
shuju[0]=distance%10;
}
void xianshi()//显示函数
{
uchar i;
for(i=0;i<4;i++)
{
P0=wei[i];//送位码
P1=duan[shuju[i]];//送段码
delay(4);
//j=10;
//while(j--);
}
}
void main()
{
//uint distance;
trig=0;//拉低脉冲输入引脚
EA=1;//打开总中断
TMOD=0x10;//定时器1,16位工作方式
while(1)
{
EA=0;//关总中断
trig=1;//超声波输入端
delay20us();//延时20微秒
trig=0;//产生一个20微秒的脉冲
while(echo==0);//等待echo回波引脚变高电平
flag=0;//清测量成功标志
EA=1;
EX0=1;//打开外部中断0
TH1=0;
TL1=0;//定时器清零
TF1=0;//计数器溢出标志清零
TR1=1;//启动定时器1
delay(20);//等待测量的结果
TR1=0;//关闭定时器1
EX0=0;//关闭外部中断0
if(flag==1)
{
time=timeH*256+timeL;
distance=time*0.172;//毫米
}
if(flag==0)
{
distance=0;//没有回波则清零
}
shujuxuan();
xianshi();
}
}
//外部中断0,用做判断回波电平
void zhongduan() interrupt 0
{
timeH=TH1;
timeL=TL1;//取出定时器1的值
flag=1;//置位测量成功的标志
EX0=0;//关闭外部中断
}
//定时器1中断,用作超声波测距计时
void timer1() interrupt 3
{
TH1=0;
TL1=0;
}
相关文章推荐
- ZooKeeper 核心模块工作原理分析
- Struts2源码粗略分析四:理解xwork工作原理
- Glusterfs之rpc模块源码分析(下)之RDMA over TCP的协议栈工作过程浅析
- linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核代码
- 12864点阵液晶显示模块的原理和实例程序(HJ12864M-1)
- 第1课 GUI程序原理分析
- 使用ToolRunner运行Hadoop程序基本原理分析
- 设计有穷自动机DFA实现C++简单程序的词法分析、扫描(编译原理实验) 推荐
- 一个小语言的词法分析程序原理及其实现(2)
- 编码器工作原理,光电编码器的工作原理分析
- 汇编一个简单的C程序,分析代码理解计算机是怎么工作的
- Android程序各个模块的简单分析
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- (一)GUI程序原理分析
- 【构建Android缓存模块】(一)吐槽与原理分析
- SpringMVC框架原理学习-各模块源码分析
- FastDFS-Nginx扩展模块源码分析 -- mod_fastdfs原理解析
- Web程序工作原理详解
- 分析一个简单C程序的汇编代码,理解计算机是如何工作的
- Python程序性能分析模块----------cProfile