STM32工作笔记0034---蜂鸣器实验-M3

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152

可以看一下了解一下,蜂鸣器的概念,原理

这里说一下蜂鸣器的电路设计,有些人,可以这样设计,左下角:

左边,接一个高电平1,然后右边接入蜂鸣器,这个时候,会产生压差,蜂鸣器就会叫。

如果,左边接入一个低电平,蜂鸣器就不会叫。

这样简单的电路设计,肯定是很不合理的,因为会有问题,首先接入的电压不确定,

可能需要调节电压,另外,电压,电流,也可能会由于不稳定的原因导致,蜂鸣器乱叫。

上面是比较好的,经过测试的电路设计,可以看到,这里有个三极管,这个三极管的左端也就是Q1,

电流,经过这个三极管的左端的时候,电流可以被放大,可能由于电流不够,蜂鸣器不会叫。

一般的接法,都是左边接个10k或者多少的电阻,然后右边接一个三极管,然后后边再接,继电器,或者蜂鸣器。

然后可以看到,R38,三极管前面还有个电阻10k的,这个作用是什么呢?也就是,当电源复位的时候,

这个时候的电压可能是浮空状态,浮空状态的电压是不确定的,可能会导致,压差不稳定,导致蜂鸣器会乱叫,

这个时候,加这个R38的作用,就是,比如当复位的时候,这个时候压差比较小,会产生比较小的电流,

而这个时候,加这个下拉电阻,就把电平,拉到低电平,这样,就不会产生压差,复位的时候,蜂鸣器就不会

乱叫了。

这样,复位的时候小电流,没有达到额定电流的电流,就不会经过Q1,通过三极管放大。

避免了乱叫。

这里如果没有R38的时候,蜂鸣器可能会叫。

蜂鸣器的位置:

流程:

这里,库函数版的:

打开这个程序,用mdk软件。

首先编写:

beep.h

#ifndef __BEEP_H
#define __BEEP_H	 
#include "sys.h"
//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK精英STM32开发板
//蜂鸣器驱动代码	   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/2
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved									  
// 
//蜂鸣器端口定义
#define BEEP PBout(8)	// BEEP,蜂鸣器接口		   

void BEEP_Init(void);	//初始化
		 				    
#endif

可以看到里面有个PBout(8)

这个是因为:

从硬件连接可以看到,蜂鸣器他连接的是PB8这个引脚。

因为前面写过了,这里不过详细说明了。

然后再看:

beep.c

#include "beep.h"
//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK 精英STM32开发板
//蜂鸣器驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/2
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//

//初始化PB8为输出口.并使能这个口的时钟
//蜂鸣器初始化
void BEEP_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB端口时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;         //BEEP-->PB.8 端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度为50MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);            //根据参数初始化GPIOB.8

    GPIO_ResetBits(GPIOB, GPIO_Pin_8); //输出0,关闭蜂鸣器输出
}

注意,上面看电路图,咱们知道他用的是P8,也就是GPIOB ,然后第8个IO口

这个时候首先去使能时钟,这个时候:

右键RCC_APB2PeriphClockCmd就能去定义的部分找到,定义的时钟,GPIOB

/** @defgroup APB2_peripheral 
  * @{
  */

#define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)
#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)
#define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)
#define RCC_APB2Periph_GPIOE             ((uint32_t)0x00000040)
#define RCC_APB2Periph_GPIOF             ((uint32_t)0x00000080)
#define RCC_APB2Periph_GPIOG             ((uint32_t)0x00000100)
#define RCC_APB2Periph_ADC1              ((uint32_t)0x00000200)
#define RCC_APB2Periph_ADC2              ((uint32_t)0x00000400)
#define RCC_APB2Periph_TIM1              ((uint32_t)0x00000800)
#define RCC_APB2Periph_SPI1              ((uint32_t)0x00001000)
#define RCC_APB2Periph_TIM8              ((uint32_t)0x00002000)
#define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)
#define RCC_APB2Periph_ADC3              ((uint32_t)0x00008000)
#define RCC_APB2Periph_TIM15             ((uint32_t)0x00010000)
#define RCC_APB2Periph_TIM16             ((uint32_t)0x00020000)
#define RCC_APB2Periph_TIM17             ((uint32_t)0x00040000)
#define RCC_APB2Periph_TIM9              ((uint32_t)0x00080000)
#define RCC_APB2Periph_TIM10             ((uint32_t)0x00100000)
#define RCC_APB2Periph_TIM11             ((uint32_t)0x00200000)

#define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFC00002) == 0x00) && ((PERIPH) != 0x00))

可以看到有对应的GPIOB所以这里用这个APB2这个时钟,也有APB1这个时钟的,但是APB1这个时钟上

没有GPIOB。

这个时候,比如输入一个低电平,然后可以看到,三极管被下拉电阻,拉成低电平,

三极管截止,这个是没有电流通过,蜂鸣器关闭。

高电平的时候,虽然两边的压差一样,都会输出高电平,但是

经过三极管的电流会被放大,这样蜂鸣器就会响。

这里要注意,记得把beep.h这个头文件引入。

然后再去main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "beep.h"

/************************************************
 ALIENTEK精英STM32开发板实验2
 蜂鸣器实验       
 技术支持:www.openedv.com
 淘宝店铺:http://eboard.taobao.com 
 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
 广州市星翼电子科技有限公司  
 作者:正点原子 @ALIENTEK
************************************************/

int main(void)
{
	delay_init(); //延时函数初始化
	LED_Init();	  //初始化与LED连接的硬件接口
	BEEP_Init();  //初始化蜂鸣器端口
	while (1)
	{
		LED0 = 0;
		BEEP = 0;
		delay_ms(300); //延时300ms
		LED0 = 1;
		BEEP = 1;
		delay_ms(300); //延时300ms
	}
}

注意,这里:

上面的初始化就不说了。

然后

    LED0 = 0; 
        BEEP = 0;
        delay_ms(300); //延时300ms
        LED0 = 1;
        BEEP = 1;
        delay_ms(300); //延时300ms

这里这个BEEP=0这个,之所以可以这样写,是因为定义了别名,可以看到。

可以看到其实相当于PBout(8)=0

然后BEEP=1相当于PBout(8)=1

然后连接flymcu进行测试:

猜你喜欢

转载自blog.csdn.net/lidew521/article/details/108069969