超聲波是指頻率在20kHz以上的聲波,它屬于機械波的范疇。超聲波也遵循一般機械波在彈性介質中的傳播規(guī)律,如在介質的分界面處發(fā)生反射和折射現(xiàn)象,在進入介質后被介質吸收而發(fā)生衰減等。正是因為具有這些性質,使得超聲波可以用于距離的測量中。隨著科技水平的不斷提高,超聲波測距技術被廣泛應用于人們日常工作和生活之中。系統(tǒng)的設計主要包括兩部分,即硬件電路和軟件程序。硬件電路主要包括單片機電路、發(fā)射電路、接收電路、顯示電路和電源電路,另外還有復位電路和LED控制電路等。我采用以AT89C51單片機為核心的低成本、高精度、微型化數(shù)字顯示超聲波測距儀的硬件電路。整個電路采用模塊化設計,由信號發(fā)射和接收、供電、溫度測量、顯示等模塊組成。發(fā)射探頭的信號經放大和檢波后發(fā)射出去,單片機的計時器開始計時,超聲波被發(fā)射后按原路返回,在經過放大帶通濾波整形等環(huán)節(jié),然后被單片機接收,計數(shù)器停止工作并得到時間。溫度測量后送到單片機,通過程序對速度進行校正, 結合兩者實現(xiàn)超聲波測距的功能。軟件程序主要由主程序、預置子程序、發(fā)射子程序、接收子程序、顯示子程序等模塊組成。它控制單片機進行數(shù)據(jù)發(fā)送與接收,在一定溫度下對超聲波速度的校正,還有實現(xiàn)數(shù)據(jù)正確顯示在LED上。另外程序控制單片機消除各探頭對發(fā)射和接收超聲波的影響。相關部分附有硬件電路圖、程序流程圖。
單片機源程序如下:
- #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; //計數(shù)溢出標志
- 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, 下載次數(shù): 13)
2018-11-2 11:04 上傳
點擊文件名下載附件
超聲波測距+12864顯示 下載積分: 黑幣 -5
|