超声波测距小结一
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
超声波测距小结一
经过几天的研究,今晚终于将超声波测距的实验大致上完成了,做一下小结,便于接下来的调试。
首先,我使用的是DYP—ME007超声波模块,这个模块的介绍如下:
正如介绍中说的注意那样,在带电接线的时候,千万别把接地端悬空,这样会损坏模块,因为昨晚和今天早上我用这个模块的时候,都能用示波器测出矩形波,只是数据无法显示,于是我就动了动接线,在无意识的情况下,将模块的接地端悬空,然后烧同样的程序,示波器都无法显示矩形波,无奈……七搞八搞还是不行,最后还是半途中出去办点事花了一个多小时后,回头又搞了一下才给搞好……
float dist;//定义距离变量
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code LED_W[8] = {0,1,2,3,4,5,6,7};
/*一毫秒延时函数*/
delay_ms(uint z)
TX = 0;
}
main()
{
while(1)
{
//P0=0xff;
//delay_ms(200);
TX_10us();
while(RX==0);
//P0=0x00;
delay_ms(60);
}
}
在接线正确的情况下,将示波器的接到模块的Echo端,此时示波器上会显示一个矩形波,当你将手放在模块的发射端远近变化时,示波器上的矩形波的宽度会发生变化,此时可以用光标移动的方式,测量出矩形波的宽度,然后得到△x=**ms,此时可以计算出距离为△x/58单位为cm,这样就可以得到所需测量的距离。
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<148;j++);
}
/*一微秒延时函数*/
void delay_us(uint t)
{
while(--t);
}
/*发送超声波函数*/
void TX_10us()
{
TX = 0;
delay_ms(1);
TX = 1;
delay_us(10);
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<148;j++);
}
/*一微秒延时函数*/
void delay_us(uint t)
{
while(--t);
}
/*定时器T0初始化函数*/
void Time0_init()
{
TMOD = 0x01;//定时器0选用方式1
TH0 = 0x28;//初值的计算设置,60MS
{
EA=1;//打开总中断
Time0_init();//定时器初始化函数,
INT_init();
EX0=1;//打开外部中断0中断允许位
delay_ms(60);
//break;
display();
}
}
}
这个程序主要思路是,首先由P1^0发出触发信号,触发超声波模块发射一个超声波,然后等待接收回波,当接收到回波后Echo端置1,此时启动定时器开始计时,同时将外部中断0初始化,使外部中断0采用下降沿触发,当Echo端由1变为0时,进入中断,计算距离变显示到数码管,不过在数码管显示的过程中还有一定问题,各个管子工作的时间不一样,导致有些管子亮很多,有些很暗,显示这块程序还待完善……
float Tcy = (1/11.0592)*12;//计算机器周期,单位us,单片机晶振11.0592MHz
uint TH_temp,TL_temp;//定义外部中断触发时,定时器中的数值
//uint bfw,sfw,gw,sw;
uint gw,sw,bw;//定义个位,十位,百位变量
uint Tim;//返回时间
//sw = ((uint)dist) / 1000;//求十位数字
gw = ((uint)dist) % 10;//求个位数字
sw = ((uint)dist) % 100 / 10;//求十位数字
bw = ((uint)dist) / 100;//求百位数字
}
/*外部中断INT0处理函数*/
void Outside_Int(void) interrupt 0
#define uchar unsigned char
#define uint unsigned int
/*定义一些控制端口*/
sbit TX = P1^0;//定义触发超声波传感器发送超声波信号
sbit RX = P3^2;//定义超声波接收反射信号端子,触发中断INT0
/*一毫秒延时函数*/
delay_ms(uint z)
dist = Tim / 58;//得出dist单位是:cm?
}
void pickup_bit()
{
//bfw = ((uint)dist) % 10;//求百分位数字
//sfw = ((uint)dist) % 100 / 10;//求十分位数字
//gw = ((uint)dist) % 1000 / 10;//求个位数字
{
count++;
TH0 = 0xFF;//初值的计算设置,0.1MS
TL0 = 0xA3;
}*/
void count_distance()
{
TH_temp = TH0;
TL_temp = TL0;
TH0 = 0x28;//初值的计算设置,60MS
TL0 = 0x00;
Tim = ((TH_temp*256+TL_temp)-(0x28*256+0x00)) * Tcy;//计算返回时间,单位:us
然后就是关于理解模块时序的问题,首先给模块的Trig端大概10us的高电平后,模块内部会产生8个40KMz的脉冲,此时只是发射一个超声波,所以不用当心第二次发射后,接收到的会是第一次的产生的超声波。发出超声波后就是关于超声波接收的问题,我写了一个最简单的程序,主要是利用示波器测试模块是否可用
#include<reg52.h>
delay_ms(10);
P0 = table[bw];//Tim的百位数
//P0=P0 | 0x80;
P2 = LED_W[1];//点亮第三位数码管
delay_ms(10);
//P0 = table[sw];//Tim的十位数
//P2 = LED_W[0];//点亮第三位数码管
//delay_ms(3);
}
/*主函数*/
main()
{
RX=0;//回波接收端置0
while(1)
{
EX0=1;//关闭外部中断0中断允许位
RX=0;//回波接收端置0
TX_10us();//发射超声波
while(RX==0);//等待回波,当未接收到回波时RX==0,接收到回波后,RX==1,此后进入定时器记时阶段并同时打开外部中断允许位
{
}
/*将测的距离显示到数码管*/
void display()
{
P0 = table[gw];//Tim个位数
P2 = LED_W[3];//点亮第一位数码管
delay_ms(10);
P0 = table[sw];//Tim的十位数
//P0=P0 | 0x80;//带小数点显示
P2 = LED_W[2];//点亮第二位数码管
最后就是编写一个完整的测量加数码管显示Байду номын сангаас程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*定义一些控制端口*/
sbit TX = P1^0;//定义触发超声波传感器发送超声波信号
sbit RX = P3^2;//定义超声波接收反射信号端子,触发中断INT0
{
EX0=0;//关闭外部中断0
TR0 = 0;//关闭定时器
count_distance();
pickup_bit();
}
/*发送超声波函数*/
void TX_10us()
{
TX = 0;
delay_ms(1);
TX = 1;
delay_us(10);
TX = 0;
}
/*接收超声波函数*/
RX_60ms()
TL0 = 0x00;
TR0 = 1;//启动定时器
//ET0 = 1;//打开定时器中断0允许位
}
/*中断初始化函数*/
void INT_init()
{
IT0=1;//设置外部信号下降沿触发中断
//EX0=1;//打开外部中断0中断允许位
//RX=0;
}
/*定时器中断处理函数
void Time0_Int() interrupt 1
经过几天的研究,今晚终于将超声波测距的实验大致上完成了,做一下小结,便于接下来的调试。
首先,我使用的是DYP—ME007超声波模块,这个模块的介绍如下:
正如介绍中说的注意那样,在带电接线的时候,千万别把接地端悬空,这样会损坏模块,因为昨晚和今天早上我用这个模块的时候,都能用示波器测出矩形波,只是数据无法显示,于是我就动了动接线,在无意识的情况下,将模块的接地端悬空,然后烧同样的程序,示波器都无法显示矩形波,无奈……七搞八搞还是不行,最后还是半途中出去办点事花了一个多小时后,回头又搞了一下才给搞好……
float dist;//定义距离变量
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code LED_W[8] = {0,1,2,3,4,5,6,7};
/*一毫秒延时函数*/
delay_ms(uint z)
TX = 0;
}
main()
{
while(1)
{
//P0=0xff;
//delay_ms(200);
TX_10us();
while(RX==0);
//P0=0x00;
delay_ms(60);
}
}
在接线正确的情况下,将示波器的接到模块的Echo端,此时示波器上会显示一个矩形波,当你将手放在模块的发射端远近变化时,示波器上的矩形波的宽度会发生变化,此时可以用光标移动的方式,测量出矩形波的宽度,然后得到△x=**ms,此时可以计算出距离为△x/58单位为cm,这样就可以得到所需测量的距离。
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<148;j++);
}
/*一微秒延时函数*/
void delay_us(uint t)
{
while(--t);
}
/*发送超声波函数*/
void TX_10us()
{
TX = 0;
delay_ms(1);
TX = 1;
delay_us(10);
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<148;j++);
}
/*一微秒延时函数*/
void delay_us(uint t)
{
while(--t);
}
/*定时器T0初始化函数*/
void Time0_init()
{
TMOD = 0x01;//定时器0选用方式1
TH0 = 0x28;//初值的计算设置,60MS
{
EA=1;//打开总中断
Time0_init();//定时器初始化函数,
INT_init();
EX0=1;//打开外部中断0中断允许位
delay_ms(60);
//break;
display();
}
}
}
这个程序主要思路是,首先由P1^0发出触发信号,触发超声波模块发射一个超声波,然后等待接收回波,当接收到回波后Echo端置1,此时启动定时器开始计时,同时将外部中断0初始化,使外部中断0采用下降沿触发,当Echo端由1变为0时,进入中断,计算距离变显示到数码管,不过在数码管显示的过程中还有一定问题,各个管子工作的时间不一样,导致有些管子亮很多,有些很暗,显示这块程序还待完善……
float Tcy = (1/11.0592)*12;//计算机器周期,单位us,单片机晶振11.0592MHz
uint TH_temp,TL_temp;//定义外部中断触发时,定时器中的数值
//uint bfw,sfw,gw,sw;
uint gw,sw,bw;//定义个位,十位,百位变量
uint Tim;//返回时间
//sw = ((uint)dist) / 1000;//求十位数字
gw = ((uint)dist) % 10;//求个位数字
sw = ((uint)dist) % 100 / 10;//求十位数字
bw = ((uint)dist) / 100;//求百位数字
}
/*外部中断INT0处理函数*/
void Outside_Int(void) interrupt 0
#define uchar unsigned char
#define uint unsigned int
/*定义一些控制端口*/
sbit TX = P1^0;//定义触发超声波传感器发送超声波信号
sbit RX = P3^2;//定义超声波接收反射信号端子,触发中断INT0
/*一毫秒延时函数*/
delay_ms(uint z)
dist = Tim / 58;//得出dist单位是:cm?
}
void pickup_bit()
{
//bfw = ((uint)dist) % 10;//求百分位数字
//sfw = ((uint)dist) % 100 / 10;//求十分位数字
//gw = ((uint)dist) % 1000 / 10;//求个位数字
{
count++;
TH0 = 0xFF;//初值的计算设置,0.1MS
TL0 = 0xA3;
}*/
void count_distance()
{
TH_temp = TH0;
TL_temp = TL0;
TH0 = 0x28;//初值的计算设置,60MS
TL0 = 0x00;
Tim = ((TH_temp*256+TL_temp)-(0x28*256+0x00)) * Tcy;//计算返回时间,单位:us
然后就是关于理解模块时序的问题,首先给模块的Trig端大概10us的高电平后,模块内部会产生8个40KMz的脉冲,此时只是发射一个超声波,所以不用当心第二次发射后,接收到的会是第一次的产生的超声波。发出超声波后就是关于超声波接收的问题,我写了一个最简单的程序,主要是利用示波器测试模块是否可用
#include<reg52.h>
delay_ms(10);
P0 = table[bw];//Tim的百位数
//P0=P0 | 0x80;
P2 = LED_W[1];//点亮第三位数码管
delay_ms(10);
//P0 = table[sw];//Tim的十位数
//P2 = LED_W[0];//点亮第三位数码管
//delay_ms(3);
}
/*主函数*/
main()
{
RX=0;//回波接收端置0
while(1)
{
EX0=1;//关闭外部中断0中断允许位
RX=0;//回波接收端置0
TX_10us();//发射超声波
while(RX==0);//等待回波,当未接收到回波时RX==0,接收到回波后,RX==1,此后进入定时器记时阶段并同时打开外部中断允许位
{
}
/*将测的距离显示到数码管*/
void display()
{
P0 = table[gw];//Tim个位数
P2 = LED_W[3];//点亮第一位数码管
delay_ms(10);
P0 = table[sw];//Tim的十位数
//P0=P0 | 0x80;//带小数点显示
P2 = LED_W[2];//点亮第二位数码管
最后就是编写一个完整的测量加数码管显示Байду номын сангаас程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*定义一些控制端口*/
sbit TX = P1^0;//定义触发超声波传感器发送超声波信号
sbit RX = P3^2;//定义超声波接收反射信号端子,触发中断INT0
{
EX0=0;//关闭外部中断0
TR0 = 0;//关闭定时器
count_distance();
pickup_bit();
}
/*发送超声波函数*/
void TX_10us()
{
TX = 0;
delay_ms(1);
TX = 1;
delay_us(10);
TX = 0;
}
/*接收超声波函数*/
RX_60ms()
TL0 = 0x00;
TR0 = 1;//启动定时器
//ET0 = 1;//打开定时器中断0允许位
}
/*中断初始化函数*/
void INT_init()
{
IT0=1;//设置外部信号下降沿触发中断
//EX0=1;//打开外部中断0中断允许位
//RX=0;
}
/*定时器中断处理函数
void Time0_Int() interrupt 1