蜂鸣器及其原理
蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器,其中壓電式蜂鳴器提供一定頻率的脈沖信號即可發出聲音,電磁式蜂鳴器提供電源即可發出聲音。
蜂鳴器氦分為有源蜂鳴器和無源蜂鳴器(這里的源不是電源,而是蜂鳴器內部是否含有振蕩電路),其中有源蜂鳴器內部自帶振蕩電路,上電后便能發聲,但發出的聲音頻率固定。無源蜂鳴器內部不含振蕩電路,需輸入脈沖信號才可發聲,但因為脈沖頻率可調,可通過輸入不同頻率的脈沖信號發出不同的音色和音調的聲音,若改變輸出電平的高低電平占空比,可調節蜂鳴器聲音的大小。
51單片機蜂鳴器及其驅動的結構原理圖:
?因為蜂鳴器所需的驅動電流比較大,51單片機的IO口輸出無法達到其驅動電流,因此需使用ULN2003D芯片來驅動,當P2_5輸入高電平時,BEER輸出低電平,此時蜂鳴器可發聲,若P2_5輸入一個低電平,則BEER輸出一個高電平,此時蜂鳴器不發聲,ULN2003D類似于一個非門。
用無源蜂鳴器輸出不同頻率的聲音
聲音是由物體振動發出的,當物體的振動頻率不同時,其發出的聲音的聲調不同,我們可以通過控制蜂鳴器內金屬片的振動頻率來產生不同頻率的聲音。我們可以通過給定時器賦初值來控制每次振動的時間(即振動頻率)。如圖為C調音符對應頻率的定時器初值。
?設定完聲音頻率后再用延時函數設定相應時間,將音符組合后便能輸出樂曲
如下為卜卦部分代碼,其中有部分問題還未解決,希望諸位大佬指出代碼中錯誤地方
#include <regx52.h> #include "Delay.h" #include "Timer0_Init.h"sbit Beep=P2^5; #define SPEED 1000 //將速度進行宏定義,方便調整樂曲播放速度 #define L1 1 //將每個頻率的聲音宏定義為相應的表述方式,,便于將樂譜轉譯為相應音調的聲音頻率 #define L1_ 2 #define L2 3 #define L2_ 4 #define L3 5 #define L4 6 #define L4_ 7 #define L5 8 #define L5_ 9 #define L6 10 #define L6_ 11 #define L7 12 #define M1 13 #define M1_ 14 #define M2 15 #define M2_ 16 #define M3 17 #define M4 18 #define M4_ 19 #define M5 20 #define M5_ 21 #define M6 22 #define M6_ 23 #define M7 24 #define H1 25 #define H1_ 26 #define H2 27 #define H2_ 28 #define H3 29 #define H4 30 #define H4_ 31 #define H5 32 #define H5_ 33 #define H6 34 #define H6_ 35 #define H7 36unsigned int count,MusicNoteSelect,Frequency; unsigned int code MusicNoteFrequency[]={0, //在第一位加一個0是為了讓第一個聲音頻率位于數組的第一位63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64524, //低音64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030, //中音65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283, //高音 }; unsigned int code MusicScore[]={ //樂譜中音調即其對應的時長M1,2,M2,2,M3,4,M1,2,M2,2,M3,4,M5,2,M6,2,M5,4,M3,4,0,2,M3,2,M5,2,M6,2,M2,6,M2,2,M2,2,M3,2,M5,3,M2,1,M3,12,M1,2,M2,2,M3,4,M1,2,M2,2,M3,4,M5,2,M6,2,M5,4,M3,4,0,2,M3,2,M5,2,H1,2,M7,6,H1,2,M7,2,M6,2,M5,3,M6,1,M6,8,0,2,M3,2,M6,2,M7,2,H1,6,H1,2,H1,2,M7,2,M6,2,H1,2,M5,6,M4,2,M3,4,M5,2,M6,2,M7,6,M7,2,M7,2,H1,2,M7,2,M6,2,M6,2,H1,2,H1,4,0,2,M3,2,M6,2,M7,2,H1,6,H1,2,H1,2,M7,2,H1,2,H2,2,H3,3,H1,1,H1,3,M5,1,M5,8,M7,6,M7,2,M7,2,H1,2,M7,3,M6,1,M7,8,0,2,M6,2,H1,2,H2,2,H3,4,H3,4,H3,3,H2,1,H3,2,H6,2,H5,2,H3,2,H3,4,0,2,H3,2,H5,2,H6,2,H2,4,0,2,H2,2,H2,2,H3,2,H5,3,H2,1,H3,8,0,2,M6,2,H1,2,H2,2,H3,4,H3,4,H3,3,H2,1,H3,2,H6,2,H5,2,H3,2,H3,4,0,2,H3,2,H5,2,H6,2,H2,4,0,2,H3,2,H5,3,H3,1,H5,3,H6,1,M6,12,0,2,0xFF, }; void main() {Timer0_Init(); //定時器0初始時化while(1){if(MusicScore[MusicNoteSelect]!=0xFF) //判斷樂曲是否播放完{if(MusicScore[MusicNoteSelect]) //如果對應音符不是0{Frequency=MusicScore[MusicNoteSelect];MusicNoteSelect++;Delay(SPEED/4*MusicScore[MusicNoteSelect]); //以最短時間為單位MusicNoteSelect++;}else //若音符為0{MusicNoteSelect++; TR0=0; //關閉定時器0,起作用是讓音符為0的地方產生停頓Delay(SPEED/4*MusicScore[MusicNoteSelect]);TR0=1; //停頓結束后打開定時器MusicNoteSelect++;}}else{TR0=0;}} }void time0() interrupt 1 //定時器0中斷函數,每次定時器溢出后都會跳轉到中斷函數中 {TH0=MusicNoteFrequency[Frequency]/256; //設置定時器高8位TL0=MusicNoteFrequency[Frequency]%256; //設置定時器低8位Beep=!Beep; //通過反轉蜂鳴器狀態來產生振動從而發聲 }總結
- 上一篇: java 类似 2010 皮肤_Java
- 下一篇: java mediacoder_Medi