版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、5.10 蜂鳴器和音樂發(fā)生器任務5.10 蜂鳴器的原理和驅動5.9.1 任務介紹在實際應用中,經常利用利用單片機控制蜂鳴器產生各種音樂用于報警和提示,如手機的鈴聲、時鐘的音樂報時和按鍵提示音等。本節(jié)的任務是:通過單片機I/O控制開發(fā)板上的蜂鳴器演奏音樂。5.9.2 知識準備1、 蜂鳴器的原理和分類蜂鳴器按結構分有壓電式蜂鳴器和電磁式蜂鳴器兩種類型。壓電蜂鳴器內部有壓電陶瓷和金屬片,是利用壓電陶瓷的壓電效應,帶動金屬片的振動來發(fā)聲,頻率在1KHz10KHz。電磁式蜂鳴器內部有磁鐵和線圈,振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發(fā)聲,頻率在0.5KHz5KHz。壓電蜂鳴器結構簡單耐用,聲
2、音大,多用于報警器等設備。電磁蜂鳴器音色好,多用于語音、音樂等設備。蜂鳴器按其是否帶有振蕩器又分為有源和無源兩種類型。有源蜂鳴器內部帶有振蕩器,只需要在其供電端加上額定直流電壓,其內部的振蕩器就可以產生固定頻率的信號,驅動蜂鳴器發(fā)出聲音。無源蜂鳴器內部沒有振蕩器,需要在其供電端上加上高低不斷變化的電信號才可以驅動發(fā)出聲音。開發(fā)板上的蜂鳴器屬于電磁式無源蜂鳴器。2、 開發(fā)板蜂鳴器驅動電路開發(fā)板蜂鳴器驅動電路如圖5.10.1所示。5.10.1 開發(fā)板蜂鳴器驅動電路蜂鳴器的驅動和繼電器相似,需要幾十mA的電流,通常借助于三極管來作為中間功率驅動。圖5.10.1中,蜂鳴器接在PNP三極管(8550)的
3、集電極上,單片機I/O接三極管的基極,電阻R10是三極管基極限流電阻,電阻R11是上拉電阻。蜂鳴器內部線圈是感性器件,二極管D10并聯(lián)在蜂鳴器兩端,起到限制反峰電壓的作用。3、無源蜂鳴器的程序驅動無源蜂鳴器本身不帶振蕩器,只有讓蜂鳴器不停的處于“通電-斷電”的狀態(tài),才能發(fā)出聲音。對于開發(fā)板上蜂鳴器驅動電路而言,只需要讓控制蜂鳴器的I/O口不停的“置1-置0”就可以了。下面是利用51單片機P.20驅動蜂鳴器的程序。#incldue<reg52.h>#define uchar unsigned char#define uint unsigend intsbit Buzzer=P20;
4、/蜂鳴器接口定義#define BuzzerOn Buzzer=0#define BuzzerOff Buzzer=1 /ms級延時函數(shù)void DelayMs(uint xms) uint i,j; for(i=0;i<xms;i+) for(j=0;j<122;j+);/主函數(shù)void main() while(1) BuzzerOn; DelayMs(1); BuzzerOff DelayMs(1); 在程序中,1ms讓蜂鳴器通電,1ms讓蜂鳴器斷電,頻率500Hz。程序編譯下載后,蜂鳴器引腳控制端接P2.0引腳,蜂鳴器發(fā)出“嗡嗡”的聲音。然后在把延時改為2ms、3ms、5m
5、s,蜂鳴器會發(fā)出不同頻響的聲音。4、蜂鳴器程序改造和按鍵提示音利用延時函數(shù)來驅動蜂鳴器顯然不是個好的辦法,下面的程序通過定時器驅動蜂鳴器,開發(fā)板上2個獨立按鍵,每個按鍵按下時,蜂鳴器響一聲,持續(xù)時間為0.3秒。2個按鍵對應的頻率分別為500Hz和1KHz。要求程序不堵塞CPU,效率高。(1) 工程結構和主函數(shù)工程結構圖如圖5.10.2所示。除了主函數(shù)外,還有按鍵模塊、定時器模塊和鍵值處理模塊。 圖5.10.2 工程結構圖主函數(shù)如下:#include<reg52.h>#include"MicroDefine.h"#include"Timer.h"
6、;#include"IndependentKey.h"#include"KeyProcess.h" /*函數(shù)名稱:main()*功能 :主函數(shù)*入口參數(shù):無*出口參數(shù):無*說明 :按鍵被按下時,蜂鳴器產生0.5S提示音。 按鍵A提示音頻率:500Hz 按鍵B提示音頻率:1KHz */void main() uchar KeyValue=0; DelayMs(200); TimerInit(); /定時器初始化 while(1) if(FlagSystem1Ms=1) /1ms時標信號 FlagSystem1Ms=0; KeyValue=KeyGetVal
7、ue(); /獲取鍵值 KeySound(KeyValue); /鍵值處理 程序解釋:主函數(shù)內容簡單,獲取按鍵鍵值,并處理鍵值。(2) 其它功能模塊 定時器模塊(Timer.c,Timer.h不列出)#include"Timer.h"bit FlagSystem1Ms=0; /1m時標信號uchar T1High=0; /T0高8位uchar T1Low=0; /T1低8位/*函數(shù)名稱:TimerInit()*功能 :定時器初始化*入口參數(shù):無*出口參數(shù):無*說明 :定時器0:產生1ms時標信號,方式2 定時器1:驅動蜂鳴器,方式1*/void TimerInit() TM
8、OD=0x12; TH0=TL0=56; TH1=TL1=0; TR0=1; /只開定時器0,定時器1的開啟由按鍵決定ET0=ET1=1; EA=1;TR0=1; /開定時器0,TR1=0; /定時器1關閉 ,按鍵按下,才能開定時器1/*函數(shù)名稱:Timer0Isr()*功能 :定時器0中斷服務函數(shù)*入口參數(shù):無*出口參數(shù):無*說明 :*/void Timer0Isr() interrupt 1 static uchar Cnt200us=0; if(+Cnt200us<=5) /產生1ms時標信號 Cnt200us=0; FlagSystem1Ms=1; /*函數(shù)名稱:Timer1Is
9、r()*功能 :定時器1中斷服務函數(shù)*入口參數(shù):無*出口參數(shù):無*說明 :通過改變定時器的初裝值,產生不同頻率的蜂鳴器驅動信號*/void Timer1Isr() interrupt 3 TH1=T1High; /加載初值,鍵值處理模塊設置初值 TL1=T1Low; Buzzer=Buzzer; /電平反轉程序解釋:使用了2個定時器,定時器0用來產生1ms時標信號,定時器1用來驅動蜂鳴器。在定時器初始化中,定時器1配置好后,先不開定時器1,只有按鍵按下后,才能開定時器1。定時器1使用了方式1(16位),每一次溢出后,在中斷服務函數(shù)中,手動重裝初值,初值的大小由鍵值處理模塊給定。在中斷服務函數(shù)中
10、,實現(xiàn)蜂鳴器驅動I/O的電平反轉。 鍵值處理模塊(KeyProcess.h)#include"KeyProcess.h"/*函數(shù)名稱:KeySound()*功能 :按鍵提示音*入口參數(shù):按鍵值*出口參數(shù):無*說明 :*/void KeySound(uchar KeyValue) static uchar SoundState=0; /狀態(tài)機變量 static uint Cnt1Ms=0; /1ms計數(shù)器 switch(SoundState) case 0: /狀態(tài)0:按鍵被按下,開定時器1 if(KeyValue=0x81) /按鍵A被按下,蜂鳴器響 T1High=0xFC
11、; /定時器1初值,輸出500Hz方波 T1Low=0x18; TH1=0xFF; /讓定時器快速完成第一次溢出, TL1=0xFF; TR1=1; /開定時器 SoundState=1; /跳轉到狀態(tài)0 if(KeyValue=0x82) /按鍵B被按下,蜂鳴器響 T1High=0xFE; T1Low=0x0c; TH1=0xFF; TL1=0xFE; SoundState=1; TR1=1; break; case 1: /狀態(tài)1:延時299ms,關閉蜂鳴器 if(+Cnt1Ms>=299) Cnt1Ms=0; TR1=0; /關閉定時器,蜂鳴器不響 SoundState=0; /跳
12、轉到狀態(tài)0 程序解釋:KeySound()由狀態(tài)機構成,分成兩個狀態(tài)。狀態(tài)0:檢測到按鍵被按下,根據(jù)按鍵值,給定時器賦初值,并啟動定時器。狀態(tài)1:延時299ms后,關閉定時器1,并返回到狀態(tài)0。利用狀態(tài)機構成按鍵提示音函數(shù),不堵塞CPU,系統(tǒng)效率高。5.9.3 任務實施1、 音符和頻率的關系通過以上知識的學習,初學者了解到蜂鳴器發(fā)聲的原理,即通過I/O口輸出脈沖信號,再將信號通過三極管放大,推動發(fā)聲器件(蜂鳴器)發(fā)聲。脈沖信號的頻率不同,蜂鳴器發(fā)出的聲音不同。要完成本節(jié)的音樂播放器,需弄清楚兩個概念即可,也就是“音符”和“節(jié)拍”。音符其實就是我們常說的“Do Re Mi Fa Sol La S
13、i Do”,每一個音符對應一定的頻率。以中音“1”為例,其頻率為523Hz,周期為1秒/523=1912us,半周期為956us。通常沒有做特殊說明,我們把音樂的一個節(jié)拍的時間長度定位0.4秒,1/4節(jié)拍的時間則為0.1秒。如果以1/4節(jié)拍為基準長度,則1拍為4個基準長度,1/2拍為2個基準長度。定時器要產生中音“1”對應的頻率(523Hz),則定時器每次溢出的時間為半個周期(即956us)。假設中音“1”的時間長度為1/4拍,則定時器溢出的次數(shù)為0.1秒/956us=105次。1/2拍和1拍對應的溢出次數(shù)分別105次*2和105次*4。為了程序的方便,我們把低音音符(“5 ”“7”)、中音音
14、符(“1”“7”)和高音音符(“ ”“”)的頻率、半周期及1/4節(jié)拍內半周期數(shù)放在表5.10.1中。表5.10.1 14個音符頻率對應表數(shù)組下標音符頻率(Hz)周期(us)半周期(us)1/4節(jié)拍(0.1S)內半周期數(shù)的個數(shù)05392255112767816440227311368827494202410129931523191295610542587107485111753659151775813264698143671614075783127763815786880113656817697988101250619810104695647820911117585142523512131875
15、9379264根據(jù)表5.10,我們先構建兩個數(shù)組,分別存放以上音符的半周期時間和1/4拍內半周期的個數(shù)。/13個音符的半周期長度uchar code TableNoteTime=1276,1136,1012,956,851,758,716,638,568,506,478,425,379;/13個音符1/4拍內半周期的個數(shù)uchar code TableNoteNum=78,88,99,105,117,132,140,157,176,198,209,235,264;圖5.10.3是兒童歌曲“兩支老虎”的簡譜。 圖5.10.3 “兩只老虎”簡譜根據(jù)簡譜,我們把簡譜中對應的音符和其拍數(shù)再分別放到數(shù)組
16、中。需要說明的是,該數(shù)組元素和簡譜中音符的對應關系,例如音符“1”,在數(shù)組TableNoteTime中是第4個元素,所以在音樂簡譜數(shù)組中應寫為“3”。拍數(shù)以1/4拍為基本單位,拍數(shù)數(shù)組中元素的“1”、“2”和“4”分別對應音符的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;/簡譜中音符對應的拍數(shù)uchar code TalbeMusicBeat=2,2,2,2,2,2,2,2,2,2,4,2,2,4,1,1,1,1,2
17、,2,1,1,1,1,2,2,2,2,4,2,2,4;有了這4個數(shù)組,音樂播報就變得簡單了。根據(jù)TableMusicNote數(shù)組中的值,從TableNoteTime數(shù)組中找到待播放音符的半周期長度,將半周期長度作為定時器的溢出值,啟動定時器,蜂鳴器就會產生該音符。在播報音符的同時,根據(jù)TableMusicNote數(shù)組中的值,從TableNoteNum數(shù)組中找到該音符所對應的1/4拍內半周期的個數(shù),然后再從TalbeMusicBeat數(shù)組中,找到該音符在簡譜中的拍數(shù),兩者相乘,即為定時器產生該音符所對應頻率的時間長度。播報完了第一個音符,然后再播報第二個音符.直到最后一個音符,一首曲子就播放完了
18、。2、 程序實現(xiàn)(1) 工程架構和主函數(shù)程序的工程架構如圖5.10.4所示。除了主函數(shù)模塊,至于鍵值獲取模塊和定時器模塊。音樂播放放在定時器模塊中完成。圖5.10。4 工程結構圖主函數(shù)如下:#include<reg52.h>#include "MicroDefine.h"#include "Timer.h"#include "IndependentKey.h"/*函數(shù)名稱:main()*功能 :主函數(shù)*入口參數(shù):無*出口參數(shù):無*說明 : */void main() uchar KeyValue=0; uchar Cnt1
19、Ms=0; DelayMs(200); TimerInit(); /定時器初始化 while(1) if(FlagSystem1Ms=1) /1ms時標信號到 FlagSystem1Ms=0; if(+Cnt1Ms>=10) /10ms時標信號到 Cnt1Ms=0; KeyValue=KeyGetValue(); /獲取按鍵值 if(KeyValue=0x81) if(FlagMusicEnd=0) /上一次播放完畢,則啟動新的播放 TR1=1; /啟動定時器 FlagMusicEnd=1; /音樂播放中 程序解釋:在主程序中檢測按鍵按下,則啟動定時器1,并把音樂結束標志位置1。(2)
20、其它功能模塊 鍵值處理模塊(省略) 定時器模塊Timer.h:#ifndef _TIMER_H_#define _TIMER_H_#include<reg52.h>#include"MicroDefine.h"sbit Buzzer=P20;#define MusicPlaySpeed 20 /音樂播放速度宏定義/變量聲明extern bit FlagSystem1Ms; /1m時標信號extern bit FlagMusicEnd; /音樂播放結束標志位/定時器聲明extern void TimerInit(); /定時器初始化#endifTimer.c:#i
21、nclude"Timer.h"bit 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拍內半周期的個數(shù)uint code TableNoteNum=78,88,99,105,117,132,140,157, 176,198,209,235,264;/簡譜中對應的音符uchar code TableMusicN
22、ote=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;/*函數(shù)名稱:TimerInit()*功能 :定時器初始化*入口參數(shù):無*出口參數(shù):無*說明 :定時器0:產生1ms時標信號,方式2 定時器1:驅動蜂鳴器, 方式1*/void TimerInit() TMOD=0x12; TH0=TL0=56; TH1=T
23、L1=0xFF; ET0=ET1=1; EA=1; TR0=1; /只開定時器0,定時器1的開啟由按鍵決定/*函數(shù)名稱:Timer0Isr()*功能 :定時器0中斷服務函數(shù)*入口參數(shù):無*出口參數(shù):無*說明 :*/void Timer0Isr() interrupt 1 static uchar Cnt200us=0; if(+Cnt200us>=5) /產生1ms時標信號 Cnt200us=0; FlagSystem1Ms=1; /*函數(shù)名稱:Timer1Isr()*功能 :定時器1中斷服務函數(shù)*入口參數(shù):無*出口參數(shù):無*說明 :通過改變定時器的初裝值,產生不同頻率的蜂鳴器驅動信號
24、MusicPlaySpeed是頭文件中宏定義,決定音樂的播放速度,其值不能小于10*/void Timer1Isr() interrupt 3 static uchar NoteCnt=0; /播放音符計數(shù)器 static uint HalfPeriodCnt=0; /半周期計數(shù)器 uint Timer1Temp=0; /定時器長度暫存值 /根據(jù)當前播放音符,計算出對應的定時器初值 Timer1Temp=65536-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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 有關抵押借款合同范文
- oem委托加工合同協(xié)議常用范本年
- 變電站安裝工程承包合同模板
- 2024年高考英語 (全國甲卷)真題詳細解讀及評析
- 個人商品購銷合同
- 2025年外研版九年級歷史下冊月考試卷含答案
- 貨物運輸合同、法規(guī)與保險
- 2025年外研版九年級歷史下冊階段測試試卷
- 造紙機購買合同
- 民政局離婚的協(xié)議書范本
- 印度與阿拉伯的數(shù)學
- 口腔科院感知識培訓針刺傷
- 會陰切開傷口裂開的護理查房
- 《鋼鐵是怎樣煉成的》選擇題100題(含答案)
- 2024年國新國際投資有限公司招聘筆試參考題庫含答案解析
- 食堂餐廳服務方案投標方案(技術標)
- Creo-7.0基礎教程-配套課件
- 六年級人教版上冊數(shù)學計算題練習題(及答案)100解析
- 超聲科質量控制制度及超聲科圖像質量評價細則
- 初中物理滬粵版八年級下冊《第六章 力和機械》章節(jié)練習(含答案)
- 金礦管理制度
評論
0/150
提交評論