單片機(jī)有源蜂鳴器驅(qū)動(dòng)之效率編程
發(fā)布時(shí)間:2020-12-28 11:21:21 點(diǎn)擊次數(shù):376
蜂鳴器是十分常見(jiàn)的裝置,分成無(wú)源和有源,根據(jù)項(xiàng)目需要選項(xiàng)不同種類的蜂鳴器,在最近的項(xiàng)目中很有用有源蜂鳴器對(duì)有源蜂鳴器,它依然是舊的,完成繪圖電路板然后編程。
該項(xiàng)目示意圖如下:
1.jpg
如果不能確保I/O的輸出性能,則可以根據(jù)狀況添加上拉或下拉電阻。
讓我們指出一點(diǎn):程序中的蜂鳴器驅(qū)動(dòng)器是高電平和低電平驅(qū)動(dòng)器,高電平晶體管開(kāi)啟,蜂鳴器發(fā)出聲音,低電平晶體管關(guān)閉,蜂鳴器從未聲音。這真的很簡(jiǎn)單,我在程序的開(kāi)頭寫(xiě)了這個(gè):
1.jpg
當(dāng)然,如果微控制器的I/O跳變函數(shù)不好,也可以這樣改動(dòng)它:
2.jpg
這里有一些解釋:
1)
功能功能:蜂鳴器聲驅(qū)
傳入?yún)?shù):蜂鳴器聲音時(shí)間
2)
函數(shù)中傳入的cnt的數(shù)目需要加倍,這是因?yàn)閭魅氲膮?shù)是蜂鳴器連續(xù)發(fā)聲的,但是當(dāng)蜂鳴器不發(fā)聲時(shí),它也不會(huì)發(fā)聲。蜂鳴器每次響起時(shí)都需要關(guān)閉。如果從未關(guān)閉操作,將不會(huì)發(fā)出聲音,只有連續(xù)的聲音。這也很容易推測(cè)。
3)
while循環(huán)終止后,需要添加蜂鳴器以關(guān)閉操作。
如果此處傳送的參數(shù)為2,目的是使蜂鳴器響兩次,根據(jù)程序的執(zhí)行步驟:
cnt2變?yōu)?。
第一次while(4)蜂鳴器開(kāi)cnt自減到3
while(3)蜂鳴器關(guān)cnt第二次減少為2
第三次while(2)蜂鳴器開(kāi)cnt自減到1
第四while(1)蜂鳴器關(guān)cnt減少為0
第5while(0)跳出
可以見(jiàn)到while之后早就關(guān)閉了蜂鳴器狀況,但是為了安全起見(jiàn),請(qǐng)保證在調(diào)用該函數(shù)后關(guān)閉了蜂鳴器,例如第一個(gè)函數(shù)I/Ojumping需要受到更多保護(hù),因?yàn)榇a只能見(jiàn)到跳轉(zhuǎn),而跳轉(zhuǎn)后的狀況則看不到。
至此,對(duì)簡(jiǎn)單的蜂鳴器電路和驅(qū)動(dòng)器開(kāi)展了審查,然后對(duì)干貨展開(kāi)了審查:
在編撰程序時(shí),很多時(shí)候都在關(guān)心程序的效率,例如蜂鳴器驅(qū)動(dòng)程序,在驅(qū)動(dòng)過(guò)程中效率會(huì)減低,有能力的人迅速就會(huì)發(fā)現(xiàn)這是Delay延遲疑問(wèn)。前面提到過(guò),它不會(huì)隨即工作,因此它往往會(huì)更高效,我嘗試了一種不同的方法來(lái)驅(qū)動(dòng)蜂鳴器。
代碼顯示如下:
3.jpg
它的實(shí)現(xiàn)也十分簡(jiǎn)單,只需簡(jiǎn)短說(shuō)明一下法則即可:
1)首先是提供蜂鳴器驅(qū)動(dòng)的I/O配置,
2)接下來(lái)是定時(shí)器的配置
3)最終,定時(shí)器interrupt函數(shù)實(shí)現(xiàn)
我選取的定時(shí)器是項(xiàng)目微控制器中最簡(jiǎn)單的定時(shí)器。它被配置為1ms中斷并可以提供溢出中斷。其實(shí),此定時(shí)器i一般而言會(huì)測(cè)算系統(tǒng)運(yùn)行時(shí)間Systick_ms。,但是項(xiàng)目不使用系統(tǒng)時(shí)間,請(qǐng)使用此定時(shí)器做文章。
實(shí)現(xiàn)方法:
1.調(diào)用蜂鳴器驅(qū)動(dòng)程序時(shí),同一功能的界面相同,輸入?yún)?shù)依然是蜂鳴器的聲音數(shù)目。
2.函數(shù)體已改動(dòng),這是兩個(gè)變量的賦值,第一個(gè)BELL_@CNT在一般而言方法中與cnt2相同,因此在此不再贅述。第二個(gè)是FLAG_BELL是用以保存是否需要驅(qū)動(dòng)蜂鳴器的狀況變量,因此由于它正在調(diào)用驅(qū)動(dòng)程序函數(shù),因此此變量須要為true。
3.定時(shí)器靜態(tài)變量被添加到NOW中斷功能。他的效用是通過(guò)Systic_ms生成一個(gè)50ms的時(shí)間片。為什么使用它?須要是蜂鳴器開(kāi)關(guān)的時(shí)間延遲。模擬軟件延遲。然后讓我們分析一下這段代碼:
1)首先,需要無(wú)條件分派NOW和Systic_@ms以保證50ms的時(shí)間片,相應(yīng)的代碼為NOW=Systick_ms+50;
2)判斷蜂鳴器是否驅(qū)動(dòng)狀況變量,如果不正確,請(qǐng)關(guān)閉蜂鳴器,這也是無(wú)條件的。
3)如果狀況變量為真:蜂鳴器先跳變Bell_Tog();當(dāng)然,如果從未此跳轉(zhuǎn)功能,也可以使用上面的cnt判斷方法,不寫(xiě)多寫(xiě)也是一樣,同時(shí)@nz的次數(shù)減少@_cnt--;同時(shí)判斷是否減為0。如果減為0,則表示聲音早已終結(jié),則將狀況變量賦值為false。再度進(jìn)入時(shí),無(wú)論蜂鳴器是否在開(kāi)啟或關(guān)閉,它將關(guān)閉。這與上述保險(xiǎn)相同。
4)最終,這兩個(gè)變量是全局變量,此處以構(gòu)造形式表示,因?yàn)樵诤芏酄顩r下這兩個(gè)函數(shù)不在同一個(gè)c中。如果您堅(jiān)持用c編纂,則可以忽視本文。