技术交流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进行测试: