【STM32】按键控制LED 光敏传感器控制蜂鸣器

文章目录

  • 前置知识
    • 按键介绍
    • 传感器模块
    • 硬件电路
      • 按键硬件电路
      • 传感器模块硬件电路
    • C语言数据类型在Keil中的对应写法
    • C语言枚举
  • 按键控制LED
    • 接线图
    • Hardware文件夹(模块化编程)
      • LED驱动程序封装
      • Key(按键)驱动程序封装
    • main.c源文件
  • 光敏传感器控制蜂鸣器
    • 接线图
    • Hardware文件夹
      • Buzzer(蜂鸣器)驱动程序封装
      • LightSensor(光敏传感器)驱动程序封装
    • main.c源文件

前置知识

按键介绍

  • 按键:常见的输入设备,按下导通,松手断开
  • 按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动

在这里插入图片描述

传感器模块

在这里插入图片描述

传感器元件(光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出,再通过电压比较器进行二值化即可得到数字电压输出

【注意】传感器元件长得很相似,要注意辨别(我当时刚开始做的时候就搞混了,导致实验现象出问题)

传感器原件电路原理图

在这里插入图片描述

【补充分析】

当 N1 阻值变小时,下拉作用增强,中间 AO 端电压被拉低,极端情况下,N1阻值为 0,AO 输出被完全下拉,输出 0V
当 N1 阻值增大时,下拉作用减弱,中间 AO 端电压由于 R1 的上拉作用升高,极端情况下,N1阻值为无穷大,相当于断路,AO 输出被 R1 拉高至 VCC
得到的 AO(模拟电压输出)通过排针直接输出

硬件电路

按键硬件电路

下接按键方式

在这里插入图片描述

【分析】
选取一个 GPIO 接口,通过 K1 接地
按键按下时,PA0 被直接下拉到 GND,此时读取 PA0 口的电压就是低电平
按键松开时,PA0 被悬空,PA0 引脚电压不确定,所以在这种接法下必须要求 PA0 是上拉输入模式,默认 PA0 口为高电平

在这里插入图片描述

【分析】
相比于上一种接法,这种接法在外部接了一个上拉电阻
按键按下时,PA0 被直接下拉到 GND,此时读取 PA0 口的电压就是低电平
按键松开时,引脚由于上拉作用,自然保持为高电平

在这种状态下,引脚不会出现悬空状态,所以此时 PA0 引脚可以配置为浮空输入或者上拉输入

上接按键方式

在这里插入图片描述

【分析】
选取一个 GPIO 接口,通过 K1 接到 3.3V
按键按下时,PA0 被直接上拉到 3.3V,此时读取 PA0 口的电压就是高电平
按键松开时,PA0 被悬空,PA0 引脚电压不确定,所以在这种接法下必须要求 PA0 是下拉输入模式,默认 PA0 口为低电平(但是一般的单片机不一定有下拉输入模式)

在这里插入图片描述

【分析】
相比于上一种接法,这种接法在外部接了一个下拉电阻
按键按下时,PA0 被直接上拉到 3.3V,此时读取 PA0 口的电压就是高电平
按键松开时,引脚由于下拉作用,自然保持为低电平

在这种状态下,引脚不会出现悬空状态,所以此时 PA0 引脚可以配置为浮空输入或者下拉输入

推荐使用下接按键的方式,原因和LED接法类似,因为很多单片机和芯片都使用了高电平弱驱动,低电平强驱动的规则

传感器模块硬件电路

在这里插入图片描述

因为使用的是模块方案,所以电路非常简单(传感器详细的内部硬件电路上面已经简单介绍过了)

C语言数据类型在Keil中的对应写法

关键字位数表示范围stdint关键字ST关键字
char8-128 ~ 127int8_ts8
unsigned char80 ~ 255uint8_tu8
short16-32768 ~ 32767int16_ts16
unsigned short160 ~ 65535uint16_tu16
int32-2147483648 ~ 2147483647int32_ts32
unsigned int320 ~ 4294967295uint32_tu32
long32-2147483648 ~ 2147483647
unsigned long320 ~ 4294967295
long long64-( 2 64 2^{64} 264)/2 ~ ( 2 64 2^{64} 264)/2-1int64_t
unsigned long long640 ~ ( 2 64 2^{64} 264)-1uint64_t
float32-3.4e38 ~ 3.4e38
double64-1.7e308 ~ 1.7e308

C语言枚举

  • 关键字:enum

  • 用途:定义一个取值受限制的整型变量,用于限制变量取值范围;宏定义的集合

  • 定义枚举变量:

    • enum{FALSE = 0, TRUE = 1} EnumName;

      因为枚举变量类型较长,所以通常用 typedef 更改变量类型名

  • 引用枚举成员:

    • EnumName = FALSE;
    • EnumName = TRUE;

按键控制LED

接线图

在这里插入图片描述

Hardware文件夹(模块化编程)

在这里插入图片描述

LED驱动程序封装

LED.c

在这里插入图片描述

LED.h

在这里插入图片描述

Key(按键)驱动程序封装

Key.c

在这里插入图片描述

【说明】

  • Key_GetNum 的作用是读取某个硬件按钮(按键)的状态,并返回一个对应的数字,表示哪个按键被按下

  • 函数返回一个 uint8_t 类型的值(无符号8位整数),用于表示按键的编号

  • 初始化 KeyNum 为 0,表示默认没有按键被按下

  • 通过 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) 检查 GPIOB 的引脚1 的输入状态,如果该引脚的值为 0(表示按钮被按下),则进行以下操作:

    • 调用 Delay_ms(20),延迟20毫秒,消除按键抖动
    • 进入一个 while 循环,直到按钮被释放(即引脚不再为 0)
    • 再次延迟20毫秒,进一步消除抖动
    • KeyNum 设置为 1,表示第一个按键被按下
  • 读取第二个按键(GPIO_Pin_11),和第一个引脚类似

    如果该引脚的值为 0,执行相同的去抖动和状态读取逻辑,然后将 KeyNum 设置为 2,表示第二个按键被按下

  • 函数返回 KeyNum,如果没有按键被按下,返回值为 0;如果第一个按键被按下,返回 1;如果第二个按键被按下,返回 2

Key.h

在这里插入图片描述

main.c源文件

在这里插入图片描述

光敏传感器控制蜂鸣器

接线图

在这里插入图片描述

Hardware文件夹

在这里插入图片描述

Buzzer(蜂鸣器)驱动程序封装

Buzzer.c

在这里插入图片描述

Buzzer.h

在这里插入图片描述

LightSensor(光敏传感器)驱动程序封装

LightSensor.c

在这里插入图片描述

LightSensor.h

在这里插入图片描述

main.c源文件

在这里插入图片描述


STM32 专栏文章均参考 《STM32入门教程-2023版 细致讲解 中文字幕》教程视频

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/907601.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

飞书API-获取tenant_access_token

1.在飞书工作台创建应用,跳到开发者后台,选创建企业自建应用 2.设置并发布应用 必须要发布应用才可以开始使用了!!! 3.调用获取token的API 参考链接: 开发文档 - 飞书开放平台https://open.feishu.cn/do…

SpringBoot篇(自动装配原理)

目录 一、自动装配机制 1. 简介 2. 自动装配主要依靠三个核心的关键技术 3. run()方法加载启动类 4. 注解SpringBootApplication包含了多个注解 4.1 SpringBootConfiguration 4.2 ComponentScan 4.3 EnableAutoConfiguration 5. SpringBootApplication一共做了三件事 …

Rust 力扣 - 48. 旋转图像

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们可以将原矩阵进行水平翻转&#xff0c;然后在沿主对角线进行翻转&#xff0c;就能完成原矩阵沿顺时针方向旋转90o的变换 题解代码 impl Solution {pub fn rotate(matrix: &mut Vec<Vec<i32>&…

ima.copilot:智慧因你而生

在数字化时代&#xff0c;信息的获取、处理和创作已经成为我们日常工作和学习中不可或缺的一部分。腾讯公司推出的ima.copilot&#xff08;简称ima&#xff09;正是为了满足这一需求&#xff0c;它是一款由腾讯混元大模型提供技术支持的智能工作台产品&#xff0c;旨在通过智能…

使用 PyCharm 构建 FastAPI 项目:零基础入门 Web API 开发

使用 PyCharm 构建 FastAPI 项目&#xff1a;零基础入门 Web API 开发 本文提供了一份完整的 FastAPI 入门指南&#xff0c;涵盖从环境搭建、依赖安装到创建并运行一个简单的 FastAPI 应用的各个步骤。通过 FastAPI 和 Uvicorn&#xff0c;开发者可以快速构建现代化的 Web API…

练习LabVIEW第三十五题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十五题&#xff1a; 使用labview模拟一个3-8译码器 开始编写&#xff1a; 用LabVIEW做3-8译码器首先要知道它是个啥…

【流量控制】之创建和管理前缀列表

前缀列表是包含一个或多个CIDR地址块的集合。您可以自主创建前缀列表并对其进行管理。在创建过程中&#xff0c;您可以将现有的前缀列表克隆&#xff08;复制&#xff09;到指定地域&#xff08;同地域或跨地域&#xff09;&#xff0c;让操作更加便捷。本文介绍如何使用专有网…

数据库作业5

1&#xff0c;建立触发器&#xff0c;订单表中增加订单数量后&#xff0c;商品表商品数量同步减少对应的商品订单出数量,并测试 测试&#xff1a; 2.建立触发器&#xff0c;实现功能:客户取消订单&#xff0c;恢复商品表对应商品的数量 测试 3.建立触发器&#xff0c;实现功能:…

Spring Boot 注解大全:全面解析 Spring Boot 常用注解及其应用场景

Spring Boot 注解大全:全面解析 Spring Boot 常用注解及其应用场景 简介 Spring Boot 是一个基于 Spring 框架的简化开发框架,它旨在简化 Spring 应用的初始搭建和开发过程。Spring Boot 提供了一系列的注解,使得开发者可以更加方便地进行应用开发和配置。本文将详细介绍 S…

11.3比赛总结

Bricks 1.题意&#xff1a;有一个由 B 和 W 组成的字符串&#xff0c;要将它划分成尽量多的区间&#xff0c;并使得每个区间中 B 和 W 的比例相等。 2.一道贪心题。首先特殊处理比值恒为 0 和不存在比值的情况&#xff0c;也就是全是 W 或者 B&#xff0c;明显这两种情况下每…

excel自定义导出实现(使用反射)

前言 项目中接到需求&#xff0c;需要对导出的字段进行自定义导出 &#xff0c;用户可在前端选择自定义导出的字段&#xff08;如图&#xff09;&#xff0c;实现过程做以下记录&#xff0c;仅供参考&#xff1b; 思路 跟前端约定好所有要导出的字段名称(headName)跟对应的…

“游戏人”也能拿诺贝尔奖!

“游戏人”也能拿诺贝尔奖&#xff01; 点击蓝链领取游戏开发教程 2024年度的诺贝尔奖&#xff0c;堪称AI深刻影响传统科学领域的一次生动展现。在这一年里&#xff0c;备受瞩目的诺贝尔物理学奖与诺贝尔化学奖两大核心奖项&#xff0c;均颁给了在AI领域做出杰出贡献的研究者…

OmniGen: Unified Image Generation(代码的复现)

文章目录 论文简介模型的部署需要下载的预训练权重 模型的生成效果图像编辑的效果风格迁移的效果 总结 论文简介 OmniGen的github项目地址 OmniGen: Unified Image Generation。OmniGen 在各种图像生成任务中都表现出了卓越的性能&#xff0c;并可能大大超过现有扩散模型的极…

docker-compose安装rabbitmq 并开启延迟队列和管理面板插件(rabbitmq_delayed_message_exchange)

问题&#xff1a; 解决rabbitmq-plugins enable rabbitmq_delayed_message_exchange &#xff1a;plugins_not_found 我是在docker-compose环境部署的 services:rabbitmq:image: rabbitmq:4.0-managementrestart: alwayscontainer_name: rabbitmqports:- 5672:5672- 15672:156…

Pandas 数据可视化指南:从散点图到面积图的全面展示

Pandas 数据可视化指南&#xff1a;从散点图到面积图的全面展示 本文介绍了使用 Pandas 进行数据可视化的多种方法&#xff0c;包括散点图、折线图、条形图、直方图、饼图和面积图等&#xff0c;涵盖了常见的图表类型及其实现方式。通过提供详细的代码示例&#xff0c;展示了如…

电力电子论文(TPE、TTE)投稿经验分享

本节博客不进行技术分享&#xff0c;仅分享我的投稿经验&#xff0c;主要介绍投稿时间戳、投稿注意事项。 TPE&#xff1a; 首先介绍的是电力电子老牌顶刊——IEEE Transactions on Power Electronics&#xff0c;缩写PE、TPE、TPEL。截止写稿时间&#xff0c;该期刊Impact Fa…

YOLOv11模型架构以及使用命令介绍

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

【高等数学】1函数极限连续

1. 函数 复合函数的性质及其图形 反函数的性质及其图形 分段函数的性质及其图形 隐函数的性质及其图形 基本初等函数(通常包括幂函数、指数函数、对数函数、三角函数、反三角函数)的性质及其图形 初等函数(由基本初等函数经过有限次的四则运算和复合运算所得到的函数)…

评估 机器学习 回归模型 的性能和准确度

回归 是一种常用的预测模型&#xff0c;用于预测一个连续因变量和一个或多个自变量之间的关系。 那么&#xff0c;最后评估 回归模型 的性能和准确度非常重要&#xff0c;可以帮助我们判断模型是否有效并进行改进。 接下来&#xff0c;和大家分享如何评估 回归模型 的性能和准…

移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (6) - 触屏事件

AWTK 作为一个GUI引擎&#xff0c;自然少不了对触屏事件的支持。这里我们先支持单点触摸&#xff0c;后续再支持多点手势。 1. 注册 XComponent 的触屏事件回调 这个在 AppNapi 的构造函数中完成&#xff1a; AppNapi::AppNapi(std::string &id) {id_ id;component_ n…