蜂鸣器是一种发声设备,被广泛用于计算机、打印机、复印机、报警器、电子玩具等。蜂鸣器分为有源蜂鸣器和无源蜂鸣器。那么什么是有源,什么是无源呢?这里的“源”指的是,振荡电路。也就是说,所谓的有源蜂鸣器是指蜂鸣器内部内置振荡电路,一通电就能响。而无源蜂鸣器,需要外部提供2~5khz左右的方波。

   这里,我们就来通过stm32f103ZET6来实现无源蜂鸣器的发声。首先来分析一下,stm32能通过IO口直接控制蜂鸣器吗?答案是否定的。因为,IO口最大只能提供25mA电流,而蜂鸣器需要30mA电流才能响。那么应该怎么做呢?通过蜂鸣器接一个三极管,利用三极管的较小电流控制较大电流的特性来实现。

wKioL1nR0t_xaqGfAAAaQ9V7Sss848.jpg-wh_50

通过观察开发板的原理图可以发现,蜂鸣器就是通过PB口的PB5来实现控制,每隔一段时间产生一个高低电平产生一个2~5Khz左右的方波来驱动蜂鸣器。

wKiom1nR0_nhOhUIAAC9pA85Pbc385.png-wh_50

   跟之前驱动LED一样,我们现在想要驱动蜂鸣器,首先也要对蜂鸣器进行初始化,也就是端口的初始化。代码如下:

void BEEP_Init ( void ){
	
	GPIO_InitTypeDef GPIO_InitStructure;   //申明一个结构体变量,用来初始化IO
	
	SystemInit ();
	
	RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOB, ENABLE );  //开启GPIO时钟
	
	//配置GPIOB和IO端口
	GPIO_InitStructure.GPIO_Pin = BZ;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init ( GPIOB, &GPIO_InitStructure ); //初始化GPIO
	
}

接着,我们要实现蜂鸣器发声。也就是,每隔一段时间产生一个方波。代码如下:

void sound1 ( void )
{
	unsigned int i = 5000;
	while ( i-- ){
		
		GPIO_SetBits ( GPIOB, BZ );
		delay ( i );
		GPIO_ResetBits ( GPIOB, BZ );
		delay ( i-- );
	}
	
}

void sound2 ( void ){
	
	unsigned int i = 1000;
	while ( i-- ){
		
		GPIO_SetBits ( GPIOB, BZ );
		delay ( i );
		GPIO_ResetBits ( GPIOB, BZ );
		delay ( i-- );
	}
	
}

   最后,在主函数内部,我们调用初始化函数,对端口进行初始化,然后,调用发声函数,控制蜂鸣器发声。代码如下:

int main()
{
	BEEP_Init();
	
	while ( 1 ){
		
		//sound1 ();
		
		sound2 ();
	}
	
	
//	return 0;
}