1.給超聲波模塊接入電源和地。 2. 給脈沖觸發引腳(trig)輸入一個長為 20us 的高電平方波 3. 輸入方波后, 模塊會自動發射 8 個 40KHz 的聲波, 與此同時 回波引腳 (echo) 端的電平會由 0 變為 1; (此時應該啟動定時器計時) 4. 當超聲波返回被模塊接收到時,回波引腳端的電平會由 1 變 為 0; (此時應該停止定時器計數) ,定時器記下的這個時間即為超聲波由發射到返回的總時長。 5.根據聲音在空氣中的速度為 344 米/秒, 即可計算出所測的距 離。
#include <reg52.h> sbit dula=P2^6; //數碼管段選,鎖存器控制信號 sbit wela=P2^7; //數碼管位選,鎖存器控制信號 sbit a=P2^3; #define uchar unsigned char #define uint unsigned int int time; int succeed_flag; uchar timeL; uchar timeH; sbit Trig=P1^0; sbit Echo=P3^2; uchar codetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f}; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void delay_20us() { uchar a ; for(a=0;a<100;a++); } //顯示數據轉換程序 void display(uint temp) { ucharge,shi,bai; bai=temp/100; shi=(temp%100)/10; ge=temp%10; dula=0; P0=table[ge]; //送數字8到段碼端口 dula=1; dula=0; wela=0; P0=0x7b; //數碼管位選 wela=1; wela=0; delay(5); dula=0; P0=table[shi]; //送數字8到段碼端口 dula=1; dula=0; wela=0; P0=0x7d; //數碼管位選 wela=1; wela=0; delay(5); dula=0; P0=table[bai]; //送數字8到段碼端口 dula=1; dula=0; wela=0; P0=0x7e; //數碼管位選 wela=1; wela=0; delay(5); if(temp>150) a=0; else a=1; } void main() { uint distance; Trig=0; //首先拉低脈沖輸入引腳 EA=1; //打開總中斷0 TMOD=0x10; //定時器1,16位工作方式 while(1) { EA=0; //關總中斷 Trig=1; //超聲波輸入端 delay_20us(); //延時20us Trig=0; //產生一個20us的脈沖 while(Echo==0); //等待Echo回波引腳變高電平 succeed_flag=0; //清測量成功標志 EA=1; EX0=1; //打開外部中斷0 TH1=0; //定時器1清零 TL1=0; //定時器1清零 TF1=0; //計數溢出標志 TR1=1; //啟動定時器1 delay(20); //等待測量的結果 TR1=0; //關閉定時器1 EX0=0; //關閉外部中斷0 if(succeed_flag==1) { time=timeH*256+timeL; distance=time*0.0172; //厘米 } if(succeed_flag==0) { distance=0; //沒有回波則清零 } display(distance); } } //外部中斷0,用做判斷回波電平 void exter() interrupt 0 // 外部中斷0是0號 { EX0=0; //關閉外部中斷 timeH =TH1; //取出定時器的值 timeL=TL1; //取出定時器的值 succeed_flag=1;//至成功測量的標志 } //定時器1中斷,用做超聲波測距計時 void timer1() interrupt 3 // { TH1=0; TL1=0;
}
|