當前位置:首頁 > 單片機 > 單片機
[導讀] 蜂鳴器是很常見的設備,分為無源和有源兩種。根據項目需求選擇不同類型的蜂鳴器。最近的項目裏有用到有源蜂鳴器對有源蜂鳴器。還是老一套,把電路板畫完,接着編程。在項目中原理圖如下: 如果不能保證I/O的輸出性

 蜂鳴器是很常見的設備,分為無源和有源兩種。根據項目需求選擇不同類型的蜂鳴器。最近的項目裏有用到有源蜂鳴器對有源蜂鳴器。還是老一套,把電路板畫完,接着編程。

在項目中原理圖如下:

1.jpg

如果不能保證I/O的輸出性能可以根據情況增加上拉或者下拉電阻。

切入正題:在程序裏面這個蜂鳴器的驅動就是個高低電平驅動。高電平三極管導通、蜂鳴器發聲,低電平三極管關斷、蜂鳴器不發聲。這的確很簡單,程序上最開始我是這樣寫的:

1.jpg

當然,如果單片機沒有很好的I/O跳變函數也可以這樣修改:

2.jpg

這裏稍作解釋:

1)

函數功能:蜂鳴器發聲驅動

傳入參數:蜂鳴器發聲的次數

2)

傳入的次數cnt需要再函數內翻倍。這是因為傳入的參數是想讓蜂鳴器連續的發cnt聲。但是蜂鳴器除了發聲還有不發聲的時候。也就是説蜂鳴器每響一次都需要關閉一次,如果沒有關閉操作肯定就不會出現響幾聲而是連續的響一聲,這個也很容易推理。

3)

在while循環完之後需要加一個蜂鳴器關閉操作。

這裏假如傳進的參數是2,目的是讓蜂鳴器響兩聲。根據程序的執行步驟:

cnt2變成4。

第1次while(4) 蜂鳴器開 cnt自減到3

第2次while(3) 蜂鳴器關 cnt自減到2

第3次while(2) 蜂鳴器開 cnt自減到1

第4次while(1) 蜂鳴器關 cnt自減到0

第5次while(0) 跳出while

可以看出其實在while之後蜂鳴器狀態已經是關閉的了,但是保險起見,確保函數調用完之後蜂鳴器是關閉的狀態。比如第一個函數I/O跳變的就更需要保障了,因為代碼上只能看出跳變,看不到跳變之後的狀態。

至此,一個簡單的蜂鳴器電路和驅動程序就都温習完了,接下來上乾貨:

在寫程序的時候很多時候講究程序的效率,比如這個蜂鳴器驅動,驅動過程中會降低效率,厲害的人很快能看出來,就是這個Delay延時的問題。但是上面也説了,不延時也是不行的。所以趨於效率我嘗試着換了一種方法驅動蜂鳴器。

代碼如下:

3.jpg

實現起來也很簡單,簡單説下原理:

1)首先是提供蜂鳴器驅動的I/O配置,

2)其次是定時器的配置

3)最後是定時器中斷函數實現

我選用的定時器是項目單片機中最簡單的一個定時器,配製成1ms中斷,能夠提供溢出中斷。其實這個定時器我常用做計系統運行時間Systick_ms。但是該項目對這個系統時間沒有用到,那就用這個定時器做文章把。

實現方法:

1、同樣函數在調用蜂鳴器驅動的時候接口是一樣的,傳入的參數還是蜂鳴器的響聲次數。

2、函數體變了,這裏改成了兩個變量的賦值,第一個BELL_CNT同普通方法中的cnt2,這裏不再贅述。第二個是FLAG_BELL是用來保存蜂鳴器是否需要驅動的狀態變量。所以既然是調用驅動函數,那肯定這個變量要為真。

3、定時器中斷函數裏面加上了一個靜態變量NOW,他的作用就是和Systic_ms產生一個50ms的時間片,幹嘛用?肯定是給蜂鳴器開關之間的延時用咯。模擬軟件延時嘛。然後再來分析下這段代碼:

1)首先這個NOW和Systic_ms是無條件需要賦值保證50ms時間片的。對應的代碼為NOW=Systick_ms+50;

2)判斷蜂鳴器驅動狀態變量是不是真,如果不為真就關閉蜂鳴器,這個也是無條件的。

3)如果狀態變量為真:蜂鳴器先跳變Bell_Tog();當然如果沒有這個跳變函數也可以用上述的判斷cnt的方法,就不多寫了都是一樣的。同時次數自減BELL_CNT--;同時判斷是不是減到0了,減到0了説明響完了啊,那就把狀態變量賦值為假。再次進來不管蜂鳴器是開着的還是關着的都會執行關閉操作,這個跟上面説的保險一樣。

4)最後,這兩個變量用的是全局變量,這裏是以結構體的形式呈現的,因為很多情況這兩個函數不在一個C裏面。如果硬要寫在一個C可以忽略本條。

換一批

延伸閲讀

[嵌入式ARM] 嵌入式工程師超長經驗分享:從單片機coder到嵌入式programer的簡單歷程

C語言到底該怎麼學,單片機coder怎麼才能順利轉型成為嵌入式programer?21ic論壇有一“鎮站之寶”的超長經驗分享貼,特此分享給所有熱愛coding的你。...

關鍵字: C語言 單片機 嵌入式

[21ic電子網] 這樣理解單片機通信時序分析就對了!

大家要善於把手冊中的這個表格和時序圖結合起來看,上面表中的數據都是時序參數,大家務必要學會自己看時序圖,這個很重要。此外,看以下解釋也需要結合時序圖來看。 ...

關鍵字: 時序 單片機

[嵌入式ARM] Boot 引腳引發的血案

血案現場描述: 程序下載到程序之後,沒有正常運行。 懷疑下載過程或者程序出現問題,但是同樣的工具,同樣的程序,下載到另一塊單片機沒有任何問題。 那麼問題出在哪? 方法嘗試: 遇...

關鍵字: 引腳 Boot 單片機

[21ic電子網] 單片機是如何工作的?看完讓你豁然開朗!

一、單片機內部結構分析 我們來思考一個問題,當我們在編程器中把一條指令寫進單片機內部,然後取下單片機,單片機就可以執行這條指令,那麼這條指令一定保存在單片機的某個地方,並且這個地方在單片機掉電後依然可以保持這條指...

關鍵字: 指令 內部結構 單片機

[大魚機器人] 這2個單片機編程的思想,請你掌握。

1. 分層思想 分層的思想,並不是什麼神祕的東西,事實上很多做項目的工程師本身自己也會在用。看了不少帖子都發現沒有提及這個東西,然而分層結構確是很有用的東西,參透後會有一種恍然大悟的...

關鍵字: 編程 分層 單片機

單片機

21439 篇文章

關注

發佈文章
更多

論壇熱帖

關閉