超聲波模組驅動

2021-09-21 02:14:18 字數 1804 閱讀 1341

思路哈:我打算程式執行一次傳送一次觸發訊號,在程式開頭,就不精確延時幾個指令週期,然後用外部中斷

來個中斷圖

使用中斷0吧

再看看定時器,打算用定時器4(stc創新的,嘿嘿看看靠不靠譜)

我說呢,stc15w4k32s4不是單時鐘週期嗎,定時11.0592m晶振怎麼弄,原來這裡可以控制系統時鐘分頻。

最後採用了乙個非常帥氣的寫法,不用任何中斷,使用邏輯門的思想,讓定時器控制暫存器的gate為1

當中斷和定時器使能同時符合的時候,定時器才開始定時,直接去查詢定時器的th和tl,查完就清空。

但是出了乙個兩小時的bug。。。debug能力不夠強悍

unsigned

int time =0;

unsigned

int distance =0;

// distance = (12 * time/main_fosc)*340/2 * 100

distance = time / main_fosc *

204000

;// 單位cm 《錯

distance =

204000

* time / main_fosc ;

// 單位cm 《對

第乙個錯的原因是,除完得到浮點數,強制型別轉換後得到0,所以最後顯示屏上顯示的結果一直是1。

但是debug又是憑著感覺幹活,還是得理論分析一下,讓每一次bug都有歸屬,下次就能避免或者更快的解決。

1、

實驗現象與期望不符,但是錯誤的實驗現象具有干擾現象。

首先:輸出結果是0,讓人感覺好像超聲波模組沒有工作。

再者:我雖然知道超聲波模組工作起來有聲音,沒想到這麼小,再加上我寫的延時比較長,更聽不見聲音了。

所以,我選擇使用開發板和其配套的實驗,去驗證超聲波模組是否正常。

結果是:正常。

是不是以後使用模組都先試一下模組是否良好,事先排除這種bug的不確定性,我感覺可以有。

2、

最後是怎麼解決的呢?

使用keil的debug檢視暫存器狀態,這個能力需要加強,說實話不怎麼會使,但是發現th1、tl1都不是0x00,說明程式已經按期望執行了。

有乙個自己坑自己的地方是:

unsigned

int distance =

0;

這個初值賦的,太巧合了。。。。。計算的結果也是0,讓人感覺根本沒計算。。。。

// 返回計算的距離

return distance;

return time;

我把return的結果改為time,發現有輸出,最後發現是型別轉換坑了我,不是它坑我,是我經驗不夠進了坑,下次注意。

超聲波模組應用

超聲波原理 超聲波是利用反射的原理測量距離的,被測距離一端為超聲波感測器,另一端必須有能反射超聲波的物體。測量距離時,將超聲波感測器對準反射物發射超聲波,並開始計時,超聲波在空氣中傳播到達障礙物後被反射回來,感測器接收到反射脈衝後立即停止計時,然後根據超聲波的傳播速度和計時時間就能計算出兩端的距離。...

Arduino 超聲波模組

一共有四個腳,分別為vc,trig,echo,gnd,兩邊的兩個為接電源的正負極,中間的兩個乙個傳送乙個接收,可以連線在任意訊號埠是包括1到13口及a0 a5 trig引腳連線a0,echo連線a1 單位 厘公尺 float checkdistance 定義函式 獲得距離 digitalwrite ...

stm32驅動超聲波模組

define hcsr04 port gpiob define hcsr04 clk rcc apb2periph gpiob define hcsr04 trig gpio pin 8 define hcsr04 echo gpio pin 9 define trig send n dowhile...