目录
8.1 蜂鸣器
蜂鸣器是一种常用的电子元件,它可以将电信号转换为声音信号。蜂鸣器通常由振荡器和扬声器两部分组成。振荡器产生高频交流电信号,经过扬声器的震动使空气中形成声波,从而发出声音。
根据工作原理的不同,蜂鸣器可以分为以下两类:
有源蜂鸣器:有源蜂鸣器需要外部提供驱动信号,通常采用交流或直流信号作为输入。它能够产生比较高的音量,并且音质较好,但功耗较大。
无源蜂鸣器:无源蜂鸣器不需要外部驱动信号,它本身就是一个简单的振荡电路,在电压变化时会自动产生声音。它的优点是功耗低,但音量相对较小,音质也较差。
除了以上两种基本类型外,还有一些特殊的蜂鸣器,如可编程蜂鸣器、多音蜂鸣器等,它们可以按照程序或者开关进行控制,实现多种音调、节奏的变化。
蜂鸣器广泛应用于各种电子设备中,如警报器、定时器、计数器、电子钟表等,是一种非常重要的声音输出元件。
8.2 实验要求
利用固件库使板载的蜂鸣器模块按一定规律响和不响。
8.3 硬件设计
蜂鸣器直接与3.3V电压连接通过一个三极管与芯片的端口连接,所以在驱动蜂鸣器发出声音时只需要让PC0端口输出高电平即可让蜂鸣器发出声音。
8.4 软件设计
利用固件库编写“bsp_buzzer.c”和“bsp_buzzer.h”文件,实现对蜂鸣器相关端口,时钟进行初始化。
8.4.1 蜂鸣器端口宏定义
#ifndef _BSP_BUZZER_H
#define _BSP_BUZZER_H
#include "stm32f10x.h"
#define BUZZER_GPIO_PORT GPIOC
#define BUZZER_GPIO_CLK RCC_APB2Periph_GPIOC
#define BUZZER_GPIO_PIN GPIO_Pin_0
#define digitalHi(p,i) {p->BSRR = i;}
#define digitalLo(p,i) {p->BRR = i;}
#define digitalToggle(p,i) {p->ODR ^= i;}
#define BUZZER_Toggle digitalToggle(BUZZER_GPIO_PORT,BUZZER_GPIO_PIN)
#define BUZZER_OFF digitalHi(BUZZER_GPIO_PORT,BUZZER_GPIO_PIN)
#define BUZZER_ON digitalLo(BUZZER_GPIO_PORT,BUZZER_GPIO_PIN)
void BUZZER_GPIO_Config(void);
void BUZZER_CRY(uint32_t a);
#endif /*_BSP_BUZZER_H*/
文件中对PC0端口,PIN脚,相关时钟,以及功能函数进行了初始化,并且还定义了控制蜂鸣器状态的标志BUZZER_ON,BUZZER_OFF。
8.4.2 蜂鸣器端口初始化函数
#include "bsp_buzzer.h"
void BUZZER_GPIO_Config(void)
{
//定义一个GPIO_InitTypeDef类型的结构体
GPIO_InitTypeDef GPIO_InitStruct;
//开启控制蜂鸣器的GPIO的端口时钟
RCC_APB2PeriphClockCmd(BUZZER_GPIO_CLK,ENABLE);
//模式设置
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = BUZZER_GPIO_PIN;
GPIO_Init(BUZZER_GPIO_PORT,&GPIO_InitStruct);
//关闭蜂鸣器
GPIO_ResetBits(BUZZER_GPIO_PORT, BUZZER_GPIO_PIN);
}
文件中“void BUZZER_GPIO_Config(void)”函数实现了对相关端口的初始化。
8.4.3 蜂鸣器发声函数
void BUZZER_CRY(uint32_t a)
{
if(a == 1)
{
GPIO_SetBits(BUZZER_GPIO_PORT,BUZZER_GPIO_PIN);
}
else if(a == 0)
{
GPIO_ResetBits(BUZZER_GPIO_PORT, BUZZER_GPIO_PIN);
}
}
“void BUZZER_CRY(uint32_t a)”函数实现蜂鸣器的响与不响的选择,函数需要一个参数,可以使用蜂鸣器端口宏定义文件中的控制蜂鸣器状态标志位来作为参数使蜂鸣器发出声音。
8.4.4 主函数设计
#include "stm32f10x.h"
#include "bsp_buzzer.h"
#define SOFT_DELAY delay(0XFFFFF)
void delay(uint32_t count);
int main(void)
{
BUZZER_GPIO_Config();
while(1)
{
BUZZER_CRY(BUZZER_ON);
SOFT_DELAY;
BUZZER_CRY(BUZZER_OFF);
SOFT_DELAY;
}
}
void delay(uint32_t count)
{
for(;count != 0;count--);
}
代码中首先对蜂鸣器端口进行了初始化,在while循环里让蜂鸣器响一段时间后不响,以此循环操作。
8.5 下载验证
编译完成后将程序烧写到开发板中能够观察到蜂鸣器按一定规律的响和不响的循环。
谢谢阅读!