0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在程序里面這個蜂鳴器的驅(qū)動就是個高低電平驅(qū)動

2oON_changxuemc ? 來源:lp ? 2019-04-02 12:40 ? 次閱讀

在項目中原理圖如下:

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

切入正題:在程序里面這個蜂鳴器的驅(qū)動就是個高低電平驅(qū)動。高電平三極管導(dǎo)通、蜂鳴器發(fā)聲,低電平三極管關(guān)斷、蜂鳴器不發(fā)聲。這的確很簡單,程序上最開始我是這樣寫的:

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

這里稍作解釋:

1)

函數(shù)功能:蜂鳴器發(fā)聲驅(qū)動

傳入參數(shù):蜂鳴器發(fā)聲的次數(shù)

2)

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

3)

在while循環(huán)完之后需要加一個蜂鳴器關(guān)閉操作。

這里假如傳進的參數(shù)是2,目的是讓蜂鳴器響兩聲。根據(jù)程序的執(zhí)行步驟:

cnt2變成4。

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

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

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

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

第5次while(0) 跳出while

可以看出其實在while之后蜂鳴器狀態(tài)已經(jīng)是關(guān)閉的了,但是保險起見,確保函數(shù)調(diào)用完之后蜂鳴器是關(guān)閉的狀態(tài)。比如第一個函數(shù)I/O跳變的就更需要保障了,因為代碼上只能看出跳變,看不到跳變之后的狀態(tài)。

至此,一個簡單的蜂鳴器電路和驅(qū)動程序就都溫習(xí)完了,接下來上干貨:

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

代碼如下:

實現(xiàn)起來也很簡單,簡單說下原理:

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

2)其次是定時器的配置

3)最后是定時器中斷函數(shù)實現(xiàn)

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

實現(xiàn)方法:

1、同樣函數(shù)在調(diào)用蜂鳴器驅(qū)動的時候接口是一樣的,傳入的參數(shù)還是蜂鳴器的響聲次數(shù)。

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

3、定時器中斷函數(shù)里面加上了一個靜態(tài)變量NOW,他的作用就是和Systic_ms產(chǎn)生一個50ms的時間片,干嘛用?肯定是給蜂鳴器開關(guān)之間的延時用咯。模擬軟件延時嘛。然后再來分析下這段代碼:

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

2)判斷蜂鳴器驅(qū)動狀態(tài)變量是不是真,如果不為真就關(guān)閉蜂鳴器,這個也是無條件的。

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

4)最后,這兩個變量用的是全局變量,這里是以結(jié)構(gòu)體的形式呈現(xiàn)的,因為很多情況這兩個函數(shù)不在一個C里面。如果硬要寫在一個C可以忽略本條。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 三極管
    +關(guān)注

    關(guān)注

    142

    文章

    3562

    瀏覽量

    120895
  • 單片機
    +關(guān)注

    關(guān)注

    6023

    文章

    44376

    瀏覽量

    628461
  • 蜂鳴器
    +關(guān)注

    關(guān)注

    12

    文章

    887

    瀏覽量

    45691

原文標題:單片機有源蜂鳴器驅(qū)動之效率編程

文章出處:【微信號:changxuemcu,微信公眾號:暢學(xué)單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    ESP32可以直接寫入RX的高低電平,和直接讀取TX的高低電平嗎?

    如果串口的rx和tx的高低電平都是通過代碼得到的狀態(tài),想把這個高低電平的變化解析成串口數(shù)據(jù)流,不占用IO的情況下能否解析出數(shù)據(jù)? 也就是在
    發(fā)表于 06-07 08:20

    高低電平的問題

    最近用單片機C8051F編個小程序,測試端口高低電平,接10K上拉電阻,無外圍元件,軟件置1時,高電平3.3V正確,低電平時有1V不接近于0,這個
    發(fā)表于 07-08 14:55

    蜂鳴器驅(qū)動電路

    單線包驅(qū)動電阻R1采用±1%精度,電容C1采用NPO材質(zhì)±5%精度使用單片機驅(qū)動蜂鳴器電路 蜂鳴器如果是有源的,單片機只要輸出高低電平就可以
    發(fā)表于 11-20 14:33

    單片機蜂鳴器驅(qū)動模塊設(shè)計及程序詳解

    的工作頻率是2000Hz,也就是蜂鳴器驅(qū)動信號波形周期是500μs,由于是1/2duty的信號,所以一周期內(nèi)的高電平
    發(fā)表于 08-29 10:43

    inux驅(qū)動IO輸出高低電平

    晴空霹靂一陣響,我終于鼓起勇氣向linux告白。深思熟慮后編寫此系列文章記錄自己學(xué)習(xí)過程中遇到的問題和今后復(fù)習(xí)所用。 Linux驅(qū)動IO輸出高低電平和單片機類似,也是通過控制寄存器控制高低電平,不過
    發(fā)表于 07-29 09:29

    如何把單片機的高低電平轉(zhuǎn)化成可以驅(qū)動步進電機的高低電平?

    如何把單片機的高低電平轉(zhuǎn)化成可以驅(qū)動步進電機的高低電平?
    發(fā)表于 10-19 09:34

    有效編程單片機有源蜂鳴器驅(qū)動的方法

    性能可以根據(jù)情況增加上拉或者下拉電阻。切入正題:程序里面這個蜂鳴器驅(qū)動
    發(fā)表于 11-24 06:34

    蜂鳴器驅(qū)動原理可以分為哪幾種呢

    貴,因為里面多了震蕩電路。外形上有源蜂鳴器一般高度位9mm,無源8mm。有源蜂鳴器,使用程序控制方便。使用3.3v
    發(fā)表于 01-13 06:30

    如何用LPC2114的一引腳輸出高低電平控制蜂鳴器間歇鳴叫

    一:系統(tǒng)功能:用LPC2114的一引腳輸出高低電平,控制蜂鳴器間歇鳴叫二:硬件原理( 1)用LPC2114的一引腳P0. 7控制晶體管Q1的基極,周期性輸出
    發(fā)表于 02-07 07:35

    驅(qū)動高低電平指示燈的窗口比較器電路圖

    驅(qū)動高低電平指示燈的窗口比較器電路圖
    發(fā)表于 03-25 08:50 ?3070次閱讀
    <b class='flag-5'>驅(qū)動</b><b class='flag-5'>高低電平</b>指示燈的窗口比較器電路圖

    有源蜂鳴器電路圖驅(qū)動蜂鳴器代碼編程-臻美智能電子

    正題:程序里面這個蜂鳴器驅(qū)動就是
    發(fā)表于 11-25 21:55 ?8200次閱讀
    有源<b class='flag-5'>蜂鳴器</b>電路圖<b class='flag-5'>驅(qū)動</b>與<b class='flag-5'>蜂鳴器</b>代碼編程-臻美智能電子

    傳感器是直接返回一值嗎?還是只是高低電平

    傳感器是直接返回一值嗎?還是只是高低電平 傳感器是直接返回一值嗎?還是只是高低電平比如說MQ-2-135-3-7-9煙霧空氣敏灑精氫一氧化碳可燃液化傳感器模塊探頭 下面是他的
    發(fā)表于 03-18 14:18 ?1924次閱讀
    傳感器是直接返回一<b class='flag-5'>個</b>值嗎?還是只是<b class='flag-5'>高低電平</b>

    單片機如何關(guān)掉蜂鳴器_如何有效編程單片機有源蜂鳴器驅(qū)動

    性能可以根據(jù)情況增加上拉或者下拉電阻。切入正題:程序里面這個蜂鳴器驅(qū)動
    發(fā)表于 11-16 14:51 ?6次下載
    單片機如何關(guān)掉<b class='flag-5'>蜂鳴器</b>_如何有效編程單片機有源<b class='flag-5'>蜂鳴器</b><b class='flag-5'>驅(qū)動</b>

    使用光耦給高低電平轉(zhuǎn)化

    在數(shù)字電子技術(shù)中我們會經(jīng)常進行高低電平之間的轉(zhuǎn)化,比如說一模塊接收到信號的時候輸出高電平,而另一元件是
    的頭像 發(fā)表于 12-12 09:12 ?8585次閱讀

    蜂鳴器驅(qū)動實驗

    驅(qū)動蜂鳴器與雞翅LED是一樣的,對于`I.MX6ULL`來說只需要對指定的引腳輸出高或者低電平即可。
    的頭像 發(fā)表于 03-02 16:26 ?1124次閱讀
    <b class='flag-5'>蜂鳴器</b>的<b class='flag-5'>驅(qū)動</b>實驗