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)点击运行,开始模拟。点击按钮后,蜂鸣器发出警报。

物联沃分享整理
物联沃-IOTWORD物联网 » Keil+Proteus有源蜂鸣器的实现

发表评论