一.无源蜂鸣器
无源蜂鸣器在全高或全低电平的状态下不会发声。这是因为无源蜂鸣器内部没有振荡电路,它需要外部提供一定频率的交流信号才能工作 。当提供直流电时,无源蜂鸣器不会响,只有当外部提供一个方波信号时,它才能发声 。全高或全低电平无法提供必要的交流成分,因此无法驱动蜂鸣器发声。
二.有源蜂鸣器
有源蜂鸣器在全高或全低电平的状态下是可以发声的。有源蜂鸣器内部包含振荡电路,因此当通电后,即使输入的是直流电平,它也能自动产生一定频率的方波来驱动蜂鸣器发声 。这意味着你只需要给有源蜂鸣器一个稳定的高电平或低电平,它就会因为内部电路的作用而开始发声。
总结:无源蜂鸣器的工作原理是通过在两个腿上加载不同频率的电信号来发声,而有源蜂鸣器则需要在两个腿上加上电压信号就会发声 。无源蜂鸣器需要的驱动信号通常是方波,频率在几百到几千赫兹之间,这取决于蜂鸣器的设计 。因此,为了使无源蜂鸣器发声,必须提供适当的交流信号,而不是单一的高或低电平。
示例代码:
/***************************************************
*函数名称: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(); //按键
}
}