蜂鸣器驱动程序

一.无源蜂鸣器

无源蜂鸣器在全高或全低电平的状态下不会发声。这是因为无源蜂鸣器内部没有振荡电路,它需要外部提供一定频率的交流信号才能工作 。当提供直流电时,无源蜂鸣器不会响,只有当外部提供一个方波信号时,它才能发声 。全高或全低电平无法提供必要的交流成分,因此无法驱动蜂鸣器发声。

二.有源蜂鸣器

有源蜂鸣器在全高或全低电平的状态下是可以发声的。有源蜂鸣器内部包含振荡电路,因此当通电后,即使输入的是直流电平,它也能自动产生一定频率的方波来驱动蜂鸣器发声 。这意味着你只需要给有源蜂鸣器一个稳定的高电平或低电平,它就会因为内部电路的作用而开始发声。

总结:无源蜂鸣器的工作原理是通过在两个腿上加载不同频率的电信号来发声,而有源蜂鸣器则需要在两个腿上加上电压信号就会发声 。无源蜂鸣器需要的驱动信号通常是方波,频率在几百到几千赫兹之间,这取决于蜂鸣器的设计 。因此,为了使无源蜂鸣器发声,必须提供适当的交流信号,而不是单一的高或低电平。

示例代码:

/***************************************************
*函数名称:TIMER0_Init
*输	   入:void
*输	   出:void 
*说	   明:125us定时中断
***************************************************/
void TIMER0_Init(void)
{
    TMCON |= 0X05;    //Timer1选择时钟Fsys=24M/12=2M=0.5us、Timer2选择时钟Fsys=24M

	//T2设置
	T2MOD = 0x00;
	T2CON = 0x00;	 //设置为16位重载寄存器
	RCAP2H =(65536-3000)/256;//溢出时间:时钟为Fsys=24M=(1/24M)us,则125us/(1/24M)(us)=3000
	RCAP2L = (65536-3000)%256;
	TR2 = 0;
	ET2 = 1;//定时器2允许
	TR2 = 1;//打开定时器2	
	
	EA = 1; //开启中断
}

/**************************************************
*函数名称:Timer2Int(void) interrupt 5
*函数功能:定时器中断
*入口参数:void
*出口参数:void
**************************************************/
void Timer2Int(void) interrupt 5
{
	uchar i=0;
	Buz_Driver();

	if (++ main_cnt >= 20)			//2.5ms
	{
		main_cnt = 0;
		main_loop = 1;
	}
	
	TF2 = 0;   //溢出清零
	
}
#include "H/SC92F741X_C.H"

#define	BUZ_IDLE_LEVEL		1		//闲置电平: 0/1
#define	   PO_buz		     P01

bit    b_buz_on = 0;
bit b_buz_blink = 0;

//buz
uint16_t     buz_cnt0   = 0;
uint8_t     buz_cnt1   = 0;
uint8_t     buz_state  = 0;   //蜂鸣器状态 buz_state
uint16_t  gu16ShortTime = 0;


/***************************************************
*函数名称:Buz_Driver
*输	   入:void
*输	   出:void
*说	   明:蜂鸣器驱动
***************************************************/
void Buz_Driver(void)
{
	if(b_buz_on)
		PO_buz ^= 1;
	else
		PO_buz = BUZ_IDLE_LEVEL;		
}

/***************************************************
*函数名称:Timing_Buz
*输	   入:void
*输	   出:void
*说	   明:蜂鸣器计时
***************************************************/
void Timing_Buz(void)
{
	switch (buz_state)
	{
		//关
		case BUZ_OFF:	
					b_buz_on = 0;
					break;
        //短响一次
		case BUZ_SHORT:
					gu16ShortTime = 50;		//50*2.5 = 125ms按键或锁按键时快速短响	
					if (!b_buz_blink)
					{
						b_buz_on = 1;
						if (++ buz_cnt0 >= gu16ShortTime)
						{
							buz_cnt0 = 0;
							b_buz_blink = 1;
						}
					}
					else
					{
						b_buz_on = 0;
						if (++ buz_cnt0 >= 32)		//32*2.5ms=80ms
						{
							buz_cnt0 = 0;
							b_buz_blink = 0;
							
							if (-- buz_cnt1 == 0)
								buz_state = 0;
						}
					}
					break;
				
		//长响一次
		case BUZ_LONG:
				
					b_buz_on = 1;
					if (++ buz_cnt0 >= 200)			//500ms		
					{	
						buz_cnt0 = 0;
						buz_state = 0;
					}
					break;
			
		//报警N次
		case BUZ_ALARM:
				
					if (!b_buz_blink)
					{
						b_buz_on = 1;
						if (++ buz_cnt0 >= 50)	  //50*2.5 = 125ms
						{
							buz_cnt0 = 0;
							b_buz_blink = 1;
						}
					}
					else
					{
						b_buz_on = 0;
						if (++ buz_cnt0 >= 50)			//50*2.5 = 125ms
						{
							buz_cnt0 = 0;
							b_buz_blink = 0;
							
							if (-- buz_cnt1 == 0)
								buz_state = 0;
						}
					}
					break;
		//一直响,不停
		case BUZ_ALLTIME:
					b_buz_on = 1;
					break;
					
		default:	break;				
		
	}

}

/***************************************************
*函数名称:Buz_Config
*输	   入:状态,次数
*输	   出:void
*说	   明:配置蜂鸣器响状态
***************************************************/
void Buz_Config(uchar state, uchar cnt1)
{
	buz_state = state;
	buz_cnt1 = cnt1;
	buz_cnt0 = 0;
	b_buz_blink = 0;
	
}
#include  "key.h"
#define key0 P12
void key()
{
    if(key0 == 0)
    {
        Buz_Config(BUZ_SHORT,1);  //按下按键短响一声,这里要等待松开再响,松开的代码没有写
    }
}
void main(void)
{

        if (main_loop)			//2.5ms,定时器运行
		{
			main_loop = 0;
			Timing_Buz();			  //蜂鸣器
            key();                    //按键
		}

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值