蜂鳴器是一種一體化的電子訊響設備,主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型,他廣泛應用于計算機, 打印機,復印機,報警器,電話機等電子設備中做報警器件。單片機上使用的蜂鳴器一般都是電磁式無源蜂鳴 器。如圖: 它由振蕩器,電磁線圈,磁場,振動膜片,外殼等組成。接通電源后,振蕩器產生的音頻信號電流通過電磁線圈, 使電磁線圈產生磁場,振動膜片在電磁線圈和磁鐵的共同作用下,周期性的振動發聲。 這是蜂鳴器的原理圖,PNP型三極管,這個圖里是一個典型的開關管,E極接VCC,B極接一個限流電阻,三極管 的B極不能承受大的電流所以加上一個限流電阻,電流從VCC流向E極,如果B極是低電平則導通,電流從E極流過 C極到達蜂鳴器。P3_4與蜂鳴器之間通過跳線連接,所以如果P3_4為低電平就可以驅動蜂鳴器想起來。 #include sbit p3_4 = P3^4; void delay(){ int i,j; for(i = 0; i < 0xff; i++) for(j = 0; j < 0xff; j++) ; } void main(){ int i; for(i = 0; i < 10; i++){ p3_4 = 0; delay(); p3_4 = 1; } } 聲音的產生 聲音的產生是一種音頻振動的效果,振動的頻率高,則為高音;振動的頻率低,則為低音;音;一般音響電 路是用正弦波信號驅動喇叭。在數字電路里,則是用數字脈沖信號驅動喇叭從而產生聲音。如果聲音的頻率相同 ,人類的耳朵很難區分出哪個脈沖信號產生的聲音,哪個正弦波信號產生的聲音,P0口無上拉電阻。 在蜂鳴器中,聲音是由蜂鳴器的振動產生的。蜂鳴器就像一個電磁鐵,電流流過它既可產生磁性,這樣蜂鳴 器里發生的膜片將被吸住;電流消時,膜片將被放開。若要產生頻率為f的脈沖,則要在T時間內(其中T=1/f), 進行吸放各一次,換言之,產生磁性,消除磁性的時間各為T/2,成為半周期。例如要產生1KHZ的頻率,則半周期 為0.5ms,所以P1.0所送出的信號一個周期中,其中0.5ms為高電平,另外0.5ms為低電平。切換速度越快,聲音 越高;反之,切換速度越慢,聲音越低。除了控制發聲的高低外,若還能控制發生的時間長短,這樣就會有節奏感 ,也就形成 了“音樂”的雛形。DO,RE,MI,FA,SO,LA,SI,DO分別代表某一個頻率的聲音,我們稱之為“音調” 。“節拍”即Beat,簡單的說就是打拍子。以生日快樂簡譜為例,C3/4代表為C調,C調音節表包括3個音階(低音 ,中音,高音),每個每個音階為8個音度,其中細 分為12個半音(即DO,DO#,RE,RE#,MI,FA,FA#,SO,SO#, LA,LA#,SI)。 單片機如何輸出頻率: 得到600HZ的頻率: #include sbit p = P3^4; void main(){ p = 1; EA = 1; ET0 = 1; TMOD = 0x01; TH0 = (65536-833)/256; TL0 = (65536-833)%256; TR0 = 1; while(1); } void time0() interrupt 1{ p = ~p; TH0 = (65536-833)/256; TL0 = (65536-833)%256; } 內循環一次8.3us void delay8us(unsigned char x){ unsigned char i,j; for(i = 0; i < x; i++) for(j = 0; j < 1; j++) ; } 音符頻率及定時器初值對照表: 4*4電子琴程序的實現: #include #define uchar unsigned char #define uint unsigned int uint DATE,i; sbit buzz = P3^4; sbit L0 = P0^0; sbit L1 = P0^1; sbit L2 = P0^2; sbit L3 = P0^3; sbit H0 = P0^4; sbit H1 = P0^5; sbit H2 = P0^6; sbit H3 = P0^7; uchar TH0_DATA = 0; uchar TL0_DATA = 0; uchar code qin[] = {262,277,293,329,349,392,440,494}; uint key(){ P0 = 0xfe; if(H0 == 0)return 13; if(H1 == 0)return 9; if(H2 == 0)return 5; if(H3 == 0)return 1; P0 = 0xfd; if(H0 == 0)return 14; if(H1 == 0)return 10; if(H2 == 0)return 6; if(H3 == 0)return 2; P0 = 0xfb; if(H0 == 0)return 15; if(H1 == 0)return 11; if(H2 == 0)return 7; if(H3 == 0)return 3; P0 = 0xf7; if(H0 == 0)return 16; if(H1 == 0)return 12; if(H2 == 0)return 8; if(H3 == 0)return 4; return 0; } void main(){ EA = 1; ET0 = 1; TMOD = 0x01; TR0 = 0; while(1){ i = key(); if(i == 0){ TR0 = 0; buzz = 1; } else{ if(i > 8){ DATE = 65536 - (50000/(qin[i-9]*2))*10; TH0_DATA = DATE >> 8; TL0_DATA = DATE & 0x00ff; } else{ DATE = 65536 - (50000/qin[i-1])*10; TH0_DATA = DATE >> 8; TL0_DATA = DATE & 0x00ff; } TR0 = 1; } } } void time0() interrupt 1{ buzz = ~buzz; TH0 = TH0_DATA; TL0 = TL0_DATA; } 由于我使用的板子自帶的有源蜂鳴器,所以聲音很難聽,哈哈。 李萬鵬 |