- UID
- 1023166
- 性别
- 男
- 来自
- 燕山大学
|
蜂鸣器是一种一体化的电子讯响设备,主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型,他广泛应用于计算机,
打印机,复印机,报警器,电话机等电子设备中做报警器件。单片机上使用的蜂鸣器一般都是电磁式无源蜂鸣
器。如图:
它由振荡器,电磁线圈,磁场,振动膜片,外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,
使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的共同作用下,周期性的振动发声。
这是蜂鸣器的原理图,PNP型三极管,这个图里是一个典型的开关管,E极接VCC,B极接一个限流电阻,三极管
的B极不能承受大的电流所以加上一个限流电阻,电流从VCC流向E极,如果B极是低电平则导通,电流从E极流过
C极到达蜂鸣器。P3_4与蜂鸣器之间通过跳线连接,所以如果P3_4为低电平就可以驱动蜂鸣器想起来。
#include <reg52.h>
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 <reg52.h>
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 <reg52.h>
#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;
}
由于我使用的板子自带的有源蜂鸣器,所以声音很难听,哈哈。
李万鹏 |
|