超声波测距

来源:互联网 发布:网络空间安全 科研 编辑:程序博客网 时间:2024/04/20 20:07

实验六  超声波测距

三、实验内容

编写C51程序,使用超声波测量实验板距离障碍物的距离,将结果(以厘米计)显示到数码管上。测量距离在30cm~200cm之间。

四、实验步骤

1、根据实验原理,本实验的基本思路如下:

① 利用单片机的P1.0发出若干40kHz的方波脉冲,经过放大后输出到超声波发生器,产生超声波。

② 发射出去的超声波遇到障碍反射回来,又进入实验板的超声波接受器,内部电路将接受到的回波信号经过放大、过滤等,最后输出到锁相电路中,在INT0管脚出现下降沿,触发外部中断。

③ 使用内部定时器来进行计时,计算出从信号发出到产生中断之间的时间,通过计算得到距离,并显示到数码管上。

④ 上述过程不断循环重复。

2、产生40kHz的方波,需要在每半个周期将P1.0的输出进行翻转。这个定时需要精确实现,可以使用一个内部定时器来控制(方式2更加精确)。如果使用程序延时的话,需要查阅相关手册,并结合使用的单片机型号来确认指令的运行时间。只需要输出若干个(5-10个)脉冲即可。

3、在方波输出结束此之前不能开启外部中断允许,这是因为输出的超声波会同时反馈到输入,干扰中断。为保险起见,应该在方波输出结束后稍微延迟一段时间(0.1ms即可,不用精确控制)再开启。

4、使用另外一个定时器完成时间的测量。当开始输出时启动定时器(初值为0),在外部中断处理中停止定时器,并将定时器的值读出,就可以换算为距离,并显示到数码管上。 

5、如果经过很长时间,仍然没有中断触发,可以认为超声波没有返回,本次测量无效。在数码管上显示一个特别的数字或符号。时间测量定时器的溢出是检验测量无效的关键时间点。。

6、每次测量完成后,延时一段时间,继续下一次测量。 

五、实验原理

振动频率超过20kHz,不能被人耳所接收的声波称作“超声波”。超声波频率高,波长短,在一定距离内沿直线传播,具有良好的束射性和方向性,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪等。

当超声波在发射后遇到障碍物反射回来之后,根据发射和接收的时间差计算出发射点到障碍物的实际距离。在不考虑温度等因素的情况下,超声波在空气中的传播速度约为340m/s,根据记录的时间差t,就可以计算出发射点距障碍物的距离(s),即:s=340*t/2。

超声波测距装置分为两部分:超声波发生器和超声波接受器。本实验中采用压电式超声波发生器。它利用压电晶体的谐振原理来进行电能和机械能之间的相互转换。超声波发生器内部有两个压电晶片和一个共振板。当压电晶片外加一定电压的脉冲信号,并且其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,将电能转换为机械能,产生超声波。反之,如果两电极间未外加电压,而共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。因此同一种装置即可作为发生器,也可以作为接收器。本实验使用的压电晶片的固有振荡频率为40kHz左右。

超声波测距产生误差的原因包括时间误差和超声波传播速度误差两大方面。时间误差方面可以通过各种软件措施进行弥补,使用单片机也可以达到微秒级,对整体误差影响很小。超声波的传播速度受空气的密度所影响,空气的密度越高则超声波的传播速度就越快,而空气的密度又与温度有着密切的关系,另外和湿度也有一定的关系。整体来说,实际速度变化的幅度能够达到5%,是更加重要的影响因素。

系统的最大可测距离取决于以下四个因素:超声波的幅度,反射面的质地,反射面和入射声波之间的夹角以及接收器的灵敏度。本实验的原理框图如下:


实验六#include <reg52.h>typedef unsigned char uchar;typedef unsigned int uint;sfr P4=0xC0;sfr P4SW=0xBB;sbit sclk = P4^4;  //时钟sbit sda = P4^5;sbit out = P1^0;bit t0_end;//方波结束bit e0;//接受外部中断bit t1;//定时中断1一直到完结uint count = 0;//当前方波脉冲数unsigned long int temp = 0;uchar code tab[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};unsigned long int result = 999;void init(){P4=0xFF;        P4SW=0x70;TMOD = 0x12;TH0 = 0xf4;//方波,周期24umTL0 = 0xf4;TH1 = 0x00; // 计时TL1 = 0x00;while(j--);j=255;}}void e0_int() interrupt 0{delay(1,255);if(INT0==0){TR1=0;e0=1;}}void t0_int() interrupt 1{out = ~out;if(count != 0x00)count-=1;elset0_end=1;}void t1_int() interrupt 3{e0 = 1;t1 = 1;}void main(){unsigned long t;init();while(1){t0_end=0;count=2;out=0;t1=0;t=0;e0=0;TH0=0xf3;   TL0=0xf4;TH1=0x00;   TL1=0x00;TR0=1;TR1=1;while(!t0_end);TR0=0;delay(1,120); EX0=1;while(!e0);EX0=0;if(t1){TR1=0;result=0;}else{t=TH1;t = t << 8;t |= TL1;t=t*17;result=t/1000;}display(result);delay(255,255);delay(255,255);delay(255,255);delay(255,255);delay(255,255);delay(255,255);}}



0 0
原创粉丝点击