一.蜂鸣器简介
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电
电磁式的有源蜂鸣器
这里的有源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器自带了震荡电路,
一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供 2~5Khz 左右的方波驱动,
才能发声。
STM32F1 的单个 IO 最大可以提供 25mA 电流(来自数据手册),而蜂鸣器的驱动电流是 30mA左右,两者十分相近,但是全盘考虑,STM32F1 整个芯片的电流,最大也就 150mA,如果用IO 口直接驱动蜂鸣器,其他地方用电就得省着点了…所以,我们不用 STM32F1 的 IO 直接驱动
蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样 STM32F1 的 IO 只需要提供不到 1mA 的
电流就足够了。
二.蜂鸣器实现
实验步骤:①使能IO口时钟,调用RCCAPB2PeriphColckCmd();
通过 "stm32f10x_rcc.h"文件中寻找到GPIOB的使能时钟函数 为RCC_APB2
②初始化IO口模式。调用BEEP_Init();
③操作IO口,输出高低电平。
1.硬件设计
1)指示灯 DS0
2)蜂鸣器
蜂鸣器的驱动信号连接在 STM32F1 的 PB8 上。原理图如下。
图中我们用到一个 NPN 三极管(S8050)来驱动蜂鸣器,R33 主要用于防止蜂鸣器的误发
声。当 PB.8 输出高电平的时候,蜂鸣器将发声,当 PB.8 输出低电平的时候,蜂鸣器停止发声。
2.软件设计
工程搭建与库函数版本相同,这里就不多赘述。
需要新搭建:HARDWARE--->LED--->led.c和led.h文件 , 用魔术棒添加文件路径
led.h代码如下
#ifndef __BEEP_H
#define __BEEP_H
#include "sys.h"
#define BEEP PBout(8) // BEEP,蜂鸣器接口
void BEEP_Init(void); //初始化
#endif
代码分析:a.设置蜂鸣器接口为PB_8 #define BEEP PBout(8)
b.初始函数 void BEEP_Init(void);
led.c代码如下
#include "beep.h"
#include "stm32f10x_it.h"
#include "sys.h"
void BEEP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//使能PB
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//设置GPIO
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //位8
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化GPIOB
GPIO_SetBits(GPIOB,GPIO_Pin_8); //PB.5 输出高电位,关闭蜂鸣器
}
与跑马灯原理一致,改换GPIO接口为GPIPB_8即可。
主函数
#include "stm32f10x.h"
#include "delay.h"
#include "beep.h"
#include "sys.h"
int main(void)
{
delay_init(); //延时函数初始化
BEEP_Init(); //初始化蜂鸣器端口
while(1)
{
BEEP=0;
delay_ms(300); //延时300ms
BEEP=1;
delay_ms(300); //延时300ms
}
}