51单片机蜂鸣器(无源)

一.实物图及接线图:

1.实物图:

在这里插入图片描述
一共有三个引脚,分别为Vcc、GND和I/O口(这个接到单片机的IO口)。

2.与51最小系统板的接线图:

在这里插入图片描述
蜂鸣器的Vcc(绿线) -----> 单片机的5V
蜂鸣器的GND(橙线) -----> 单片机的GND
蜂鸣器的I/O(黄线) -----> 单片机的IO口(在不会引起冲突的情况下随意一个IO口)

二.工作原理及实现条件:

1.工作原理:

在这里插入图片描述
无源蜂鸣器不像有源蜂鸣器那样,有源蜂鸣器通过单片机的IO口直接给高低电平就可以发声,它的优点就是操作简单,缺点就是很难调频率,即音调。而无源蜂鸣器相反,操作相对难,但通过改变频率可以调出很多音调,感兴趣通过改变音调制作一首歌是完全可以的。
无源蜂鸣器的无源不是没有电源的意思,无源是内部没有激励源,只有给它一定频率的方波信号(PWM方波信号),才能让蜂鸣器的振动装置起振,从而实现发声,同时,输入的方波频率不同,发出的声音也不同。

2.实现——按键提示音:

在这里插入图片描述
这里就实现简单的让蜂鸣器响起来,连续响5次,结合上图和下面的蜂鸣器驱动代码来分析。

unsigned int i,j;       //定义内外循环变量
        for(j=0;j<5;j++)  //让蜂鸣器响5次
        {
                for(i=0;i<100;i++)   //蜂鸣器响的周期
                {
                        beep=~beep;  //产生震荡
                        Delay(1);    //决定响度
                }
                Delay(10);           //两次响之间的间隔时间
        }

1.首先内层for循环产生PWM方波,循环次数决定的是响的周期,即可以理解为响一次为多久。
2.beep=~beep就是高低电平交替产生震荡,2次为一个周期,它决定着蜂鸣器是否响。
3.Delay(1)就是高低电平翻转时间,就是一个高电平或者一个低电平的时间,一个高电平在整个周期的占比叫占空比,Delay越大相当于占空比越大,那么对应的响度就越大。
4.外层for循环的次数决定着执行多少次内循环,就是理解为要响多少次内循环已经设置好的蜂鸣器响声。加个Delay延时表示为两次响声之间间隔多少时间。

3.实现——连续响n次:

这里就做个按键提示音,生活中也很常见,就是按一次按键会发出”滴”的一声

unsigned char Key_num;     //定义一个变量接住按键返回值
        while(1)
        {
                
                Key_num=Key();   //接住返回值
                if(Key_num)      //判断按键是否按下,!=0说明有按键按下
                {
                        for(i=0;i<100;i++)     //蜂鸣器响一次的周期
                        {
                                beep=~beep;     //高低电平产生震荡
                                Delay(1);       //设置响度
                        }
                        Nixie(1,Key_num);       //数码管显示状态
                }
        }

三.代码实现(代码全):

1.连续响5次:

#include <REGX52.H>
sbit beep=P2^5;          //把蜂鸣器的I/O接到了单片机的P25引脚。
void Delay(unsigned int xms)                
{
        unsigned char i, j;
        while(xms)
        {
                _nop_();
                i = 2;
                j = 199;
                do
                {
                        while (--j);
                } while (--i);
                xms--;
        }
        
}
void main()
{
    unsigned int i,j;
    for(j=0;j<5;j++)
    {
            for(i=0;i<200;i++)
            {
                    beep=~beep;
                    Delay(1);
            }
            Delay(10);
    }
    while(1)
    {
               
    }
}

2.按键提示音:

#include <REGX52.H>
#include "Delay.h"
#include "key.h"
#include "Nixie.h"

sbit beep=P2^5;
sbit Aa=P2^2;
sbit Bb=P2^3;
sbit Cc=P2^4;

unsigned char Nixie_Num[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Nixie(unsigned char ziwei,unsigned char zixing)
{
        switch(ziwei)
        {
                case 1:Cc=1;Bb=1;Aa=1;break;
                case 2:Cc=1;Bb=1;Aa=0;break;
                case 3:Cc=1;Bb=0;Aa=1;break;
                case 4:Cc=1;Bb=0;Aa=0;break;
                case 5:Cc=0;Bb=1;Aa=1;break;
                case 6:Cc=0;Bb=1;Aa=0;break;
                case 7:Cc=0;Bb=0;Aa=1;break;
                case 8:Cc=0;Bb=0;Aa=0;break;
        }
        P0=Nixie_Num[zixing];
}
unsigned char Key()                //有返回值,即返回number
{
        unsigned char number=0;
        
        if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);number=1;}
        if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);number=2;}
        if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);number=3;}
        if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);number=4;}
        
        return number;
}
void Delay(unsigned int xms)                
{
        unsigned char i, j;
        while(xms)
        {
                _nop_();
                i = 2;
                j = 199;
                do
                {
                        while (--j);
                } while (--i);
                xms--;
        }
        
}
void main()
{
        unsigned char Key_num;
        while(1)
        {
                
                Key_num=Key();
                if(Key_num)
                {
                        for(i=0;i<100;i++)
                        {
                                beep=~beep;
                                Delay(1);
                        }
                        Nixie(1,Key_num);
                }
        }
}

三.效果展示:

1.连续响5次:

蜂鸣器连续响

2.按键提示音:

蜂鸣器按键提示音

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值