STM32蜂鸣器驱动程序


杨桃32学习笔记,本文图片文字皆为转述

蜂鸣器硬件电路

在这里插入图片描述

有源蜂鸣器:
内置频率发生电路
通电就能发出声音
声音频率固定
成本较高
无源蜂鸣器:
内部没有发生电路
需要外部给予频率
可产生不同频率声音
成本低

在这里插入图片描述

PB5输出高电平蜂鸣器断开
PB5输出低电平蜂鸣器导通
在不使用蜂鸣器的情况下,PB5给出高电平以免损坏蜂鸣器。
由图示电路可知,PB5不工作时由上拉电阻使蜂鸣器断开
不同的高低电平频率会产生不同的声音
频率周期的数量决定了蜂鸣器发生的时间长度,高低电平占用的时间决定音调
发出1khz声音,每秒1000个周期,即每个周期1000us,也就是每个时间周期
使用0.001s=1000us

添加文件进入工程

在这里插入图片描述
在keil4工程中添加上面文件按照之前的文章方式。
在这里插入图片描述
在这里插入图片描述

了解buzzer.c和buzzer.h

在这里插入图片描述
在这里插入图片描述

void BUZZER_Init(void){ //蜂鸣器的接口初始化
	GPIO_InitTypeDef  GPIO_InitStructure; 	
    GPIO_InitStructure.GPIO_Pin = BUZZER; //选择端口号                        
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式       
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)    
	GPIO_Init(BUZZERPORT, &GPIO_InitStructure);	
	//初始化蜂鸣器状态为关闭
	GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鸣器接口输出高电平1		
}

void BUZZER_BEEP1(void){ //蜂鸣器响一声
	u16 i;
	for(i=0;i<200;i++){	 //产生200蜂鸣器频率周期脉冲   i值越大发出声响时间越长
	    //一共1000us按照原理图产生1khz
		GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鸣器接口输出0
		delay_us(500); //延时	 时间越短声调越高	
		GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鸣器接口输出高电平1	 以高电平结束放置蜂鸣器处于导通而损耗
		delay_us(500); //延时		
	}

修改main.c

在这里插入图片描述

#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "flash.h" 

#include "buzzer.h" 
#define FLASH_START_ADDR  0x0801f000	  //写入的起始地址

int main (void){//主程序
	u8 a; //定义变量
	//初始化程序
	RCC_Configuration(); //时钟设置
	LED_Init();//LED初始化
	KEY_Init();//按键初始化

	BUZZER_Init();//蜂鸣器初始化
	BUZZER_BEEP1();//蜂鸣器响1khz

	a = FLASH_R(FLASH_START_ADDR);//从指定页的地址读FLASH
	//因为led是PB0和PB1 蜂鸣器是PB5 所以逻辑灯时除了低位都为零所以下面语句需要修改
	GPIO_Write(LEDPORT,a|0xfffc&GPIO_ReadOutputData(LEDPORT)); //直接数值操作将变量值写入LED(LED在GPIOB组的PB0和PB1上)
	//GPIO_ReadOutputData读取整组(LED在GPIOB组)的io口的电平状态	 按位与优先级高
	//0xfffc&GPIO_ReadOutputData(LEDPORT))高14位保持io口的原来状态 c=1100 地两位清零
	//然后与a进行与运算将led状态写入 也就是说led在状态写入的时候不会影响其他io电平

	//主循环
	while(1){
		//示例4:有锁存
		if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
			delay_ms(20); //延时20ms去抖动
			if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
				//在2个LED上显示二进制加法
				a++; //变量加1
				if(a>3){ //当变量大于3时清0
					a=0; 
				}
				GPIO_Write(LEDPORT,a|0xfffc&GPIO_ReadOutputData(LEDPORT)); //整组写入不是某个引脚直接数值操作将变量值写入LED(LED在GPIOB组的PB0和PB1上)
				//a=1是001->pa0=1,a=2是010->pa0=0 pa1=1,a=3是011->pa0=1 pa1=1,a=4是100->pa0=0 pa1=0
				BUZZER_BEEP1();//蜂鸣器音1

				FLASH_W(FLASH_START_ADDR,a); //从指定页的地址写入FLASH

				while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键松开 
			}
		}
	}
}

在这里插入图片描述
烧录验证,得到预期结果。

复制BUZZER_BEEP1.c修改参数尝试更多频率

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
烧录验证成功。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值