超声波测距模块程序中为什么要有这个for循环

超声波测距详细资料及程序代码
超声波测距学习板,可应用于汽车倒车、建筑施工工地以及一些工业现场的位置监控,也可用于如液位、井深、管道长度的测量等场合。要求测量范围在0.27~4.00m,测量精度1cm,测量时与被测物体无直接接触,能够清晰稳定地显示测量结果。
超声波发生器内部结构有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果两电极间未外加电压,当共振板接收到超声波本时,将压迫压电晶片作振动,将机械能转换为电信号,就成为超声波接收器。在超声探测电路中,发射端得到输出脉冲为一系列方波,其宽度为发射超声的时间间隔,被测物距离越大,脉冲宽度越大,输出脉冲个数与被测距离成正比。超声测距大致有以下方法:① 取输出脉冲的平均值电压,该电压 (其幅值基本固定 )与距离成正比,测量电压即可测得距离;② 测量输出脉冲的宽度,即发射超声波与接收超声波的时间间隔 t,故被测距离为 S=1/2vt。本测量电路采用第二种方案。由于超声波 的声速 与温度有关,如果温度变化不大,则可认为声速基本不变
。如果测距精度要求很高,则应通 过温度补偿
的方法加以校正。超声波测距适用于高精度的中长距离测量。因为超声波在标准空气中的传播速度为331.45米/秒,由单片机负责计时,单片机使用12.0M晶振,所以此系统的测量精度理论上可以达到毫米级。
超声波学习板采用AT89C51或AT89S51单片机,晶振:12M,单片机用P1.0口输出超声波换能器所需的40K方波信号,利用外中断0口监测超声波接收电路输出的返回信号,显示电路采用简单的4位共阳LED数码管,断码用74LS245,位码用8550驱动.
&&超声波测距的算法设计: 超声波在空气中传播速度为每秒钟340米(15℃时)。X2是声波返回的时刻,X1是声波发声的时刻,X2-X1得出的是一个时间差的绝对值,假定X2-X1=0.03S,则有340m&0.03S=10.2m。由于在这10.2m的时间里,超声波发出到遇到返射物返回的距离,
超声波测距器的系统框图如下图所示:
超声波测距器的系统框图如下图所示:
超声波学习板采用AT89C51或AT89S51单片机,晶振:12M,单片机用P1.0口输出超声波换能器所需的40K方波信号,利用外中断0口监测超声波接收电路输出的返回信号,显示电路采用简单的4位共阳LED数码管,断码用74LS245,位码用8550驱动.
主要由单片机系统及显示电路、超声波发射电路和超声波检测接收电路三部分组成。采用AT89S51来实现对CX20106A红外接收芯片和TCT40-10系列超声波转换模块的控制。单片机通过P1.0引脚经反相器来控制超声波的发送,然后单片机不停的检测INT0引脚,当INT0引脚的电平由高电平变为低电平时就认为超声波已经返回。计数器所计的数据就是超声波所经历的时间,通过换算就可以得到传感器与障碍物之间的距离。
1.单片机系统及显示电路
单片机采用89S51或其兼容系列。采用12MHz高精度的晶振,以获得较稳定的时钟频率,减小测量误差。单片机用P1.0端口输出超声波转化器所需的40KHz方波信号,利用外中断0口检测超声波接受电路输出的返回信号。显示电路采用简单实用的4位共阳LED数码管,段码用74LS245驱动,位码用PNP三极管驱动。单片机系统及显示电路如下图所示.
超声波发射电路原理图&
超声波接收电路:
使用CX20106A集成电路对接收探头受到的信号进行放大、滤波。其总放大增益80db。以下是CX20106A的引脚注释。
1脚:超声信号输入端,该脚的输入阻抗约为40kΩ。
2脚:该脚与地之间连接RC串联网络,它们是负反馈串联网络的一个组成部分,改变它们的数值能改变前置放大器的增益和频率特性。增大电阻R1或减小C1,将使负反馈量增大,放大倍数下降,反之则放大倍数增大。但C1的改变会影响到频率特性,一般在实际使用中不必改动,推荐选用参数为R1=4.7Ω,C1=1μF。
3脚:该脚与地之间连接检波电容,电容量大为平均值检波,瞬间相应灵敏度低;若容量小,则为峰值检波,瞬间相应灵敏度高,但检波输出的脉冲宽度变动大,易造成误动作,推荐参数为3.3μf。
4脚:接地端。
5脚:该脚与电源间接入一个电阻,用以设置带通滤波器的中心频率f0,阻值越大,中心频率越低。例如,取R=200kΩ时,f0≈42kHz,若取R=220kΩ,则中心频率f0≈38kHz。
6脚: 该脚与地之间接一个积分电容,标准值为330pF,如果该电容取得太大,会使探测距离变短。
7脚:遥控命令输出端,它是集电极开路输出方式,因此该引脚必须接上一个上拉电阻到电源端,推荐阻值为22kΩ,没有接受信号是该端输出为高电平,有信号时则产生下降。
8脚:电源正极,4.5~5V。
超声波测距学习成品板
产品性能特点:
成品板上自带:超声波收发传感器、接收放大电路、四位LED数码显示、四位按键,电源部分自带整流、滤波、稳压电路,允许交流7~15V或者直流9~16V输入,经过实际测试,测量范围可达27~300厘米,测量精度为1厘米。因为我们能提供完整的源程序,客户不但可以学习超声波测距的知识,还可以直接将这项技术用于产品开发,是不可多得的资料。
下图是超声波测距学习板的元件布局图,
软硬件调试及性能
超声波测距仪的制作和调试,其中超声波发射和接收采用Φ16的超声波换能器,中心频率为40kHz,安装时应保持两换能器中心轴线平行并相距4~8cm,其余元件无特殊要求。若能将超声波接收电路用金属壳屏蔽起来,则可提高抗干扰能力。根据测量范围要求不同,可适当调整与接收换能器并接的滤波电容C6的大小,以获得合适的接收灵敏度和抗干扰能力。&
硬件电路制作完成并调试好后,便可将程序编译好下载到单片机试运行。根据实际情况可以修改超声波发生子程序每次发送的脉冲宽度和两次测量的间隔时间,以适应不同距离的测量需要。根据所设计的电路参数和程序,测距仪能测的范围为0.07~5.5m,测距仪最大误差不超过1cm。系统调试完后应对测量误差和重复一致性进行多次实验分析,不断优化系统使其达到实际使用的测量要求。&
& 后续工作需实验后才能验证
&根据参考电路和集成的电路器件测距范围有限10m以内为好。
附录1 超声波测距仪汇编和C51混合编程源程序
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
extern void cs_t(void);
extern void delay(unit);
extern void display(uchar*);
void main(void)
data uchar dispram[5];
TMOD=0x11;
&delay(1);
&testok=0;
&while(!testok)display(dispram);
&if(1==testok)
&time=TH0;
&time=time&&8|TL0;
&time*=172;
&time/=10000;
&dispram[0]=(uchar)(time);
&time/=10;
dispram[1]=(uchar)(time);
&time/=10;
dispram[2]=(uchar)(time);
dispram[3]=(uchar)(time/10);
if(0==dispram[3])dispram[3]=17;
dispram[0]=16;
dispram[1]=16;
dispram[2]=16;
dispram[3]=16;
for(i=0;i&300;i++) display(dispram);
void cs_r(void) interrupt 0
void overtime(void) interrupt 1
;----------------------------
;超声发生子程序(12MHz晶振38.5Hz)
;----------------------------
NAME&& CS_T
?PR?CS_T?CS_T
SEGMENT&&&
&&& PUBLIC
RSEG&& ?PR?CS_T?CS_T
PUSH&& ACC
&&& TH0,#00H
&&& TL0,#00H
SETB&& TR0
DJNZ&& ACC,CS_T1
;------------------------
;四位共阳LED动态扫描显示程序*/
;p0为段码口,p2为位选口(高电平有效0)
;参数为要显示的字符串指针
;--------------------------------
NAME&& DISPLAY
?PR?_DISPLAY?DISPLAY
SEGMENT&&&
?CO?_DISPLAY?DISPLAY
SEGMENT&&&
EXTRN& CODE (_DELAY)
&&& PUBLIC
RSEG&& ?CO?_DISPLAY?DISPLAY
?_DISPLAY?BYTE:
RSEG&& ?PR?_DISPLAY?DISPLAY
_DISPLAY: PUSH&&
PUSH&& DPH
PUSH&& DPL
PUSH&& PSW
CJNE&& A,#4D,DISP1
DISPNUM,#00H
DISPBIT,#0FEH
&&& MOV A,R1
&&& MOV R0,A
DPTR,#DISPTABLE
MOVC&& A,@A+DPTR
&&& MOV P0,A
CJNE&& A,#2D,DISP3
&&& CLR P0.7
P2,DISPBIT
LCALL& _DELAY
&&& POP PSW
&&& POP DPL
&&& POP DPH
&&& POP ACC
DISPTABLE:DB&&&
0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0BFH,0FFH
"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","-","
;-------------------------------
;延时100机器周期*参数(1~65535)
;--------------------------------
NAME&& DELAY
?PR?_DELAY?DELAY
SEGMENT&&&
&&& PUBLIC
RSEG&& ?PR?_DELAY?DELAY
PUSH&& ACC
JZ& DELA1&
R5,#50D&&&
R7,DELA1&&
R6,DELA1&&
&&& POP ACC
超声波测距学习板全部元件清单:
R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12,
RST, S1, S2, S3, S4
超声波接收管
超声波发射管
D1, D2, D3, D4
0.36数码管
温度传感接口
红外接收一体头CX20106A
DC电源插座
Q1, Q2, Q3, Q4, Q5
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。超声波测距传感器及其在卷径测量中的应用_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
超声波测距传感器及其在卷径测量中的应用
上传于||文档简介
&&超​声​波​;​测​距​;​单​片​机
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩24页未读,继续阅读
你可能喜欢查看: 940|回复: 4
单个超声波测距模块控制小车前进/后退程序—(有最详细的注释)
//晶振=11.0592M
//MCU=STC516RD+
//************************************
#include&reg51.h&& & & & //包括一个52标准内核的头文件
#define uchar unsigned char& & & & //定义一下方便使用
#define uint unsigned int& & & & //定义一下方便使用
uchar D& & & & //定义Distance(距离)变量
sbit Tr1=P1^4;& & & & //定义超声波模块的控制端(Tr)
sbit Ec1=P1^5;& & & & //定义超声波模块的接收端(Ec)
sbit IN1=P2^1;& & & & //定义L298n步进电机驱动芯片的IN1管脚由51MCU的P2^1管脚控制IN1对应控制OUT1电机驱动脚
sbit IN2=P2^0;& & & & //定义L298n步进电机驱动芯片的IN2管脚由51MCU的P2^0管脚控制IN2对应控制OUT2电机驱动脚
sbit IN3=P2^2;& & & & //定义L298n步进电机驱动芯片的IN3管脚由51MCU的P2^2管脚控制IN3对应控制OUT3电机驱动脚
sbit IN4=P2^3;& & & & //定义L298n步进电机驱动芯片的IN4管脚由51MCU的P2^3管脚控制IN4对应控制OUT4电机驱动脚
sbit ENA=P2^5;& & & & //定义L298n步进电机驱动芯片的ENA管脚由51MCU的P2^5管脚控制ENA脚是使能脚控制IN1,2脚输入的高低电平是否有效
sbit ENB=P2^4;& & & & //定义L298n步进电机驱动芯片的ENB管脚由51MCU的P2^4管脚控制ENA脚是使能脚控制IN3,4脚输入的高低电平是否有效
void Delays(uint x)& & & & //延时函数Delays..定义形参x为unsigned int 型
{
uint q,w;& & & & //定义实际参数q,w为unsigned int 型
for(q=x;q&0;q--)& & & & //q=x,q小于0,q减一。如果q小于零则退出此语句
for(w=110;w&0;w--);& & & & //w=110,w小于0,w减一。如果w小于零则退出此语句
}
void init()& & & && & //初始化函数init
{& & & && & //初始化Ec1=0;
Ec1=0;& & & && & //初始化Tr1=0;
Tr1=0;
}
void Ranging()& & & && & //Ranging(测距)函数用于检测出距离并控制电机做出相应的动作
{
static uchar Num3=0;& & & && & //定义unsigned char型局部变量Num3,并且只第一次执行时Num3=0,以后执行时不会再次初始,主要用于超声波模块的使能信号过后用来检测接收端Ec1是否有高电平,或用于进入和退出while循环,,
bit Bit_Num2;& & & && & //定义bit型变量(51特有变量)Bit_Num2。。主要用于关闭定时器并进入下一个函数(检测Ec1的脉宽长度)
Tr1=1;& & & && & //Tr1给高电平
Delays(10);& & & && & //至少延时10微秒
Tr1=0;& & & && & //Tr1给低电平
Num3=1;& & & && & //Num3给1
Bit_Num2=0;& & & && & //Bit_Num2给0用于进入下一步while循环
while(Num3==1)& & & && & //当Num3检测到定于1时进入本循环
{
while(Ec1==1)& & & && & //当Ec1检测等于1是进入本循环,当Ec1(接收信号的高电平脉宽结束后退出此循环)
{& & & && & //Bit_Num2给以用来键入笑一个if语句
Bit_Num2=1;& & & && & //打开定时器TR0进入定时器0中断
TR0=1;
}
if(Ec1==0&Bit_Num2==1)& & & && & //如果Ec1等于0(超声波测距模块的接收端发送到高电平脉宽传送完后)而且Bit_Num2等于1进入此语句
{& & & && &
uchar M& & & && & //定义unsigned char变量Move(用来进入switch语句并选择那种工作方式)
TR0=0;& & & && & //关闭定时器
if(Distance&50)& & & && & //如果脉宽小于50微秒
{
Move=1;& & & && & //Move等于1
}
else if(Distance&50)& & & && & //如果上一语句不成立则检测此语句,如果脉宽的时间长度大于50微秒
{
Move=2;& & & && & //Move等于2
}
switch(Move)& & & && & //检测Move的值并进入相应的语句
{
case 1:P3=0x00;IN1=0;IN2=1;IN3=0;IN4=1;ENA=1;ENB=1;Num3=0;Distance=0;& & & &&&//如果Move等于1,则电机正转,并P3口所有IO口低电平,并给Distance清零,然后退出此语句
case 2:P3=0IN1=1;IN2=0;IN3=1;IN4=0;ENA=1;ENB=1;Num3=0;Distance=0;& & & &&&//如果Move等于0,则电机反转,并P3口所有IO口高电平,并给Distance清零,然后退出此语句
default:& & & &&&//如果以上都不符合,则退出此语句,准备下一循环
}
Move=0;
}& & & && & //Move清零;
}& & & &
}
void open_time()& & & && & //定时器初始函数
{
TMOD=0x01;& & & && & //确定工作方式位01,(内容自己上网查啊,大概是16位手动重装计数器,,记不清了)
TH0=(6;& & & && & //确定一微秒记一次
TL0=(6;& & & && & //确定一微秒记一次
EA=1;& & & && & //打开总中断
ET0=1;& & & && & //打开定时器0中断
TR0=0;& & & && & //关闭定时器0
}
void main()& & & && & //main函数(主函数),,所有函数都从这个函数开始执行
{& & & && &
init();& & & && & //执行init函数
open_time();& & & && & //执行open_time函数
while(1)& & & && & //进入大循环(除非执行中断函数否则永不退出)
{
Ranging();& & & && & //执行Ranging函数
}
}
void time() interrupt 1& & & && & //定时器0中断语句
{
TH0=(6;& & & && & //重装初值TH0=(6;
TL0=(6;& & & && & //重装初值TL0=(6;
Distance++;& & & && & //每次走一步Distance加一
if(Distance==6553)& & & && & //如果Distance等于65535就进入此语句
{
Distance=0;& & & && & //Distance的值清零
}
}复制代码
这注释是够详细的
大神在不?
这注释是够详细的
哈哈 这个详细,谢谢楼主了
用12M晶振单片机是STC12C5608AD下载进去不好用?
Powered by超声波测距程序中为什么要有这个for循环_百度知道
循环啊。for循环最重要了。
我知道是循环啊
哥!!!为什么要这样做
看具体的电路和每个人的思路吧。
用于计时,当Rx == 1后,可根据VALA计算出往返时间
其他类似问题
为您推荐:
超声波测距的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁各位大侠请看一下我写的US-100超声波的测距程序有什么问题。 他总是测完第一次之后就不再测 了。_百度知道
各位大侠请看一下我写的US-100超声波的测距程序有什么问题。 他总是测完第一次之后就不再测 了。
/#define uint unsigned int#define uchar unsigned charsbit gnd1=P1^0;for(i=x;void delay_short(uchar x){uint i。#include &
/sbit gnd2=P1^1;256;sbit rx=P1^2;sbit vcc=P1^4;reg52;}void init(){gnd1=0;i&gt不知是不是程序卡死在while(rx==0)这里;}void dscx(){TMOD=0x01;重装初值TH0=()&#47。请你们帮帮我;gnd2=0.h&i--);vcc=1;0;sbit tx=P1^3
00)%256;1msTL0=()%256;1500)P2=0xf0;1500)P2=0TR0=0;单位mmif(k&while(1){cjcx();ET0=0;k=(num*340;num++;}void T0_time() interrupt 1
/init();ET0=1.0)/256;}void main(){dscx();ET0=0;EA=0;/delay_short(12);if(k&while(rx==1){P2=0delay_long(1000);}EA=0;
/tx=0;while(rx==0){P2=0x7f;/num=0;中断程序{TH0=()/TR0=1;/}void cjcx(){tx=1;/
/TR0=0;}EA=1;/
也请教个问题?是测井深,超声波测距能测6-10公分直径,深度2-20米的井吗
其他类似问题
为您推荐:
其他2条回答
我最近也在做这个,求解释,遇到的问题跟你的一样,你的问题解决了吗,求方法啊
解决了,就是num类型弄错了char范围只有0-255,改为int类型就可以int范围是2^16。
是不是没有一个循环?
你再看看吧,我干才复制的程序没复制全。呵呵,不好意思。
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 超声波测距原理图 的文章

 

随机推荐