Keil+Proteus有源蜂鸣器的实现
1.实验目的
实现点击按钮后,蜂鸣器以两种不同的方式进行警报。
2.Keil代码
(1)首先将我们之前的Keil+Proteus工程模板拷贝
(2)在MDK μ Vision4软件中,在我们刚才拷贝的工程模板内创建一个新项目。
(3)创建beepkey.h文件,将其保存在APP文件夹中。其代码如下所示:
#ifndef _BEEPKEY_H
#define _BEEPKEY_H
#include "stm32f10x.h"
#include "systick.h"
void delay(u32 i);
void BeepInit(void);
void KeyInit(void);
void sound1(void);
void sound2(void);
void BeepKey(void);
#endif
(4)在APP文件夹中创建beepkey.c文件,代码如下所示:
#include "beepkey.h"
void delay(u32 i)
{
while(i--);
}
// 蜂鸣器端口初始化函数,通过改变频率控制蜂鸣器声音变化
void BeepInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开启GPIO时钟->PC引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;// 选择要设置的I/O口为8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置传输速率
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
// 按键端口初始化函数
void KeyInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//开启GPIO时钟->PE引脚
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOE,&GPIO_InitStructure);
}
// 蜂鸣器报警函数
void sound1()
{
u32 i=5000;
while(i--)
{
GPIO_SetBits(GPIOC,GPIO_Pin_8);// I/O口输出高电平
delay(i);
GPIO_ResetBits(GPIOC,GPIO_Pin_8);// I/O口输出低电平
delay(i--);
}
}
void sound2()
{
u32 i=1000;
while(i--)
{
GPIO_SetBits(GPIOC,GPIO_Pin_8);// I/O口输出高电平
delay(i);
GPIO_ResetBits(GPIOC,GPIO_Pin_8);// I/O口输出低电平
delay(i--);
}
}
void BeepKey()
{
while(1)
{
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==0)// 判断按键PC0是否按下
{
delay_ms(10);// 消抖处理
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==0)// 再次判断按键PC0是否按下
{
sound1();
}
while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==0);
}
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)==0) // 判断按键PC1是否按下
{
delay_ms(10);
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)==0)// 再次判断按键PC1是否按下
{
sound2();
}
while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)==0);//等待按键松开
}
}
}
上述代码,将PC0和PC1作为控制蜂鸣器发出声响的引脚。蜂鸣器使用引脚PC8。
(5)在public.h文件中,添加一行#include "beepkey.h",其代码如下所示:
#ifndef _public_H
#define _public_H
#include "stm32f10x.h"
#include "beepkey.h"
#endif
(6)将main.c修改为:
#include "public.h"
int main()
{
BeepInit();
KeyInit();
BeepKey();
}
3.Proteus仿真
(1)绘制原理图如下图所示:
使用到的元件有BUZZER(ACTIVE)、RES、PNP、STM32F103R6、BUTTON。
蜂鸣器的驱动电流较大,IO口无法直接驱动,所以需要经过三极管放大电流驱动。
蜂鸣器元件,选择对应Library为ACTIVE的蜂鸣器。
(2)双击已经绘制好的原理图中的STM32F103R6单片机,将STM32F103R6的晶体频率不可以使用默认值,否则会导致软件卡死。本实验中将其修改为50M。
(3)双击蜂鸣器,将其电压值改为5V,使用默认值12V的话,蜂鸣器不响。
(4)点击菜单栏中Design-> Configure Power Rails,将未连接电线中的VDDA和VSSA连接到VCC/VDD中,如下图所示:
然后点击Add即可。
(5)点击运行,开始模拟。点击按钮后,蜂鸣器发出警报。