首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

51单片机-蜂鸣器

51单片机-蜂鸣器

蜂鸣器是一种一体化的电子讯响设备,主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型,他广泛应用于计算机,

打印机,复印机,报警器,电话机等电子设备中做报警器件。单片机上使用的蜂鸣器一般都是电磁式无源蜂鸣

器。如图:




它由振荡器,电磁线圈,磁场,振动膜片,外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,

使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的共同作用下,周期性的振动发声。




这是蜂鸣器的原理图,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;
}

由于我使用的板子自带的有源蜂鸣器,所以声音很难听,哈哈。



李万鹏
返回列表