蜂鸣器
- 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 1100TH0 = 0XFF; //高8位为1111 1111FMQ = !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 1100TH0 = 0XFF; //高8位为1111 1111TR0 = 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 1100TH0 = 0XFF; //高8位为1111 1111if(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 1100TH0 = 0XFF; //高8位为1111 1111TR0 = 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();}}
}