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

下載本文檔

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

文檔簡(jiǎn)介

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

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

3、5.10.1中,蜂鳴器接在PNP三極管(8550)的集電極上,單片機(jī)I/O接三極管的基極, 電阻R10是三極管基極限流電阻,電阻R11是上拉電阻。蜂鳴器內(nèi)部線圈是感性器件,二極管D10并聯(lián)在蜂鳴器兩端,起到限制反峰電壓的作用。3、無源蜂鳴器的程序驅(qū)動(dòng)無源蜂鳴器本身不帶振蕩器,只有讓蜂鳴器不停的處于“通電 聲音。對(duì)于開發(fā)板上蜂鳴器驅(qū)動(dòng)電路而言,只需要讓控制蜂鳴器的 就可以了。下面是利用51單片機(jī)P.20驅(qū)動(dòng)蜂鳴器的程序。#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級(jí)延時(shí)函數(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、出“嗡嗡”的聲音。然后在把延時(shí)改為2ms、3ms、5ms,蜂鳴器會(huì)發(fā)出不同頻響的聲音。4、蜂鳴器程序改造和按鍵提示音利用延時(shí)函數(shù)來驅(qū)動(dòng)蜂鳴器顯然不是個(gè)好的辦法,下面的程序通過定時(shí)器驅(qū)動(dòng)蜂鳴器,開發(fā)板上2個(gè)獨(dú)立按鍵,每個(gè)按鍵按下時(shí),蜂鳴器響一聲,持續(xù)時(shí)間為0.3秒。2個(gè)按鍵對(duì)應(yīng)的頻率分別為500Hz和IKHzo要求程序不堵塞CPU效率高。(1)工程結(jié)構(gòu)和主函數(shù)工程結(jié)構(gòu)圖如圖5.10.2所示。除了主函數(shù)外,還有按鍵模塊、定時(shí)器模塊和鍵值處理模 塊。- :J Target 1包巳User匡main.c=1 S Hardware爭(zhēng)圍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ù):無*說明 :按鍵被按下時(shí),蜂鳴器產(chǎn)生0.5S提示音。按鍵A提示音頻率:500Hz按鍵B提示音頻率:1KHz*/5.10蜂鳴器和音樂發(fā)生器-4 -void mai n()uchar KeyValue=O;DelayMs(200);TimerI nit(

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

8、數(shù):無*說明 :定時(shí)器0:產(chǎn)生1ms時(shí)標(biāo)信號(hào),方式2定時(shí)器1:驅(qū)動(dòng)蜂鳴器,方式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;/開定時(shí)器0,TR1=0/定時(shí)器1關(guān)閉,按鍵按下,才能開定時(shí)器1/*函數(shù)名稱:TimerOlsr()*功能 :定時(shí)器0中斷服務(wù)函數(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)機(jī)構(gòu)成,分成兩個(gè)狀態(tài)。狀態(tài)0:檢測(cè)到按鍵被按下,根據(jù)按鍵值,給定時(shí)器賦初值,并啟動(dòng)定時(shí)器。狀態(tài)1:延時(shí)299ms后,關(guān)閉定時(shí)器1,并返回到狀態(tài)0。利用狀態(tài)機(jī)構(gòu)成按鍵提示音函數(shù),不堵塞CPU系統(tǒng)效率高。5.9.3 任務(wù)實(shí)施1、音符和頻率的關(guān)系通過以上知識(shí)的學(xué)習(xí),初學(xué)者了解到蜂鳴器發(fā)聲的原理,即通過I/O口輸出脈沖信號(hào),再將信號(hào)通過三極管放大,推動(dòng)發(fā)聲器件(蜂鳴器)發(fā)聲。脈沖信號(hào)的頻率不同,蜂鳴器發(fā) 出的聲音不同。要完成本節(jié)的音樂播放器,需弄清楚兩個(gè)概念即可,也就是“音符”和“節(jié) 拍”。音符其實(shí)就是我們常說的“Do R

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

11、,關(guān)閉蜂鳴器關(guān)閉定時(shí)器,蜂鳴器不響 跳轉(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個(gè)音符頻率對(duì)應(yīng)表數(shù)組下標(biāo)音符頻率(Hz)周期(us)半周期(us)1/4節(jié)拍(0.1S)內(nèi)半周期數(shù)的個(gè)數(shù)05392255112767816440227311368827494202410129931523191295610542587107485111753659151775813264698143671614075783127763815

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

13、264;圖5.10.3是兒童歌曲“兩支老虎”的簡(jiǎn)譜。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ù)簡(jiǎn)譜,我們把簡(jiǎn)譜中對(duì)應(yīng)的音符和其拍數(shù)再分別放到數(shù)組中。需要說明的是,該數(shù) 組元素和簡(jiǎn)譜中音符的對(duì)應(yīng)關(guān)系,例如音符1”,在數(shù)組TableNoteTime中是第4個(gè)元素,所以在音樂簡(jiǎn)譜數(shù)組中應(yīng)寫為“3”。拍數(shù)以1/4拍為基本單位,拍數(shù)數(shù)組中元素的“1”、“2”和“4”分別對(duì)應(yīng)音符的1/4拍、1/2拍和1拍。/簡(jiǎn)譜中對(duì)應(yīng)的音符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;/簡(jiǎn)譜中音符對(duì)應(yīng)的拍數(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個(gè)數(shù)組,音樂播報(bào)就變得簡(jiǎn)單了。根據(jù)TableMusicNote數(shù)組中的值,從TableNoteTime數(shù)組中找到待播放音符的半周期長(zhǎng)度,將半周期長(zhǎng)度作為定時(shí)器的溢出值,啟動(dòng)定時(shí)器,蜂鳴器就會(huì)產(chǎn)生該音符。在播報(bào)音符的同時(shí),根據(jù)Table

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

16、.c +1-自Timer.c圖5.10。4工程結(jié)構(gòu)圖主函數(shù)如下:圖5.10.3“兩只老虎”簡(jiǎn)譜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; /定時(shí)器初始化時(shí)標(biāo)信號(hào)到時(shí)標(biāo)信號(hào)到獲取按鍵值上一次播放完畢,則啟動(dòng)新的播放啟動(dòng)定時(shí)器 音樂播放中5.10蜂鳴器和音樂發(fā)生器-11 -程序解釋:在主程序中檢測(cè)按鍵按下,則啟動(dòng)定時(shí)器1,并把音樂結(jié)束標(biāo)志位置1。(2)其它功能模塊1鍵值處理模塊(省略)2定時(shí)器模塊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時(shí)標(biāo)信號(hào)extern bit FlagMusicE nd;/音樂播放結(jié)束標(biāo)志位/定時(shí)器聲明extern void Timerl nit();/定時(shí)器初始化#en difTimer.c:#in cludeTimer.hbit FlagSystem1Ms=0;/1mbit FlagMusicE nd=0;/13個(gè)音符的半周期長(zhǎng)度時(shí)標(biāo)信號(hào)音樂播放結(jié)束標(biāo)志位uint co

19、de TableNoteTime=1276,1136,1012,956,851,758, 716,638,568,506,478,425,379;13個(gè)音符對(duì)應(yīng)的1/4拍內(nèi)半周期的個(gè)數(shù)uint code TableNoteNum=78,88,99,105,117,132,140,157, 176,198,209,235,264;/簡(jiǎn)譜中對(duì)應(yīng)的音符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;/簡(jiǎn)譜中音符對(duì)應(yīng)的拍數(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ù):無*出口參數(shù):無*說明 :定時(shí)器0:產(chǎn)生1ms時(shí)標(biāo)信號(hào),方式2定時(shí)器1:驅(qū)動(dòng)蜂鳴器,方式1*/void Timerl ni t()TMOD=0 x12;TH0=TL0=56;TH仁TL1=0 xFF;ET0=ET1=1;EA=1;TR0=1;/只開定時(shí)器0,定時(shí)器1的開啟由按鍵決定/*函數(shù)名稱:Timer0Isr()*功能 :定時(shí)器0中斷服務(wù)函數(shù)*入口參數(shù)

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論