【STM32F103ZET6——库函数】2.按键控制蜂鸣器

目录

配置按键引脚

引脚图

使能按键引脚时钟

配置蜂鸣器引脚

引脚图

使能蜂鸣器引脚时钟

例程

例程说明

main.h

main.c

Key.h

Key.c

FengMingQi.h

FengMingQi.c

配置按键引脚

引脚图

  1. 配置引脚号

  2. 配置引脚速度

  3. 配置引脚的模式

  4. 引脚初始化

GPIO_InitTypeDef Key;
//PA0
Key.GPIO_Pin=GPIO_Pin_0;
Key.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
Key.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&Key);//初始化PA0引脚
GPIO_WriteBit(GPIOA,GPIO_Pin_0,0);
//PC13
Key.GPIO_Pin=GPIO_Pin_13;
GPIO_Init(GPIOC,&Key);
GPIO_WriteBit(GPIOC,GPIO_Pin_13,0);

使能按键引脚时钟

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

配置蜂鸣器引脚

引脚图

  1. 配置引脚号

  2. 配置引脚速度

  3. 配置引脚的模式

  4. 引脚初始化

GPIO_InitTypeDef FMQ;
//PC0
FMQ.GPIO_Pin=GPIO_Pin_0;
FMQ.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
FMQ.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&FMQ);
GPIO_WriteBit(GPIOC,GPIO_Pin_0,0);

使能蜂鸣器引脚时钟

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

例程

例程说明

通过按键控制蜂鸣器响还是不响

main.h

#ifndef _MAIN_H_
#define _MAIN_H_

#include "stm32f10x.h"                  // Device header
#include "stm32f10x_gpio.h"             // Keil::Device:StdPeriph Drivers:GPIO
#include "stm32f10x_tim.h"              // Keil::Device:StdPeriph Drivers:TIM
#include <stm32f10x_rcc.h>
#include <stm32f10x_usart.h>
#include <stm32f10x_sdio.h>
#include <misc.h>
#include <stdio.h>
#include "usart.h"
#include <delay.h>
#include "timch.h"

#include "Key.h"
#include "FengMingQi.h"

#endif

main.c

#include "main.h"

int main(){
	u8 key_num;
	u8 FMQ=0;

	delay_init();
	Key_Init();
	FengMingQi_Init();
	while(1){	
		key_num=Key_GetKeynum();
		if(key_num==1){
			FengMingQi_NO();
		}
		else if(key_num==2){
			FengMingQi_OFF();
		}
	}
}

Key.h

#ifndef __KEY_H_
#define __KEY_H_

#include "stdio.h"
#include "delay.h"

void Key_Init();
u8 Key_GetKeynum();

#endif

Key.c

#include "Key.h"

void Key_Init(){
	GPIO_InitTypeDef Key;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	
	Key.GPIO_Pin=GPIO_Pin_0;
	Key.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
	Key.GPIO_Speed=GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&Key);//初始化PA0引脚
	GPIO_WriteBit(GPIOA,GPIO_Pin_0,0);
	
	Key.GPIO_Pin=GPIO_Pin_13;
	GPIO_Init(GPIOC,&Key);
	GPIO_WriteBit(GPIOC,GPIO_Pin_13,0);
}

u8 Key_GetKeynum(){
	u8 key_num=0;
	if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1){
		delay_ms(10);
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1){
			key_num=1;
		}
		while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1);
	}
	else if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==1){
		delay_ms(10);
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==1){
			key_num=2;
		}
		while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==1);
	}
	return key_num;
}

FengMingQi.h

#ifndef __FENGMINGQI_H_
#define __FENGMINGQI_H_

#include "stdio.h"
#include "sys.h"

void FengMingQi_Init();
void FengMingQi_NO();
void FengMingQi_OFF();
void FengMingQi_NO_OFF(u8 flag);

#endif

FengMingQi.c

#include "FengMingQi.h"

void FengMingQi_Init(){
	GPIO_InitTypeDef FMQ;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	
	FMQ.GPIO_Pin=GPIO_Pin_0;
	FMQ.GPIO_Mode=GPIO_Mode_Out_PP;
	FMQ.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&FMQ);
	GPIO_WriteBit(GPIOC,GPIO_Pin_0,0);
}

void FengMingQi_NO(){
	GPIO_WriteBit(GPIOC,GPIO_Pin_0,1);
}

void FengMingQi_OFF(){
	GPIO_WriteBit(GPIOC,GPIO_Pin_0,0);
}

void FengMingQi_NO_OFF(u8 flag){
	GPIO_WriteBit(GPIOC,GPIO_Pin_0,flag);
}
您好!要实现STM32按键控制蜂鸣器,可以按照以下步骤进行: 1. 首先需要在STM32上配置GPIO口,将按键蜂鸣器连接到相应的GPIO口。 2. 在程序中配置GPIO口的输入输出模式和上下拉电阻。 3. 在程序中开启定时器中断,并且通过定时器中断控制蜂鸣器的响声。 4. 在程序中通过GPIO口读取按键的状态,并且根据按键的状态控制蜂鸣器的响声。 下面是一段示例代码,可以供您参考: ```c #include "stm32f10x.h" #define BEEP_GPIO_PORT GPIOA #define BEEP_GPIO_PIN GPIO_Pin_8 #define KEY_GPIO_PORT GPIOC #define KEY_GPIO_PIN GPIO_Pin_13 void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; // 配置蜂鸣器GPIO口为推挽输出模式 GPIO_InitStructure.GPIO_Pin = BEEP_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BEEP_GPIO_PORT, &GPIO_InitStructure); // 配置按键GPIO口为上拉输入模式 GPIO_InitStructure.GPIO_Pin = KEY_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStructure); } void TIM_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 配置定时器2为1KHz的频率 TIM_TimeBaseStructure.TIM_Period = 7199; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 开启定时器2中断 TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_Cmd(TIM2, ENABLE); } void TIM2_IRQHandler(void) { static uint16_t beep_count = 0; if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); if (beep_count > 0) { GPIO_WriteBit(BEEP_GPIO_PORT, BEEP_GPIO_PIN, (BitAction)(1 - GPIO_ReadOutputDataBit(BEEP_GPIO_PORT, BEEP_GPIO_PIN))); beep_count--; } } } int main(void) { GPIO_Configuration(); TIM_Configuration(); while (1) { if (GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN) == RESET) { beep_count = 100; // 按键按下时,蜂鸣器鸣叫100ms } } } ``` 以上代码中,通过配置定时器中断和GPIO口的读写状态,实现了按键控制蜂鸣器的功能。具体实现方法可能因为不同的STM32芯片型号和开发板而有所不同,需要根据具体的情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

因心,三人水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值