【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关键字 |
|---|---|---|---|---|
| char | 8 | -128 ~ 127 | int8_t | s8 |
| unsigned char | 8 | 0 ~ 255 | uint8_t | u8 |
| short | 16 | -32768 ~ 32767 | int16_t | s16 |
| unsigned short | 16 | 0 ~ 65535 | uint16_t | u16 |
| int | 32 | -2147483648 ~ 2147483647 | int32_t | s32 |
| unsigned int | 32 | 0 ~ 4294967295 | uint32_t | u32 |
| long | 32 | -2147483648 ~ 2147483647 | ||
| unsigned long | 32 | 0 ~ 4294967295 | ||
| long long | 64 | -( 2 64 2^{64} 264)/2 ~ ( 2 64 2^{64} 264)/2-1 | int64_t | |
| unsigned long long | 64 | 0 ~ ( 2 64 2^{64} 264)-1 | uint64_t | |
| float | 32 | -3.4e38 ~ 3.4e38 | ||
| double | 64 | -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版 细致讲解 中文字幕》教程视频
相关文章:
【STM32】按键控制LED 光敏传感器控制蜂鸣器
文章目录 前置知识按键介绍传感器模块硬件电路按键硬件电路传感器模块硬件电路 C语言数据类型在Keil中的对应写法C语言枚举 按键控制LED接线图Hardware文件夹(模块化编程)LED驱动程序封装Key(按键)驱动程序封装 main.c源文件 光敏传感器控制蜂鸣器接线图…...
flutter-防抖
在Flutter中实现输入框的防抖功能,通常是为了减少用户输入时触发的事件数量,特别是在进行网络请求时。防抖(Debounce)意味着在用户停止输入一段时间后才触发事件。以下是实现输入框防抖的一种方法: 1、使用Debounce类…...
什么是贪心算法
贪心算法(Greedy Algorithm)是一种逐步构建解决方案的方法,在每一步选择中都作出局部最优的选择,希望最终能够获得全局最优解。贪心算法的核心思想是贪心选择性质,即每次选择当前看来最好的解,不考虑未来可…...
YOLOv6-4.0部分代码阅读笔记-effidehead_lite.py
effidehead_lite.py yolov6\models\heads\effidehead_lite.py 目录 effidehead_lite.py 1.所需的库和模块 2.class Detect(nn.Module): 3.def build_effidehead_layer(channels_list, num_anchors, num_classes, num_layers): 1.所需的库和模块 import torch import t…...
重学SpringBoot3-整合 Elasticsearch 8.x (一)客户端方式
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 这里写目录标题 1. 为什么选择 Elasticsearch?2. Spring Boot 3 和 Elasticsearch 8.x 的集成概述2.1 准备工作2.2 添加依赖 3. Elasticsearch 客户端配置方式…...
极简实现酷炫动效:Flutter隐式动画指南第三篇自定义Flutter隐式动画
目录 前言 一、TweenAnimationBuilder 二、使用TweenAnimationBuilder实现的一些动画效果 1.调整透明度的动画 2.稍微复杂点的组合动画 3.数字跳动的动画效果 前言 上两节博客分别介绍了Flutter中的隐式动画的基础知识以及使用隐式动画实现的一些动画效果。当系统提供的隐…...
无人机维护保养、部件修理更换技术详解
无人机作为一种精密的航空设备,其维护保养和部件修理更换是确保飞行安全、延长使用寿命的重要环节。以下是对无人机维护保养、部件修理更换技术的详细解析: 一、无人机维护保养技术 1. 基础构造理解: 熟悉无人机的基本构造,包括…...
xilinx vitis 更换硬件平台——ZYNQ学习笔记5
1、重新生成硬件信息 2、选择带有bit信息 3、设施路径和名字 4、打开更新硬件选项 5、选择新的硬件信息 6、打开系统工程界面 7、复位硬件信息 更新完毕...
vscode makfile编译c程序
编译工具安装 为了在 Windows 上安装 GCC,您需要安装 MinGW-w64。 MinGW-w64 是一个开源项目,它为 Windows 系统提供了一个完整的 GCC 工具链,支持编译生成 32 位和 64 位的 Windows 应用程序。 1. 下载MinGW-w64源代码,如图点…...
【学术论文投稿】探索嵌入式硬件设计:揭秘智能设备的心脏
【IEEE出版】第六届国际科技创新学术交流大会暨通信、信息系统与软件工程学术会议(CISSE 2024)_艾思科蓝_学术一站式服务平台 更多学术会议论文投稿请看:https://ais.cn/u/nuyAF3 目录 引言 嵌入式系统简介 嵌入式硬件设计的组成部分 设…...
JavaScript 概述
### JavaScript 概述 JavaScript 是一种广泛使用的编程语言,它最初由 Netscape 公司的 Brendan Eich 在1995年创建,目的是为网页添加交互性。随着时间的发展,JavaScript 已经从一个简单的脚本语言演变成了一种功能强大的编程语言,…...
2024年10月个人工作生活总结
本文为 2024年10月工作生活总结。 研发编码 一个证书过期问题记录 某天,现场反馈某服务无法使用问题,经同事排查,是因为服务证书过期导致的。原来,证书的有效期设置为5年,这个月刚好到期。 虽然这个问题与自己无直接…...
uniapp ,微信小程序,滚动(下滑,上拉)到底部加载下一页内容
前言 小程序的内容基本都是滑动到底部加载下一页,这个一般都没有什么好用的组件来用,我看vant和uniapp的插件里最多只有个分页,没有滚动到底部加载下一页。再次做个记录。 效果预览 下滑到底部若是有下一页,则会自动加载下一页&…...
MySQL中的日志类型有哪些?binlog、redolog和undolog的作用和区别是什么?
简介: MySQL中有六种日志文件,分别是:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询日志࿰…...
【uni-app】创建自定义模板
1. 步骤 打开自定义模板文件夹 在此文件夹下创建模板文件(注意后缀名) 重新点击“新建页面” 即可看到新建的模板 2. 注意事项 创建的模板必须文件类型对应(vue模板就创建*.vue文件, uvue模板就创建*.uvue文件)...
Cesium移动Primitive位置
与传统的Entity实体不同,Primitive作为一种自定义基本图元,几何形状、材质和其他属性均由使用者定义,在需要绘制大量静态几何图形的高效渲染场景中更为适用。 Primitive的移动涉及到矩阵变换,并不像Entity那样给它替换一个新的坐…...
安卓13默认连接wifi热点 android13默认连接wifi
总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 有时候我们需要让固件里面内置好,相关的wifi的ssid和密码,让固件起来就可以连接wifi,不用在手动操作。 2.问题分析 这个功能,使用普通的安卓代码就可以实现了。 3.代…...
parted 磁盘分区
目录 磁盘格式磁盘分区文件系统挂载使用扩展 - parted、fdisk、gdisk 区别 磁盘格式 parted /dev/vdcmklabel gpt # 设置磁盘格式为GPT p # 打印磁盘信息此时磁盘格式设置完成! 磁盘分区 开始分区: mkpart data_mysql # 分区名&…...
第三百零八节 Log4j教程 - Log4j日志到数据库
Log4j教程 - Log4j日志到数据库 我们可以使用log4j API通过使用org.apache.log4j.jdbc.JDBCAppender对象将信息记录到数据库中。 下表列出了JDBCAppender的配置属性。 属性描述bufferSize设置缓冲区大小。默认大小为1。driverJDBC驱动程序类。默认为sun.jdbc.odbc.JdbcOdbcDr…...
ai智能语音电销机器人可以做哪些事情?
AI智能语音电销机器人是结合人工智能技术进行自动化电话销售和客户互动的工具,能够完成一系列任务,有助于提升销售效果、优化客户体验和提高工作效率。以下是AI智能语音电销机器人可以做的一些主要事情: 1. 自动拨号 AI语音电销机器人可以自…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
