STM32GPIO输入(按键控制LED、光敏电阻控制蜂鸣器实例)

2024-02-03 15:52

本文主要是介绍STM32GPIO输入(按键控制LED、光敏电阻控制蜂鸣器实例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、介绍
    • 传感器模块介绍
    • 硬件电路
    • c语言数据类型
  • 二、实例
    • 按键控制LED
      • 接线图
      • 代码实现
    • 光敏电阻控制蜂鸣器
      • 组装线路
      • 代码实现
  • 相关函数解释


一、介绍

传感器模块介绍

在这里插入图片描述

硬件电路

上两种按下时为0,下两种按下时为1。
在这里插入图片描述

c语言数据类型

现在常用stdint头文件所定义的这种
在这里插入图片描述

二、实例

按键控制LED

接线图

在这里插入图片描述

代码实现

封装LED.c

#include "stm32f10x.h"                  // Device header/*** @brief  初始化LED相关端口,让LED所在端口可以被直接赋值* @param 	无* @retval 无*/
void LED_Init(void){// 初始化时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 配置LED所在端口GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		// 通用推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;	// A1,A2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		// 50Hz翻转速度GPIO_Init(GPIOA, &GPIO_InitStructure);// 使这两个端口默认高电平,不然初始化后默认是低电平GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
}
/*** @brief  LED1亮* @param 	无* @retval 无*/
void LED1_On(void){GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
/*** @brief  LED1关* @param 	无* @retval 无*/
void LED1_Off(void){GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
/*** @brief  LED2亮* @param 	无* @retval 无*/
void LED2_On(void){GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}
/*** @brief  LED2关* @param 	无* @retval 无*/
void LED2_Off(void){GPIO_SetBits(GPIOA, GPIO_Pin_2);
}
/*** @brief  LED1取反* @param 	无* @retval 无*/
void LED1_Reverse(void){// 读取端口状态,根据状态取反if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1) == 0)GPIO_SetBits(GPIOA, GPIO_Pin_1);elseGPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
/*** @brief  LED2取反* @param 	无* @retval 无*/
void LED2_Reverse(void){// 读取端口状态,根据状态取反if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2) == 0)GPIO_SetBits(GPIOA, GPIO_Pin_2);elseGPIO_ResetBits(GPIOA, GPIO_Pin_2);
}

封装按键函数Button.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"/*** @brief  初始化Button相关端口* @param 	无* @retval 无*/
void Button_Init(void){// 初始化时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// 配置LED所在端口GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;		// 上拉输出,按下为0GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;	// A1,A2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		// 50Hz翻转速度GPIO_Init(GPIOB, &GPIO_InitStructure);// 使这两个端口默认高电平,不然初始化后默认是低电平GPIO_SetBits(GPIOB, GPIO_Pin_1 | GPIO_Pin_11);
}
/*** @brief  返回所按按键值* @param 	无* @retval KeyNum 按键值*/
uint8_t Key_Num(void){uint8_t KeyNum = 0;if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0){Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0);Delay_ms(20);KeyNum = 1;}if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0){Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0);Delay_ms(20);KeyNum = 11;}return KeyNum;
}

主函数main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Button.h"
// 接收按键值
uint8_t KeyNum;
int main(void)
{// 初始化LED_Init();Button_Init();while (1){KeyNum = Key_Num();if(KeyNum == 1){LED1_Reverse();}if(KeyNum == 11){LED2_Reverse();}}
}

光敏电阻控制蜂鸣器

组装线路

在这里插入图片描述

代码实现

封装蜂鸣器Buzzer.c

#include "stm32f10x.h"                  // Device header/*** @brief  初始化Buzzer相关端口,让Buzzer所在端口可以被直接赋值* @param 	无* @retval 无*/
void Buzzer_Init(void){// 初始化时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// 配置Buzzer所在端口GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		// 通用推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;	// A1,A2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		// 50Hz翻转速度GPIO_Init(GPIOB, &GPIO_InitStructure);// 使这两个端口默认高电平,不然初始化后默认是低电平GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
/*** @brief  Buzzer开* @param 	无* @retval 无*/
void Buzzer_On(void){GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}
/*** @brief  Buzzer关* @param 	无* @retval 无*/
void Buzzer_Off(void){GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
void Buzzer_Reverse(void){// 读取端口状态,根据状态取反if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_12) == 0)GPIO_SetBits(GPIOB, GPIO_Pin_12);elseGPIO_ResetBits(GPIOB, GPIO_Pin_12);
}

封装光敏电阻LightSensor.c

#include "stm32f10x.h"                  // Device header
/*** @brief  初始化光敏电阻所在端口* @param 	无* @retval 无*/
void LightSensor_Init(void){// 初始化时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// 配置LED所在端口GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;		// 上拉输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		// 50Hz翻转速度GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*** @brief  获取光敏电阻的阻值高于标准或低于标准(高于为1低于为0)* @param 	无* @retval GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) 返回读取的光敏电阻输入芯片的值*/
uint8_t LightSensor_Get(void){return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
}

主函数main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"int main(void)
{// 初始化Buzzer_Init();LightSensor_Init();while (1){// 光线较低,阻值过高是蜂鸣器响if(LightSensor_Get() == 1){Buzzer_On();}else{Buzzer_Off();}}
}

相关函数解释

// 读取输入寄存器的某一位的值
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
// 读取输入寄存器的值
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
// 读取输处寄存器的某一位的值
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
// 读取输出寄存器的值
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

在这里插入图片描述

这篇关于STM32GPIO输入(按键控制LED、光敏电阻控制蜂鸣器实例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/674659

相关文章

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6