最近在造小車 須要用到超聲波模塊 現將調試時用到的代碼分享出來。spa
所用超聲波模塊爲HC-SR04 單片機開發板是吳鑑鷹的3d
先理解超聲波模塊的原理,它有四個接口 Vcc Trig Echo Gnd 。
Vcc接正極 Gnd接地
Trig和Echo隨便接兩個IO口
而後給Trig口高電平10us以上,超聲波模塊會自動發出8個40khz的方波,並檢測是否有信號返回,有信號返回時就在Echo口輸出高電平,持續的時間就是發出信號到接受信號所用的時間。因此計算從發出到接收信號所用的時間,就能夠得知聲音傳播一個來回所花費的時間,在結合聲速就能夠算出距離了。(這裏只是簡單的估算,聲速還和溫度等因素有關)
而後開始寫程序。
這裏我爲了能更好的看到超聲波模塊是否起做用,加入了單片機上的蜂鳴器,並設置了一個報警距離。調試
1 #include<reg52.h> 2 #include<stdio.h> 3 #include<intrins.h> 4 sbit Trig=P2^5; //控制端 5 sbit Echo=P2^4; //接收端 6 sbit Beep=P3^4; //單片機開發板上的蜂鳴器 7 unsigned char T0RH=0; 8 unsigned char T0RL=0; 9 void Start_Buzz(unsigned int frequ) 10 { 11 unsigned int reload; 12 reload = 65536 - (11059200/12)/(frequ*2); 13 T0RH = (unsigned char)(reload >>8); //蜂鳴器定時用 產生方波 14 T0RL = (unsigned char)reload; //蜂鳴器定時用 產生方波 15 16 TH1 = 0xFF;//蜂鳴器定時器 17 TL1 = 0xFE;//蜂鳴器定時器 18 19 ET1 = 1; 20 TR1 = 1; 21 } //啓動蜂鳴器 並設置音高 22 void Stop_Buzz() 23 { 24 Beep= 1; 25 ET1 = 0; 26 TR1 = 0; 27 } //關閉蜂鳴器 28 void InterruptTimer0() interrupt 3 29 { 30 TH1 = T0RH; 31 TL1 = T0RL; 32 Beep = ~Beep; 33 } //蜂鳴器中斷程序 34 void time_init() 35 { 36 EA=1; 37 TMOD=0x11; 38 TH0 = 0; 39 TL0 = 0; 40 } //初始化定時器 41 void Delay_us(unsigned char t) 42 { 43 while(--t); 44 } //大約延時t*2+5us 超聲波模塊用 45 46 47 void timer0()interrupt 1 48 { 49 TH0 = 0; 50 TL0 = 0; 51 } //中斷程序 初始化賦值 從新計數 超聲波模塊用 計算時間 52 void main() 53 { 54 unsigned int time,distance; 55 Trig=0; 56 Echo=0; 57 time_init(); 58 while(1) 59 { 60 Trig=1; 61 Delay_us(5); 62 Trig=0; 63 while(Echo==0); 64 TR0=1; 65 while(Echo); 66 TR0=0; 67 time=TH0*256+TL0; 68 distance=(int)(time*0.017); //計算路程 單位爲cm 69 TH0=0; 70 TL0=0; 71 if(distance<30) //若是距離小於30cm 蜂鳴器響 72 { 73 Start_Buzz(4000); //用於控制蜂鳴器的音高 74 } 75 else 76 { 77 Stop_Buzz(); 78 } 79 } 80 }
才學疏淺 若有不妥歡迎指教 謝謝!code