蜂鳴器是一種發聲設備,被普遍用於計算機、打印機、複印機、報警器、電子玩具等。蜂鳴器分爲有源蜂鳴器和無源蜂鳴器。那麼什麼是有源,什麼是無源呢?這裏的「源」指的是,振盪電路。也就是說,所謂的有源蜂鳴器是指蜂鳴器內部內置振盪電路,一通電就能響。而無源蜂鳴器,須要外部提供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; }