资料 基于单片机的超声波测距系统_第1页
资料 基于单片机的超声波测距系统_第2页
资料 基于单片机的超声波测距系统_第3页
资料 基于单片机的超声波测距系统_第4页
资料 基于单片机的超声波测距系统_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于单片机的超声波测距1 超声波测距原理:超声波测距原理是通过超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播时碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为v ,而根据计时器记录的测出发射和接收回波的时间差t ,就可以计算出发射点距障碍物的距离S ,即: S = v·t /2 由于超声波也是一种声波, 其声速C与温度有关,表1列出了几种不同温度下的声速。在使用时,如果温度变化不大, 则可认为声速是基本不变的。常温下超声波的传播速度是334 米/秒,但其传播速度V 易受空气中温度、湿度、压强等因素的影响,其中受温

2、度的影响较大,如温度每升高1 , 声速增加约0. 6 米/ 秒。如果测距精度要求很高, 则应通过温度补偿的方法加以校正(本系统正是采用了温度补偿的方法)。已知现场环境温度T 时, 超声波传播速度V 的计算公式为:V = 331.45 + 0.607T, 声速确定后, 只要测得超声波往返的时间,即可求得距离。2 硬件系统 图1 超声波测距仪系统框图基于单片机的超声波测距系统构成如图1所示。该系统由单片机定时器产生40KHZ的频率信号、超声波传感器、接收处理电路和显示电路等构成。单片机是整个系统的核心部件,它协调和控制各部分电路的工作。工作过程:开机,单片机复位,然后控制程序使单片机输出载波为40

3、kHz的10个脉冲信号加到超声波传感器上,使超声波发射器发射超声波。当第一个超声波脉冲群发射结束后,单片机片内计数器开始计数,在检测到第一个回波脉冲的瞬间,计数器停止计数,这样就得到了从发射到接收的时间差t;根据公式S = v·t /2、V = 331.45 + 0.607T计算出被测距离,由显示装置显示出来。3 软件程序设计程序采用模块化设计,由主程序、发射子程序、接收子程序、定时子程序、显示子程序等模块组成,图2为程序流程图。该系统的主程序处于键控循环工作方式,当按下测量键时,主程序开始调用发射子程序、查询接收子程序、定时子程序,并把测量结果用显示子程序在数码显示器上显示出来。

4、图2 测距流程图图3 定时器中断子程序 图4 外部中断服务子程序4 参考程序#include<reg51.h> #include<math.h> /*定义数据类型*/ #define uint unsigned int #define uchar unsigned char /*定义系统常数*/ long int time; /* 时间 */ bit CLflag; /* 测量标志 */ char cshu; /* 串数 */ #define T12us (256-12) /*定时器设初值 T=(256-T12us)*12/12MHZ */ /*定义功能位,串口用于显示

5、 */ sbit VOLCK=P1.0; /* 发射 */sbit MING=P3.2; /* 外部中断0检测接收信号 */ char idata disp9; /* 显示数据 */ char idata number9; /* 显示数据 */ char code table =0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09; /* 码表 0,1,2,3,4,5,6,7,8,9 */ void dispfb() /* 显示5位数据 */ char i; for(i=0;i<5;i+) dispi=tablenumberi; disp3=

6、disp3+1; /* 置小数点 */ for(i=0;i<6;i+) SBUF=dispi; while(TI=0); TI=0; /* 通用延时子程序 */ void delay( int j ) int i; for(i=0;i<j;) i+; /* 初始化定时器,CTC0、CTC1用于定时 */ void init_CTC(void ) TMOD = 0x21; /* 设CTC1工作于模式2 */ ET0 = 0; /* 不允许CTC0中断 */ void init_INT( ) /* 外部中断初始化为高优先级,并开中断 */ IP=0x01; /* 置外部中断INT0优先

7、级为高 */ TCON=0; /* 设置外部中断0的中断方式为电平触发 */ void serve_INT0( ) interrupt 0 /* 外部中断0,用于检测接收信号 */ TR0=0; /* 关闭定时器0 */ EX0=0; /* 关中断 */ time=(long)TL0; time+=(long)TH0*256; CLflag=1; /* CTC1中断服务程序,12.5us 中断一次,用于发射 */ void CTC1_INT ( ) interrupt 3 VOLCK=VOLCK; cshu+; void CTC0_INT ( ) interrupt 1 TR0=0; ET0=

8、0; void Timetojuli( ) /* 将测量的时间转换为距离 */ long i; i=(long)time; i=i*340; i=i/2; number4=i/10000000; /* 十米 */ i=i-number4*10000000; number3=i/1000000; /* 米 */ i=i-number3*1000000; number2=i/100000; /* 分米 */ i=i-number2*100000; number1=i/10000; /* 厘米 */ i=i-(long)number1*10000; number0=i/1000; /* 毫米 */

9、uchar getkey( ); /* 读键盘 */ /*主程序*/ void main() int i, key; init_CTC( ); /* 初始化定时器 */ init_INT( ); /* 初始化外部中断 */ CLflag=1; /* 测量标志 */ for(i=6;i>4;i-) dispi=0xff; cshu=0; /* 传数 */ delay(200); /*延时*/; IE=0x80; /* 开中断 */ ET1=0; ET0=0; TR1=0; TR0=0; TL1=T12us; TH1=T12us; while(1) key=getkey( ); /* 读键盘

10、 */ if(key=0x0fe && CLflag=1 ) /* 测量 */ key=0; CLflag=0; cshu=0; TL1=T12us; TH1=T12us; TL0 = 0; TH0 = 0; /* 定时器0的初始时间 */ TR0=1; /* 启动定时器0,开始记时 */ TR1=1; /* 启动定时器1,发送信号 */ ET1=1; while(cshu<12) ; ET1=0; /* 发十个脉冲串 */ TR1=0; delay(95); EX0=1; while(!CLflag); if( cshu>=10 && CLflag=1) Timetojuli( ); dispfb(); uchar getkey( ) c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论