srm32f4按键蜂鸣器_ARM开发(3)基于STM32的矩阵键盘控制蜂鸣器

本文介绍如何使用STM32F4开发板,通过矩阵键盘控制蜂鸣器,实现按键触发蜂鸣器响动。文章详细阐述了矩阵键盘的初始化、按键扫描程序及蜂鸣器间隔1秒鸣叫的实现,并提供了关键代码示例。
摘要由CSDN通过智能技术生成

一 矩阵键盘控制蜂鸣器原理:

1.1 本实验实现8*7矩阵键盘上按键控制蜂鸣器响。

1.2 实验思路:根据电路图原理,找出矩阵键盘行列所对应的引脚,赋予对应的按键值,然后控制蜂鸣器响。

1.3 开发环境 : MDK5 库函数版本开发 JLINK仿真

二 实验步骤:

2.1  key.h代码:

#ifndef __KEY_H

#define __KEY_H

#include"sys.h"

#define ROWPINS GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3|GPIO_Pin_2\

|GPIO_Pin_1|GPIO_Pin_0//矩阵键盘行引脚

#define COLPINS GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12|GPIO_Pin_11\

|GPIO_Pin_10|GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7//矩阵键盘列引脚

void KEY_Init(void);//矩阵键盘初始化

u8 KEY_Scan(void); //按键扫描程序

#endif

2.2   key.c代码(IO配置和按键扫描):

#include "key.h"

u16 rowPin[7] = {GPIO_Pin_6,GPIO_Pin_5,GPIO_Pin_4,GPIO_Pin_3,GPIO_Pin_2,GPIO_Pin_1,GPIO_Pin_0};//行

u16 colPin[8] = {GPIO_Pin_14,GPIO_Pin_13,GPIO_Pin_12,GPIO_Pin_11,GPIO_Pin_10,GPIO_Pin_9,GPIO_Pin_8,GPIO_Pin_7};//列

void KEY_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//使能PE端口时钟

GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP; //推挽输出

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//IO口速度为50MHz

GPIO_InitStructure.GPIO_Pin  = COLPINS;//行端口配置

GPIO_InitStructure.GPIO_Pin  =ROWPINS;//列端口配置

GPIO_Init(GPIOE, &GPIO_InitStructure);//根据参数初始化GPIOE

}

u8 KEY_Scan(void)//按键扫描按键按下的是哪一个键(本实验默认矩阵按键是1到56)

{

u8 i ,j ,k;

for(i=0;i<=6;i++)

{

GPIO_SetBits(GPIOE,rowPin[i]);

for(k=0;k<=6;k++)

{

if(k!=i)

{

GPIO_ResetBits(GPIOE,rowPin[k]);

}

}

for(j=0;j<=7;j++)

{

if(GPIO_ReadInputDataBit(GPIOE,colPin[j]) !=0)

{

return 8*i +j;

}

}

}

return 0;

}

2.2  main.c代码(实现蜂鸣器间隔1S鸣叫效果):

#include "delay.h"

#include "key.h"

#include "sys.h"

#include "beep.h"

int main(void)

{

u8 i;

u8 key=0;

delay_init();//延时

KEY_Init();  //键盘初始化

BEEP_Init(); //蜂鸣器初始化

while(1)

{

key=KEY_Scan();//得到按键值

if(key==50)如果按键值是50,则蜂鸣器响

{

BEEP =!BEEP ;

delay_ms(1000);

}

}

}

三 接线测试:

3.1 与板子接线测试效果良好,找到按键值为50的按下去,蜂鸣器响。

3.2注意事项:蜂鸣器的文件在上次实验中,本次就不在赘述了。

好的,对于这个问题,您可以通过以下步骤来使用srm32f103c8t6的PWM输出驱动PB3引脚上的无源蜂鸣器: 1. 首先,需要在开发环境中配置srm32f103c8t6的PWM输出。可以通过调用STM32 HAL库中的相应函数来实现。例如,可以使用以下代码来初始化PWM输出: ```c // 初始化PWM GPIO引脚 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // 初始化PWM定时器 TIM_HandleTypeDef htim; TIM_OC_InitTypeDef sConfigOC = {0}; htim.Instance = TIM1; htim.Init.Prescaler = 0; htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = 1000; htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500; HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_4); HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_4); ``` 这个代码初始化了PB3引脚作为PWM输出引脚,同时初始化了一个定时器(这里使用的是TIM1)来产生PWM波形。其中,定时器的周期设置为1000,占空比设置为50%。 2. 接下来,需要在程序中控制PWM的占空比来控制蜂鸣器的声音。可以通过调用以下代码来改变PWM的占空比: ```c // 改变PWM占空比 TIM_OC_InitTypeDef sConfigOC = {0}; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 250; HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_4); HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_4); ``` 这个代码将PWM的占空比改为25%,从而使蜂鸣器发出更低的声音。 3. 最后,需要在程序中实现适当的逻辑来控制蜂鸣器的声音。例如,可以使用以下代码来使蜂鸣器持续发出一段时间的声音: ```c // 持续发出声音 HAL_Delay(1000); HAL_TIM_PWM_Stop(&htim, TIM_CHANNEL_4); ``` 这个代码使用了HAL_Delay函数来让程序等待1000毫秒,然后停止PWM输出,从而停止蜂鸣器的发声。 希望这个回答能够帮助您解决问题,如果您还有其他问题,请随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值