任務5.10蜂鳴器和音樂發(fā)生器.._第1頁
任務5.10蜂鳴器和音樂發(fā)生器.._第2頁
免費預覽已結(jié)束,剩余12頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、5.10蜂鳴器和音樂發(fā)生器-1 -任務 5.10 蜂鳴器的原理和驅(qū)動5.9.1 任務介紹在實際應用中,經(jīng)常利用利用單片機控制蜂鳴器產(chǎn)生各種音樂用于報警和提示,如手機 的鈴聲、時鐘的音樂報時和按鍵提示音等。本節(jié)的任務是:通過單片機I/O控制開發(fā)板上的蜂鳴器演奏音樂。5.9.2 知識準備1、蜂鳴器的原理和分類蜂鳴器按結(jié)構(gòu)分有壓電式蜂鳴器和電磁式蜂鳴器兩種類型。壓電蜂鳴器內(nèi)部有壓電陶瓷和金屬片,是利用壓電陶瓷的壓電效應,帶動金屬片的振動來發(fā)聲,頻率在1KHz10KHN電磁式蜂鳴器內(nèi)部有磁鐵和線圈, 振動膜片在電磁線圈和磁鐵的相互作用下, 周期性地振動發(fā) 聲, 頻率在0.5KHz5KHzo壓電蜂鳴器結(jié)

2、構(gòu)簡單耐用,聲音大,多用于報警器等設備。電磁 蜂鳴器音色好,多用于語音、音樂等設備。蜂鳴器按其是否帶有振蕩器又分為有源和無源兩種類型。有源蜂鳴器內(nèi)部帶有振蕩器, 只需要在其供電端加上額定直流電壓,其內(nèi)部的振蕩器就可以產(chǎn)生固定頻率的信號,驅(qū)動蜂 鳴器發(fā)出聲音。無源蜂鳴器內(nèi)部沒有振蕩器,需要在其供電端上加上高低不斷變化的電信號 才可以驅(qū)動發(fā)出聲音。開發(fā)板上的蜂鳴器屬于電磁式無源蜂鳴器。2、開發(fā)板蜂鳴器驅(qū)動電路開發(fā)板蜂鳴器驅(qū)動電路如圖5.10.1所示。5.10.1開發(fā)板蜂鳴器驅(qū)動電路5.10蜂鳴器和音樂發(fā)生器-2 -蜂鳴器的驅(qū)動和繼電器相似,需要幾十mA的電流,通常借助于三極管來作為中間功率驅(qū)動。圖

3、5.10.1中,蜂鳴器接在PNP三極管(8550)的集電極上,單片機I/O接三極管的基極, 電阻R10是三極管基極限流電阻,電阻R11是上拉電阻。蜂鳴器內(nèi)部線圈是感性器件,二極管D10并聯(lián)在蜂鳴器兩端,起到限制反峰電壓的作用。3、無源蜂鳴器的程序驅(qū)動無源蜂鳴器本身不帶振蕩器,只有讓蜂鳴器不停的處于“通電 聲音。對于開發(fā)板上蜂鳴器驅(qū)動電路而言,只需要讓控制蜂鳴器的 就可以了。下面是利用51單片機P.20驅(qū)動蜂鳴器的程序。#in cldue#defi ne uchar un sig ned char#defi ne uint un sige nd intsbit Buzzer=P2A0;/蜂鳴器接

4、口定義#defi ne BuzzerO n Buzzer=0#defi ne BuzzerOff Buzzer=1/ms級延時函數(shù)void DelayMs( uint xms)uint i,j;for(i=0;ixms;i+)for(j=0;j122;j+);/主函數(shù)void mai n()while(1)BuzzerO n;DelayMs(1);BuzzerOffDelayMs(1);-斷電”的狀態(tài),才能發(fā)出I/O口不停的“置1-置0”5.10蜂鳴器和音樂發(fā)生器-3 -在程序中,1ms讓蜂鳴器通電,1ms讓蜂鳴器斷電,頻率500Hz。程序編譯下載后,蜂鳴 器引腳控制端接P2.0引腳,蜂鳴器發(fā)

5、出“嗡嗡”的聲音。然后在把延時改為2ms、3ms、5ms,蜂鳴器會發(fā)出不同頻響的聲音。4、蜂鳴器程序改造和按鍵提示音利用延時函數(shù)來驅(qū)動蜂鳴器顯然不是個好的辦法,下面的程序通過定時器驅(qū)動蜂鳴器,開發(fā)板上2個獨立按鍵,每個按鍵按下時,蜂鳴器響一聲,持續(xù)時間為0.3秒。2個按鍵對應的頻率分別為500Hz和IKHzo要求程序不堵塞CPU效率高。(1)工程結(jié)構(gòu)和主函數(shù)工程結(jié)構(gòu)圖如圖5.10.2所示。除了主函數(shù)外,還有按鍵模塊、定時器模塊和鍵值處理模 塊。- :J Target 1包巳User匡main.c=1 S Hardware爭圍IndepencentKmy.c MicroDefine.cE-ffi

6、 KeyProcesscE- E Timer, c圖5.10.2工程結(jié)構(gòu)圖主函數(shù)如下:#in clude#i ncludeMicroDefi ne.h#i ncludeTimer.h#in cludeI ndepe nden tKey.h#in cludeKeyProcess.h/*函數(shù)名稱:mai n()*功能 :主函數(shù)*入口參數(shù):無*出口參數(shù):無*說明 :按鍵被按下時,蜂鳴器產(chǎn)生0.5S提示音。按鍵A提示音頻率:500Hz按鍵B提示音頻率:1KHz*/5.10蜂鳴器和音樂發(fā)生器-4 -void mai n()uchar KeyValue=O;DelayMs(200);TimerI nit(

7、);/定時器初始化while(1)if(FlagSystem1Ms=1) /1ms時標信號FlagSystem1Ms=0;KeyValue=KeyGetValue(); /獲取鍵值KeySou nd(KeyValue); /鍵值處理程序解釋:主函數(shù)內(nèi)容簡單,獲取按鍵鍵值,并處理鍵值。(2)其它功能模塊定時器模塊(Timer.c,Timer.h不列出)#in cludeTimer.hbit FlagSystem1Ms=0;/1m時標信號uchar T1High=0;T0高8位uchar T1Low=0;/T1低8位/*函數(shù)名稱:TimerI nit()*功能 :定時器初始化*入口參數(shù):無*出口參

8、數(shù):無*說明 :定時器0:產(chǎn)生1ms時標信號,方式2定時器1:驅(qū)動蜂鳴器,方式1*/ void TimerI ni t()TMOD=0 x12;TH0=TL0=56;TH1=TL1=0;ETO=ET 1=1;5.10蜂鳴器和音樂發(fā)生器-5 -EA=1;TR0=1;/開定時器0,TR1=0/定時器1關(guān)閉,按鍵按下,才能開定時器1/*函數(shù)名稱:TimerOlsr()*功能 :定時器0中斷服務函數(shù)*入口參數(shù):無*出口參數(shù):無*說明 :*/void Timer0Isr() in terrupt 1static uchar Cn t200us=0;if(+C nt200us=299)Cn t1Ms=0;

9、TR1=0;/Sou ndState=O;/程序解釋:KeySound()由狀態(tài)機構(gòu)成,分成兩個狀態(tài)。狀態(tài)0:檢測到按鍵被按下,根據(jù)按鍵值,給定時器賦初值,并啟動定時器。狀態(tài)1:延時299ms后,關(guān)閉定時器1,并返回到狀態(tài)0。利用狀態(tài)機構(gòu)成按鍵提示音函數(shù),不堵塞CPU系統(tǒng)效率高。5.9.3 任務實施1、音符和頻率的關(guān)系通過以上知識的學習,初學者了解到蜂鳴器發(fā)聲的原理,即通過I/O口輸出脈沖信號,再將信號通過三極管放大,推動發(fā)聲器件(蜂鳴器)發(fā)聲。脈沖信號的頻率不同,蜂鳴器發(fā) 出的聲音不同。要完成本節(jié)的音樂播放器,需弄清楚兩個概念即可,也就是“音符”和“節(jié) 拍”。音符其實就是我們常說的“Do R

10、e Mi Fa Sol La Si Do”,每一個音符對應一定的頻率。 以中音“1”為例,其頻率為523Hz,周期為1秒/523=1912us,半周期為956us。通常沒有做特殊說明,我們把音樂的一個節(jié)拍的時間長度定位0.4秒,1/4節(jié)拍的時間則為0.1秒。如果以1/4節(jié)拍為基準長度,則1拍為4個基準長度,1/2拍為2個基準長度。定時器要產(chǎn)生中音“1”對應的頻率(523Hz),則定時器每次溢出的時間為半個周期(即956us)。假設中音“1”的時間長度為1/4拍,則定時器溢出的次數(shù)為0.1秒/956us=105次。1/2拍和1拍對應的溢出次數(shù)分別105次*2和105次*4。狀態(tài)1:延時299ms

11、,關(guān)閉蜂鳴器關(guān)閉定時器,蜂鳴器不響 跳轉(zhuǎn)到狀態(tài)05.10蜂鳴器和音樂發(fā)生器-8 -為了程序的方便,我們把低音音符(“5”“7”)、中音音符(“1”“7”)和高音音符(“1”“3”)的頻率、半周期及1/4節(jié)拍內(nèi)半周期數(shù)放在表5.10.1中。表5.10.1 14個音符頻率對應表數(shù)組下標音符頻率(Hz)周期(us)半周期(us)1/4節(jié)拍(0.1S)內(nèi)半周期數(shù)的個數(shù)05392255112767816440227311368827494202410129931523191295610542587107485111753659151775813264698143671614075783127763815

12、7868801136568176979881012506198101104695647820911211758514252351231318759379264根據(jù)表5.10,我們先構(gòu)建兩個數(shù)組,分別存放以上音符的半周期時間和1/4拍內(nèi)半周期的個數(shù)。13個音符的半周期長度uchar code TableNoteTime=1276,1136,1012,956,851,758,716,638,568,506,478,425,379;13個音符1/4拍內(nèi)半周期的個數(shù)uchar code TableNoteNum=78,88,99,105,117,132,140,157,176,198,209,235,

13、264;圖5.10.3是兒童歌曲“兩支老虎”的簡譜。125 1 I 23 1 I 345|34兩只總虎,兩只寵虎 跑彳鼻t*,跑帝54 11 I 2_5 1 I 1 IV一只沒克用巴H奇慢ITS性.幔,一只沒育庫巴.5.10蜂鳴器和音樂發(fā)生器-9 -根據(jù)簡譜,我們把簡譜中對應的音符和其拍數(shù)再分別放到數(shù)組中。需要說明的是,該數(shù) 組元素和簡譜中音符的對應關(guān)系,例如音符1”,在數(shù)組TableNoteTime中是第4個元素,所以在音樂簡譜數(shù)組中應寫為“3”。拍數(shù)以1/4拍為基本單位,拍數(shù)數(shù)組中元素的“1”、“2”和“4”分別對應音符的1/4拍、1/2拍和1拍。/簡譜中對應的音符uchar code T

14、ableMusicNote=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;/簡譜中音符對應的拍數(shù)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個數(shù)組,音樂播報就變得簡單了。根據(jù)TableMusicNote數(shù)組中的值,從TableNoteTime數(shù)組中找到待播放音符的半周期長度,將半周期長度作為定時器的溢出值,啟動定時器,蜂鳴器就會產(chǎn)生該音符。在播報音符的同時,根據(jù)Table

15、MusicNote數(shù)組中的值,從TableNoteNum數(shù)組中找到該音符所對應的1/4拍內(nèi)半周期的個數(shù),然后再從TalbeMusicBeat數(shù)組中,找到該音符在簡譜中的拍數(shù),兩者相乘,即為定時器產(chǎn)生該音符所對應頻率的時間長度。播報完了第一個音符,然后再播報第二個音符 直到最后一個音符,一首曲子就播放完了。2、程序?qū)崿F(xiàn)(1)工程架構(gòu)和主函數(shù)程序的工程架構(gòu)如圖5.10.4所示。除了主函數(shù)模塊,至于鍵值獲取模塊和定時器模塊。音樂播放放在定時器模塊中完成。曰匕Target 1a “已User0 i main.cH臼HardwareE-13 Micro Define.c s-國IndependentKy

16、.c +1-自Timer.c圖5.10。4工程結(jié)構(gòu)圖主函數(shù)如下:圖5.10.3“兩只老虎”簡譜5.10蜂鳴器和音樂發(fā)生器-10 -#in clude#in elude MicroDefi ne.h#in elude Timer.h#in elude I ndepe nden tKey.h/*函數(shù)名稱:mai n()*功能 :主函數(shù)*入口參數(shù):無*出口參數(shù):無*說明 :*/void mai n()uchar KeyValue=O;uchar Cn t1Ms=0;DelayMs(200);TimerI ni t();/while(1)if(FlagSystem1Ms=1) /1ms FlagSys

17、tem1Ms=0;if(+C nt1Ms=10)/10msCn t1Ms=0;KeyValue=KeyGetValue(); /if(KeyValue=0 x81)if(FlagMusicE nd=0) /TR1=1;/FlagMusicE nd=1; /定時器初始化時標信號到時標信號到獲取按鍵值上一次播放完畢,則啟動新的播放啟動定時器 音樂播放中5.10蜂鳴器和音樂發(fā)生器-11 -程序解釋:在主程序中檢測按鍵按下,則啟動定時器1,并把音樂結(jié)束標志位置1。(2)其它功能模塊1鍵值處理模塊(省略)2定時器模塊Timer.h:#ifndef _TIMER_H_#defi ne _TIMER_H_#

18、in clude#i ncludeMicroDefi ne.hsbit Buzzer=P2A0;#defi ne MusicPlaySpeed 20/音樂播放速度宏定義/變量聲明extern bit FlagSystem1Ms;/1m時標信號extern bit FlagMusicE nd;/音樂播放結(jié)束標志位/定時器聲明extern void Timerl nit();/定時器初始化#en difTimer.c:#in cludeTimer.hbit FlagSystem1Ms=0;/1mbit FlagMusicE nd=0;/13個音符的半周期長度時標信號音樂播放結(jié)束標志位uint co

19、de TableNoteTime=1276,1136,1012,956,851,758, 716,638,568,506,478,425,379;13個音符對應的1/4拍內(nèi)半周期的個數(shù)uint code 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;/簡譜中音符對應的拍數(shù)uchar code TalbeMusicBeat

20、=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;/*5.10蜂鳴器和音樂發(fā)生器-12 -*函數(shù)名稱:Timerl nit()*功能 :定時器初始化*入口參數(shù):無*出口參數(shù):無*說明 :定時器0:產(chǎn)生1ms時標信號,方式2定時器1:驅(qū)動蜂鳴器,方式1*/void Timerl ni t()TMOD=0 x12;TH0=TL0=56;TH仁TL1=0 xFF;ET0=ET1=1;EA=1;TR0=1;/只開定時器0,定時器1的開啟由按鍵決定/*函數(shù)名稱:Timer0Isr()*功能 :定時器0中斷服務函數(shù)*入口參數(shù)

21、:無*出口參數(shù):無*說明 :*/void Timer0Isr() in terrupt 1static uchar Cn t200us=0;if(+C nt200us=5)/產(chǎn)生1ms時標信號Cn t200us=0;FlagSystem1Ms=1;/*函數(shù)名稱:Timer1Isr()*功能 :定時器1中斷服務函數(shù)*入口參數(shù):無*出口參數(shù):無5.10蜂鳴器和音樂發(fā)生器-13 -*說明:通過改變定時器的初裝值,產(chǎn)生不同頻率的蜂鳴器驅(qū)動信號MusicPIaySpeed是頭文件中宏定義,決定音樂的播放速度,其值不能小于10*/void Timer1lsr() in terrupt 3static uc

22、har NoteC nt=O;/播放音符計數(shù)器static uint HalfPeriodC nt=O; /半周期計數(shù)器uint Timer1Temp=0;/定時器長度暫存值/根據(jù)當前播放音符,計算出對應的定時器初值Timer1Temp=65536-TableNoteTimeTableMusicNoteNoteC nt;TH1=Timer1Temp/256;TL1=Timer1Temp%256;Buzzer=!Buzzer;/播放一個音符的時間到if(+HalfPeriodCnt=(TableNoteNumTableMusicNoteNoteCnt *TalbeMusicBeatNoteC nt)*MusicPlaySpeed/10)HalfPeriodC nt=0;/簡譜中的音符全部播放完if(+NoteC nt=32)NoteC nt=O;TR1=0;/FlagMusicE nd=0;/程序解釋:程序中使用了兩個定時器,和之前按鍵音一樣,一個用來產(chǎn)生系統(tǒng)時標信號,另外一個用于用于驅(qū)動蜂鳴器。按鍵啟動定時器1,定時器1溢出后,從播報的第一音符起,取出該音符半周期時間長度,計算出定時器1的初值,讓定時器1輸出該音符對應的脈沖波。定時器1每溢

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論