硬件原理
图中们用到一个 NPN 三极管(S8050)来增大驱动力从而驱动蜂鸣器,R33用于防止蜂鸣器的误发声(当STM32上电时,IO口处于浮空输入模式,即输入引脚既不连接到高电平也不连接到低电平,此状态可能会导致输入信号漂移或产生不确定的结果从而产生微弱电流,从而导致蜂鸣器误发声,而R33可以将弱电流直接引到地,减少误发声的概率)
PB.8 输出高电平的时,蜂鸣器发声,PB.8 输出低电平的时,蜂鸣器停止发声
代码原理
1.使能IO口时钟
RCC_APB2PeriphClockCmd()
2.配置IO口模式
调用GPIO_Init()
3.操作IO口以一定频率交替输出高低电平,从而使蜂鸣器发声
这里使用位操作的方法,直接对 PBout(8) 置1置0,用 GPIO_SetBits(GPIOB,GPIO_Pin_8) 和 GPIO_ResetBits(GPIOB,GPIO_Pin_8) 也是OK的
频率会影响蜂鸣器发出的音调 详见B站51教程
代码
1.Beep.c
#include "stm32f10x.h" // Device header
#include "Beep.h"
void Beep_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //BEEP-->GPIOB.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度为 50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure); //配置IO口
GPIO_ResetBits(GPIOB,GPIO_Pin_8); //IO口置零,蜂鸣器高电平有效,低电平无效,不响
}
2.Beep.h
#ifndef _Beep_H_
#define _Beep_H_
#include "sys.h" //为了引用 PBout(8)
/* 端口定义 */
#define BEEP PBout(8) // BEEP,蜂鸣器接口
void Beep_Init(void);
#endif
3.main.c
#include "stm32f10x.h" // Device header
#include "Beep.h"
#include "Delay.h"
int main(void)
{
delay_init();
Beep_Init();
while(1)
{
BEEP = 1;
delay_ms(300);
BEEP = 0;
delay_ms(300);
}
}