STM学习- -库函数蜂鸣BEEP器实验

STM学习- -库函数蜂鸣BEEP器实验

Thu 14 03:00 06:00 09:00 12:00 03:00 06:00 09:00 Fri 15 已完成 时间安排

主要内容:

  • 蜂鸣器外围电路,驱动管脚确认;
  • 软体处理;

重点掌握内容:

  • 管脚配置函数;
GPIO_InitTypeDef  GPIO_InitStructure;
  
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PB.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);	 //根据设定参数初始化GPIOB.8
  • 管脚输出状态控制函数;
GPIO_Init(GPIOB, &GPIO_InitStructure);	 //根据设定参数初始化GPIOB.8
作用:设置某个IO口输出为高电平(1)。实际操作BSRR寄存器

GPIO_Init(GPIOB, &GPIO_InitStructure);	 //根据设定参数初始化GPIOB.8
作用:设置某个IO口输出为低电平(0)。实际操作的BRR寄存器。
  • 头文件编写;
Buzzer.h

#ifndef __BUZZER_H
#define __BUZZER_H
#include "sys.h"

#define Buzzer PBout(8) // PB8映射BEEP


void Buzzer_Init(void);

#endif

流程图

蜂鸣器实验 硬件处理 GPIOIO控制管脚 1LED0对应PB5 1Buzzer对应PB8 2LED1对应PE5 驱动外围电路 S8050驱动方式 软件处理 主函数main 初始化函数 管脚初始化GPIO 端口时钟使能 端口配置 管脚映射 LED0对应PB5 蜂鸣器初始化 Buzzer对应PB8 LED1对应PE5 输出模式 推挽输出GPIO_Mode_Out_PP 输出速率GPIO_Speed_50MHz 输出电平状态 管脚输出电平状态 GPIO_SetBits端口输出高函数 GPIO_ResetBits端口输出低函数 延时初始化 延时初始化delay_Iint while循环函数 LED灯亮 Buzzer蜂鸣器响 延时函数A LED灯灭 Buzzer蜂鸣器不响 延时函数B

LED控制GPIO IO管脚及外围电路:

  • GPIO IO控制管脚确认:LED0对应PB5管脚,LED1对应PE5管脚
    (PB5、PE5采用推挽输出)

在这里插入图片描述

  • 有源蜂鸣器是指自带了震荡电路的蜂鸣器,这种蜂鸣器一接上电就会自己震荡发声。而如果是无源蜂鸣器,则需要外加一定频率(2~5Khz)的驱动信号,才会发声。这里我们选择使用有源蜂鸣器,方便大家使用。图中 Q1 是用来扩流,R38 则是一个下拉电阻,避免 MCU 复位的时候,蜂鸣器可能发声的现象。
  • BEEP 信号直接连接在 MCU 的 PB8 上面,PB8 可以做 PWM 输出,所以大家如果想玩
    高级点(如:控制蜂鸣器“唱歌”),就可以使用 PWM 来控制蜂鸣器。

/

软体处理:

  • 库函数加载

  • GPIO 源文件stm32f10x_gpio.c 头文件stm32f10x_gpio.h加载

  • stm32f10x_rcc.h

  • misc.h

    • 编写步骤
GPIO管脚初始化函数
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

作用:初始化一个或者多个IO口(同一组)的工作方式和速度。
该函数主要是操作GPIO_CRL(CRH)寄存器,在上拉或者下拉的
时候有设置BSRR或者BRR寄存器

typedef struct
   {
     uint16_t GPIO_Pin;                           //指定要初始化的IO口         
    GPIOSpeed_TypeDef GPIO_Speed; //设置IO口输出速度
    GPIOMode_TypeDef GPIO_Mode;    //设置工作模式:8种中的一个
   }GPIO_InitTypeDef

注释:LED初始化:控制LED管脚GPIO 管脚定义 、输出类型、输出速率、输出初始状态

LED-GPIO_Init函数初始化样例:

GPIO_InitTypeDef  GPIO_InitStructure;
   
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);	 //根据设定参数初始化GPIOB.5

Buzzer-GPIO_Init函数初始化样例:

GPIO_InitTypeDef  GPIO_InitStructure;
   
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //Buzzer-->PB.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);	 //根据设定参数初始化GPIOB.8

/

  • GPIO输出电平函数
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
GPIO_SetBits(GPIOE,GPIO_Pin_5); 
作用:设置某个IO口输出为高电平(1)。实际操作BSRR寄存器

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
GPIO_ResetBits(GPIOE,GPIO_Pin_5); 
作用:设置某个IO口输出为低电平(0)。实际操作的BRR寄存器。

管脚映射:

#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5	
------------------------------------------------------------------------------------------------------
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出 
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入

注释:ODR 是一个端口输出数据寄存器,也只用了低 16 位。 IDR 是一个端口输入数据寄存器,也只用了低 16 位。

软体代码:

--------------------------------------------------------------------------------------------------------
//主函数:
#include "delay.h"
#include "led.h"
#include "buzzer.h"

int main(void)
{	
 delay_init();
 Led_Init();
 Buzzer_Init();
    
    
 while(1)
   {
       Led0=1;
   	Led1=1;
   	Buzzer=0;
   	delay_ms(300);	 //延时300ms
   	
   	Led0=0;
   	Led1=0;
   	Buzzer=1;
   	delay_ms(300);	 //延时300ms
   }
}

----------------------------------------------------------------------------------------------------------
//Led_Init();

#include "led.h"

//初始化PB5和PE5为输出口.并使能这两个口的时钟		    
//LED IO初始化
void Led_Init(void)
{

GPIO_InitTypeDef  GPIO_InitStructure; //Type 类型 Structure结构 
	
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);	 //使能PB,PE端口时钟
   
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_5);						 //PB.5 输出高

   
   
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    		 //LED1-->PE.5 端口配置, 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOE,GPIO_Pin_5); 						 //PE.5 输出高 
}

#ifndef __LED_H
#define __LED_H
#include "sys.h"

#define Led0 PBout(5) // PB5映射LED0
#define Led1 PEout(5) // PB5映射LED0

void Led_Init(void);

#endif
----------------------------------------------------------------------------------------------
// Buzzer_Init();
#include "Buzzer.h"
  
//初始化PB8为输出口.并使能时钟		    
//Buzzer IO初始化
void Buzzer_Init(void)
{

GPIO_InitTypeDef  GPIO_InitStructure; //Type 类型 Structure结构 
	
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能PB,PE端口时钟
   
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;				 //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.5
GPIO_ResetBits(GPIOB,GPIO_Pin_8);						 //PB.5 输出高 
}

Buzzer.h

#ifndef __BUZZER_H
#define __BUZZER_H
#include "sys.h"

#define Buzzer PBout(8) // PB8映射BEEP


void Buzzer_Init(void);

#endif

---------------------------------------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值