STM32蜂鸣器驱动程序

文章目录

  • 蜂鸣器硬件电路
  • 添加文件进入工程
  • 了解buzzer.c和buzzer.h
  • 修改main.c
  • 复制BUZZER_BEEP1.c修改参数尝试更多频率


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

蜂鸣器硬件电路

STM32蜂鸣器驱动程序_第1张图片

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

STM32蜂鸣器驱动程序_第2张图片

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

添加文件进入工程

STM32蜂鸣器驱动程序_第3张图片
在keil4工程中添加上面文件按照之前的文章方式。
STM32蜂鸣器驱动程序_第4张图片
STM32蜂鸣器驱动程序_第5张图片

了解buzzer.c和buzzer.h

STM32蜂鸣器驱动程序_第6张图片
STM32蜂鸣器驱动程序_第7张图片

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

STM32蜂鸣器驱动程序_第8张图片

#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)); //等待按键松开 
			}
		}
	}
}

STM32蜂鸣器驱动程序_第9张图片
烧录验证,得到预期结果。

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

STM32蜂鸣器驱动程序_第10张图片
STM32蜂鸣器驱动程序_第11张图片
STM32蜂鸣器驱动程序_第12张图片
STM32蜂鸣器驱动程序_第13张图片
烧录验证成功。

你可能感兴趣的:(stm32)