18:蜂鸣器

蜂鸣器

  • 1、蜂鸣器的介绍
  • 2、编程让蜂鸣器响起来
  • 3、通过定时控制蜂鸣器
  • 4、蜂鸣器发出滴滴声(间歇性鸣叫)

1、蜂鸣器的介绍

蜂鸣器内部其实是2个金属片,当一个金属片接正电,一个金属片接负电时,2个金属片将合拢,在合拢的一瞬间发生碰撞,如何发出声音。

分类:分为有源蜂鸣器和无源蜂鸣器。
无源蜂鸣器的发声原理:
(1)快速的给2个金属片进行充电和断电进行发出声音,所以通过脉冲波形来控制。
(2)音调的控制:音调如何控制,音调受震动频率控制,就等于控制信号的频率。频率越高音调越高,听起越刺耳。
(3)声音大小如何控制:由硬件决定的,没法写代码去控制声音大小。
缺点:要自己调节合适频率(太高超声波,太低次声波),不然蜂鸣器不会响。

有源蜂鸣器:
(1)内置震荡电路后形成有源蜂鸣器,直接加电就会响(但是频率规定了的)。
(2)有源蜂鸣器也可以用频率信号驱动。

2、编程让蜂鸣器响起来

18:蜂鸣器_第1张图片
P0.0接上J8

设置频率为1000Hz,则周期为1/1000=1ms,则我们设置延迟为0.5ms(500us)即可。

#include 

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 
#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。

18:蜂鸣器_第2张图片

#include 
#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();
		}
	}
}

你可能感兴趣的:(第一季51单片机,单片机,嵌入式硬件,c语言)