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.按键提示音:
蜂鸣器按键提示音