超声波是指频率在20kHz以上的声波,它属于机械波的范畴。超声波也遵循一般机械波在弹性介质中的传播规律,如在介质的分界面处发生反射和折射现象,在进入介质后被介质吸收而发生衰减等。正是因为具有这些性质,使得超声波可以用于距离的测量中。随着科技水平的不断提高,超声波测距技术被广泛应用于人们日常工作和生活之中。系统的设计主要包括两部分,即硬件电路和软件程序。硬件电路主要包括单片机电路、发射电路、接收电路、显示电路和电源电路,另外还有复位电路和LED控制电路等。我采用以AT89C51单片机为核心的低成本、高精度、微型化数字显示超声波测距仪的硬件电路。整个电路采用模块化设计,由信号发射和接收、供电、温度测量、显示等模块组成。发射探头的信号经放大和检波后发射出去,单片机的计时器开始计时,超声波被发射后按原路返回,在经过放大带通滤波整形等环节,然后被单片机接收,计数器停止工作并得到时间。温度测量后送到单片机,通过程序对速度进行校正, 结合两者实现超声波测距的功能。软件程序主要由主程序、预置子程序、发射子程序、接收子程序、显示子程序等模块组成。它控制单片机进行数据发送与接收,在一定温度下对超声波速度的校正,还有实现数据正确显示在LED上。另外程序控制单片机消除各探头对发射和接收超声波的影响。相关部分附有硬件电路图、程序流程图。
单片机源程序如下:
- #include "wave.h"
- #include "reg52.h"
- #include "intrins.h"
- #include "12864.h"
- #include "delay.h"
- sbit Trig = P2^0;
- sbit Echo = P3^2;
- extern uchar dis2[];
- extern uchar dis6[];
- float distance;
- uint succeed_flag,time,timeH,timeL,numble=0;
- uchar bai,shi,ge,xiaoge;
- void send()
- {
- EA=0;
- Trig=1; //超声波输入端
- delay_20us(); //延时20us
- Trig=0; //产生一个20us的脉冲
- }
- void receive()
- {
- while(Echo==0); //等待Echo回波引脚变高电平
- succeed_flag=0; //清测量成功标志
- EA=1;
- EX0=1; //打开外部中断0
- TH1=0; //定时器1清零
- TL1=0; //定时器1清零
- TF1=0; //计数溢出标志
- TR1=1; //启动定时器1
- delay(140); //等待测量的结果
- TR1=0; //关闭定时器1
- EX0=0; //关闭外部中断0
-
- if(succeed_flag==1)
- {
- display3();
- time=timeH*256+timeL+numble*65536;
- distance=(time*1.85)/100; //厘米
- TH1=0;
- TL1=0;
- bai=(uint)distance/100;
- shi=(uint)(distance)%100/10;
- ge=(uint)(distance)%10;
- xiaoge=(uint)((distance-(uint) (distance))*100)%100/10;
-
-
-
- lcd_pos(2,0);
- lcd_wdat(' ');
- delay(5);
- lcd_wdat(0x30+bai);
- delay(5);
- lcd_wdat(0x30+shi);
- delay(5);
- lcd_wdat(0x30+ge);
- delay(5);
- lcd_wdat('.');
- delay(5);
- lcd_wdat(0x30+xiaoge);
- delay(5);
- lcd_wdat('c');
- delay(5);
- lcd_wdat('m');
- delay(300);
-
- }
- if(succeed_flag==0)
- {
- display();
- // display3(); //没有回波则清零
- P1=0; //测试灯变化
- }
- }
- //外部中断0,用做判断回波电平
- void exter() interrupt 0 // 外部中断0是0号
- {
- timeH =TH1; //取出定时器的值
- timeL =TL1; //取出定时器的值
- succeed_flag=1;//至成功测量的标志
- EX0=0; //关闭外部中断
- }
- //****************************************************************
- //定时器1中断,用做超声波测距计时
- void timer1() interrupt 3 //
- {
- TH1=0;
- TL1=0;
- numble++;
- }
复制代码
所有资料51hei提供下载:
超声波测距.zip
(58.08 KB, 下载次数: 13)
|