




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、5.10 蜂鳴器和音樂發生器任務5.10 蜂鳴器的原理和驅動5.9.1 任務介紹在實際應用中,經常利用利用單片機控制蜂鳴器產生各種音樂用于報警和提示,如手機的鈴聲、時鐘的音樂報時和按鍵提示音等。本節的任務是:通過單片機I/O控制開發板上的蜂鳴器演奏音樂。5.9.2 知識準備1、 蜂鳴器的原理和分類蜂鳴器按結構分有壓電式蜂鳴器和電磁式蜂鳴器兩種類型。壓電蜂鳴器內部有壓電陶瓷和金屬片,是利用壓電陶瓷的壓電效應,帶動金屬片的振動來發聲,頻率在1KHz10KHz。電磁式蜂鳴器內部有磁鐵和線圈,振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發聲,頻率在0.5KHz5KHz。壓電蜂鳴器結構簡單耐用,聲
2、音大,多用于報警器等設備。電磁蜂鳴器音色好,多用于語音、音樂等設備。蜂鳴器按其是否帶有振蕩器又分為有源和無源兩種類型。有源蜂鳴器內部帶有振蕩器,只需要在其供電端加上額定直流電壓,其內部的振蕩器就可以產生固定頻率的信號,驅動蜂鳴器發出聲音。無源蜂鳴器內部沒有振蕩器,需要在其供電端上加上高低不斷變化的電信號才可以驅動發出聲音。開發板上的蜂鳴器屬于電磁式無源蜂鳴器。2、 開發板蜂鳴器驅動電路開發板蜂鳴器驅動電路如圖5.10.1所示。5.10.1 開發板蜂鳴器驅動電路蜂鳴器的驅動和繼電器相似,需要幾十mA的電流,通常借助于三極管來作為中間功率驅動。圖5.10.1中,蜂鳴器接在PNP三極管(8550)的
3、集電極上,單片機I/O接三極管的基極,電阻R10是三極管基極限流電阻,電阻R11是上拉電阻。蜂鳴器內部線圈是感性器件,二極管D10并聯在蜂鳴器兩端,起到限制反峰電壓的作用。3、無源蜂鳴器的程序驅動無源蜂鳴器本身不帶振蕩器,只有讓蜂鳴器不停的處于“通電-斷電”的狀態,才能發出聲音。對于開發板上蜂鳴器驅動電路而言,只需要讓控制蜂鳴器的I/O口不停的“置1-置0”就可以了。下面是利用51單片機P.20驅動蜂鳴器的程序。#incldue#define uchar unsigned char#define uint unsigend intsbit Buzzer=P20; /蜂鳴器接口定義#define
4、 BuzzerOn Buzzer=0#define BuzzerOff Buzzer=1 /ms級延時函數void DelayMs(uint xms) uint i,j; for(i=0;ixms;i+) for(j=0;j122;j+);/主函數void main() while(1) BuzzerOn; DelayMs(1); BuzzerOff DelayMs(1); 在程序中,1ms讓蜂鳴器通電,1ms讓蜂鳴器斷電,頻率500Hz。程序編譯下載后,蜂鳴器引腳控制端接P2.0引腳,蜂鳴器發出“嗡嗡”的聲音。然后在把延時改為2ms、3ms、5ms,蜂鳴器會發出不同頻響的聲音。4、蜂鳴器程序
5、改造和按鍵提示音利用延時函數來驅動蜂鳴器顯然不是個好的辦法,下面的程序通過定時器驅動蜂鳴器,開發板上2個獨立按鍵,每個按鍵按下時,蜂鳴器響一聲,持續時間為0.3秒。2個按鍵對應的頻率分別為500Hz和1KHz。要求程序不堵塞CPU,效率高。(1) 工程結構和主函數工程結構圖如圖5.10.2所示。除了主函數外,還有按鍵模塊、定時器模塊和鍵值處理模塊。 圖5.10.2 工程結構圖主函數如下:#include#includeMicroDefine.h#includeTimer.h#includeIndependentKey.h#includeKeyProcess.h /*函數名稱:main()*功能
6、 :主函數*入口參數:無*出口參數:無*說明 :按鍵被按下時,蜂鳴器產生0.5S提示音。 按鍵A提示音頻率:500Hz 按鍵B提示音頻率:1KHz */void main() uchar KeyValue=0; DelayMs(200); TimerInit(); /定時器初始化 while(1) if(FlagSystem1Ms=1) /1ms時標信號 FlagSystem1Ms=0; KeyValue=KeyGetValue(); /獲取鍵值 KeySound(KeyValue); /鍵值處理 程序解釋:主函數內容簡單,獲取按鍵鍵值,并處理鍵值。(2) 其它功能模塊 定時器模塊(Timer
7、.c,Timer.h不列出)#includeTimer.hbit FlagSystem1Ms=0; /1m時標信號uchar T1High=0; /T0高8位uchar T1Low=0; /T1低8位/*函數名稱:TimerInit()*功能 :定時器初始化*入口參數:無*出口參數:無*說明 :定時器0:產生1ms時標信號,方式2 定時器1:驅動蜂鳴器,方式1*/void TimerInit() TMOD=0x12; TH0=TL0=56; TH1=TL1=0; TR0=1; /只開定時器0,定時器1的開啟由按鍵決定ET0=ET1=1; EA=1;TR0=1; /開定時器0,TR1=0; /定
8、時器1關閉 ,按鍵按下,才能開定時器1/*函數名稱:Timer0Isr()*功能 :定時器0中斷服務函數*入口參數:無*出口參數:無*說明 :*/void Timer0Isr() interrupt 1 static uchar Cnt200us=0; if(+Cnt200us=299) Cnt1Ms=0; TR1=0; /關閉定時器,蜂鳴器不響 SoundState=0; /跳轉到狀態0 程序解釋:KeySound()由狀態機構成,分成兩個狀態。狀態0:檢測到按鍵被按下,根據按鍵值,給定時器賦初值,并啟動定時器。狀態1:延時299ms后,關閉定時器1,并返回到狀態0。利用狀態機構成按鍵提示音
9、函數,不堵塞CPU,系統效率高。5.9.3 任務實施1、 音符和頻率的關系通過以上知識的學習,初學者了解到蜂鳴器發聲的原理,即通過I/O口輸出脈沖信號,再將信號通過三極管放大,推動發聲器件(蜂鳴器)發聲。脈沖信號的頻率不同,蜂鳴器發出的聲音不同。要完成本節的音樂播放器,需弄清楚兩個概念即可,也就是“音符”和“節拍”。音符其實就是我們常說的“Do Re Mi Fa Sol La Si Do”,每一個音符對應一定的頻率。以中音“1”為例,其頻率為523Hz,周期為1秒/523=1912us,半周期為956us。通常沒有做特殊說明,我們把音樂的一個節拍的時間長度定位0.4秒,1/4節拍的時間則為0.
10、1秒。如果以1/4節拍為基準長度,則1拍為4個基準長度,1/2拍為2個基準長度。定時器要產生中音“1”對應的頻率(523Hz),則定時器每次溢出的時間為半個周期(即956us)。假設中音“1”的時間長度為1/4拍,則定時器溢出的次數為0.1秒/956us=105次。1/2拍和1拍對應的溢出次數分別105次*2和105次*4。為了程序的方便,我們把低音音符(“5 ”“7”)、中音音符(“1”“7”)和高音音符(“ ”“”)的頻率、半周期及1/4節拍內半周期數放在表5.10.1中。表5.10.1 14個音符頻率對應表數組下標音符頻率(Hz)周期(us)半周期(us)1/4節拍(0.1S)內半周期數
11、的個數053922551127678164402273113688274942024101299315231912956105425871074851117536591517758132646981436716140757831277638157868801136568176979881012506198101046956478209111175851425235121318759379264根據表5.10,我們先構建兩個數組,分別存放以上音符的半周期時間和1/4拍內半周期的個數。/13個音符的半周期長度uchar code TableNoteTime=1276,1136,1012,956,8
12、51,758,716,638,568,506,478,425,379;/13個音符1/4拍內半周期的個數uchar code TableNoteNum=78,88,99,105,117,132,140,157,176,198,209,235,264;圖5.10.3是兒童歌曲“兩支老虎”的簡譜。 圖5.10.3 “兩只老虎”簡譜根據簡譜,我們把簡譜中對應的音符和其拍數再分別放到數組中。需要說明的是,該數組元素和簡譜中音符的對應關系,例如音符“1”,在數組TableNoteTime中是第4個元素,所以在音樂簡譜數組中應寫為“3”。拍數以1/4拍為基本單位,拍數數組中元素的“1”、“2”和“4”分別
13、對應音符的1/4拍、1/2拍和1拍。/簡譜中對應的音符uchar code TableMusicNote=3,4,5,3,3,4,5,3,5,6,7,5,6,7,7,8,7,6,5,3,7,8,7,6,5,3,4,0,3,4,0,3;/簡譜中音符對應的拍數uchar code TalbeMusicBeat=2,2,2,2,2,2,2,2,2,2,4,2,2,4,1,1,1,1,2,2,1,1,1,1,2,2,2,2,4,2,2,4;有了這4個數組,音樂播報就變得簡單了。根據TableMusicNote數組中的值,從TableNoteTime數組中找到待播放音符的半周期長度,將半周期長度作為定時
14、器的溢出值,啟動定時器,蜂鳴器就會產生該音符。在播報音符的同時,根據TableMusicNote數組中的值,從TableNoteNum數組中找到該音符所對應的1/4拍內半周期的個數,然后再從TalbeMusicBeat數組中,找到該音符在簡譜中的拍數,兩者相乘,即為定時器產生該音符所對應頻率的時間長度。播報完了第一個音符,然后再播報第二個音符.直到最后一個音符,一首曲子就播放完了。2、 程序實現(1) 工程架構和主函數程序的工程架構如圖5.10.4所示。除了主函數模塊,至于鍵值獲取模塊和定時器模塊。音樂播放放在定時器模塊中完成。圖5.10。4 工程結構圖主函數如下:#include#inclu
15、de MicroDefine.h#include Timer.h#include IndependentKey.h/*函數名稱:main()*功能 :主函數*入口參數:無*出口參數:無*說明 : */void main() uchar KeyValue=0; uchar Cnt1Ms=0; DelayMs(200); TimerInit(); /定時器初始化 while(1) if(FlagSystem1Ms=1) /1ms時標信號到 FlagSystem1Ms=0; if(+Cnt1Ms=10) /10ms時標信號到 Cnt1Ms=0; KeyValue=KeyGetValue(); /獲取
16、按鍵值 if(KeyValue=0x81) if(FlagMusicEnd=0) /上一次播放完畢,則啟動新的播放 TR1=1; /啟動定時器 FlagMusicEnd=1; /音樂播放中 程序解釋:在主程序中檢測按鍵按下,則啟動定時器1,并把音樂結束標志位置1。(2) 其它功能模塊 鍵值處理模塊(省略) 定時器模塊Timer.h:#ifndef _TIMER_H_#define _TIMER_H_#include#includeMicroDefine.hsbit Buzzer=P20;#define MusicPlaySpeed 20 /音樂播放速度宏定義/變量聲明extern bit Fl
17、agSystem1Ms; /1m時標信號extern bit FlagMusicEnd; /音樂播放結束標志位/定時器聲明extern void TimerInit(); /定時器初始化#endifTimer.c:#includeTimer.hbit FlagSystem1Ms=0; /1m時標信號bit FlagMusicEnd=0; /音樂播放結束標志位 /13個音符的半周期長度uint code TableNoteTime=1276,1136,1012,956,851,758, 716,638,568,506,478,425,379;/13個音符對應的1/4拍內半周期的個數uint co
18、de TableNoteNum=78,88,99,105,117,132,140,157, 176,198,209,235,264;/簡譜中對應的音符uchar code TableMusicNote=3,4,5,3,3,4,5,3,5,6,7,5,6,7,7,8, 7,6,5,3,7,8,7,6,5,3,4,0,3,4,0,3;/簡譜中音符對應的拍數uchar code TalbeMusicBeat=2,2,2,2,2,2,2,2,2,2,4,2,2,4,1,1, 1,1,2,2,1,1,1,1,2,2,2,2,4,2,2,4;/*函數名稱:TimerInit()*功能 :定時器初始化*入口
19、參數:無*出口參數:無*說明 :定時器0:產生1ms時標信號,方式2 定時器1:驅動蜂鳴器, 方式1*/void TimerInit() TMOD=0x12; TH0=TL0=56; TH1=TL1=0xFF; ET0=ET1=1; EA=1; TR0=1; /只開定時器0,定時器1的開啟由按鍵決定/*函數名稱:Timer0Isr()*功能 :定時器0中斷服務函數*入口參數:無*出口參數:無*說明 :*/void Timer0Isr() interrupt 1 static uchar Cnt200us=0; if(+Cnt200us=5) /產生1ms時標信號 Cnt200us=0; Fla
20、gSystem1Ms=1; /*函數名稱:Timer1Isr()*功能 :定時器1中斷服務函數*入口參數:無*出口參數:無*說明 :通過改變定時器的初裝值,產生不同頻率的蜂鳴器驅動信號 MusicPlaySpeed是頭文件中宏定義,決定音樂的播放速度,其值不能小于10*/void Timer1Isr() interrupt 3 static uchar NoteCnt=0; /播放音符計數器 static uint HalfPeriodCnt=0; /半周期計數器 uint Timer1Temp=0; /定時器長度暫存值 /根據當前播放音符,計算出對應的定時器初值 Timer1Temp=655
21、36-TableNoteTimeTableMusicNoteNoteCnt; TH1=Timer1Temp/256; TL1=Timer1Temp%256; Buzzer=!Buzzer; /播放一個音符的時間到 if(+HalfPeriodCnt=(TableNoteNumTableMusicNoteNoteCnt *TalbeMusicBeatNoteCnt)*MusicPlaySpeed/10) HalfPeriodCnt=0; /簡譜中的音符全部播放完 if(+NoteCnt=32) NoteCnt=0; TR1=0; /定時器停止 FlagMusicEnd=0; /音樂播放結束結束標志位清零 程序解釋:程序中使用了兩個定時器,和之前按鍵音一樣,一個用來產生系統時標信號,另外一個用于用于驅動蜂鳴器。按鍵啟動定時器1,定時器1溢出后,從播報的第一音符起,取出該音符半周期時間長度,計算出定時器1的初值,讓定時器1輸出該音符對應的脈沖波。定時器1每溢出1次,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年木容器項目規劃申請報告
- 2025年會計職稱考試《初級會計實務》財務報表編制考試大綱知識點專項試題
- 傳媒行業實習表現證明(5篇)
- 房地產營銷戰略合作協議合同
- 我的老師真偉大寫人類事件(8篇)
- 軟件開發定制合同協議文檔
- 2025年電梯安裝維修人員考試試卷:電梯維修安全管理試題
- 2025年車工職業技能鑒定試卷:車工機械設計可持續發展試題
- 動物世界中的友誼寫物童話(7篇)
- 項目技術研發戰略合作協議
- DB34∕T 1555-2011 存量房交易計稅價格評估技術規范
- 青少年無人機課程:第一課-馬上起飛
- 桂科版八年級下冊信息技術 1.1規劃網站 教學設計
- 民辦學校托管合同范本
- 風扇合同范本
- GB/T 44325-2024工業循環冷卻水零排污技術規范
- 2024中國城市道路交叉口效能報告
- 質子交換膜水電解制氫陽極催化劑 測試方法
- 自來水有限公司2023-2024年度小口徑水表(新裝)采購項目招標文件
- 成人鼻腸管的留置與維護(2021團體標準解讀)-20221004172843
- 薪酬管理(人大蘇中興老師課件)
評論
0/150
提交評論