蜂鸣器
- 1、蜂鸣器的介绍
- 2、编程让蜂鸣器响起来
- 3、通过定时控制蜂鸣器
- 4、蜂鸣器发出滴滴声(间歇性鸣叫)
1、蜂鸣器的介绍
蜂鸣器内部其实是2个金属片,当一个金属片接正电,一个金属片接负电时,2个金属片将合拢,在合拢的一瞬间发生碰撞,如何发出声音。
分类:分为有源蜂鸣器和无源蜂鸣器。
无源蜂鸣器的发声原理:
(1)快速的给2个金属片进行充电和断电进行发出声音,所以通过脉冲波形来控制。
(2)音调的控制:音调如何控制,音调受震动频率控制,就等于控制信号的频率。频率越高音调越高,听起越刺耳。
(3)声音大小如何控制:由硬件决定的,没法写代码去控制声音大小。
缺点:要自己调节合适频率(太高超声波,太低次声波),不然蜂鸣器不会响。
有源蜂鸣器:
(1)内置震荡电路后形成有源蜂鸣器,直接加电就会响(但是频率规定了的)。
(2)有源蜂鸣器也可以用频率信号驱动。
2、编程让蜂鸣器响起来
P0.0接上J8
设置频率为1000Hz,则周期为1/1000=1ms,则我们设置延迟为0.5ms(500us)即可。
#include <REGX51.H>
sbit FMQ = P1^0;
void delay500us(void) //延迟为0.5ms
{
unsigned char a,b;
for(b=99;b>0;b--)
for(a=1;a>0;a--);
}
void main(void)
{
while(1)
{
FMQ = 1;
delay500us();
FMQ = 0;
delay500us();
}
}
3、通过定时控制蜂鸣器
设置一个频率为5000Hz的蜂鸣器用定时器来控制,其主任务静态数码0到F循环显示。
5000Hz–>1/5000Hz=0.2ms=200us(周期),则定时设置为100us即可
外部晶振为12MHz通过12分频–>1MHz–>1/1MHz=1us–>100个脉冲信号
#include <REGX51.H>
#define SMG P0
sbit FMQ = P1^0;
/****定时到时执行的中断程序****/
void DingShi() interrupt 1
{
/*每一次定时到后都要重置脉冲个数,以便进行第二次定时*/
TL0 = 0X9C; //低8位为1001 1100
TH0 = 0XFF; //高8位为1111 1111
FMQ = !FMQ;
}
void delay(void)//延迟函数
{
unsigned char a,b;
for(a=200 ;a>0 ;a--)
for(b=200 ;b>0 ;b--)
;
}
void main(void)
{
unsigned char i;
TMOD = 0X01; //0000 0001 使用的是T0定时器,工作模式是16位定时器
/****设置脉冲个数位100个,既为0.1ms,则65536-100=65436***/
TL0 = 0X9C; //低8位为1001 1100
TH0 = 0XFF; //高8位为1111 1111
TR0 = 1; //计数器,开始计数
ET0 = 1; //开启T0中断
EA = 1; //开启中断总开关
while(1)//执行主任务
{
unsigned char val[16] = {0xc0, 0xf9, 0xa4, 0xb0,
0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83,
0xc6, 0xa1, 0x86, 0x8e};//0到F的数码表
for(i=0 ;i<=15 ;i++)
{
SMG = val[i];
delay();
}
}
}
4、蜂鸣器发出滴滴声(间歇性鸣叫)
让蜂鸣器响半秒,停半秒这样的不断循环。由上面可得周期为200us,定时设置为100us。
则半秒0.5s/100us=5000。我们定义2个标准变量count和flag。
#include <REGX51.H>
#define SMG P0
sbit FMQ = P1^0;
unsigned int count;
unsigned char flag = 0;
/****定时到时执行的中断程序****/
void DingShi() interrupt 1
{
/*每一次定时到后都要重置脉冲个数,以便进行第二次定时*/
TL0 = 0X9C; //低8位为1001 1100
TH0 = 0XFF; //高8位为1111 1111
if(flag == 0) //蜂鸣器响
{ count--;
if(count == 0)
{
flag = 1;
}
else
{
FMQ = !FMQ;
}
}
else //蜂鸣器不响
{ count++;
if(count == 5000)
{
flag = 0;
}
}
}
void delay(void)//延迟函数
{
unsigned char a,b;
for(a=200 ;a>0 ;a--)
for(b=200 ;b>0 ;b--)
;
}
void main(void)
{
unsigned char i;
TMOD = 0X01; //0000 0001 使用的是T0定时器,工作模式是16位定时器
/****设置脉冲个数位100个,既为0.1ms,则65536-100=65436***/
TL0 = 0X9C; //低8位为1001 1100
TH0 = 0XFF; //高8位为1111 1111
TR0 = 1; //计数器,开始计数
ET0 = 1; //开启T0中断
EA = 1; //开启中断总开关
count = 5000;
flag = 0;
while(1)//执行主任务
{
unsigned char val[16] = {0xc0, 0xf9, 0xa4, 0xb0,
0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83,
0xc6, 0xa1, 0x86, 0x8e};//0到F的数码表
for(i=0 ;i<=15 ;i++)
{
SMG = val[i];
delay();
}
}
}