51单片机-蜂鸣器
发布时间:2011-3-21 11:54
发布者:诸葛孔明
蜂鸣器是一种一体化的电子讯响设备,主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型,他广泛应用于计算机, 打印机,复印机,报警器,电话机等电子设备中做报警器件。单片机上使用的蜂鸣器一般都是电磁式无源蜂鸣 器。如图: 它由振荡器,电磁线圈,磁场,振动膜片,外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈, 使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的共同作用下,周期性的振动发声。 这是蜂鸣器的原理图,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; } 由于我使用的板子自带的有源蜂鸣器,所以声音很难听,哈哈。 李万鹏 |
网友评论