蜂鸣器是一种发声设备,被普遍用于计算机、打印机、复印机、报警器、电子玩具等。蜂鸣器分为有源蜂鸣器和无源蜂鸣器。那么什么是有源,什么是无源呢?这里的“源”指的是,振荡电路。也就是说,所谓的有源蜂鸣器是指蜂鸣器内部内置振荡电路,一通电就能响。而无源蜂鸣器,须要外部提供2~5khz左右的方波。
ide
这里,咱们就来经过stm32f103ZET6来实现无源蜂鸣器的发声。首先来分析一下,stm32能经过IO口直接控制蜂鸣器吗?答案是否认的。由于,IO口最大只能提供25mA电流,而蜂鸣器须要30mA电流才能响。那么应该怎么作呢?经过蜂鸣器接一个三极管,利用三极管的较小电流控制较大电流的特性来实现。
函数
经过观察开发板的原理图能够发现,蜂鸣器就是经过PB口的PB5来实现控制,每隔一段时间产生一个高低电平产生一个2~5Khz左右的方波来驱动蜂鸣器。
spa
跟以前驱动LED同样,咱们如今想要驱动蜂鸣器,首先也要对蜂鸣器进行初始化,也就是端口的初始化。代码以下:
blog
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 }
接着,咱们要实现蜂鸣器发声。也就是,每隔一段时间产生一个方波。代码以下:
ip
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; }