【STM32】按键控制LED 光敏传感器控制蜂鸣器
🔎【博主简介】🔎
🏅CSDN博客专家
🏅2021年博客之星物联网与嵌入式开发TOP5
🏅2022年博客之星物联网与嵌入式开发TOP4
🏅2021年2022年C站百大博主
🏅华为云开发者社区专家博主
🏅阿里云开发者社区专家博主
🏅掘金INFOQ腾讯云优秀博主📝《个人主页》謓泽-CSDN博客
🥰《个人社区》QRS社区-CSDN社区云
👀《系列专栏》STM32-单片机
📣 点赞👍+ 收藏⭐️+ 留言💬
⒈按键控制LED灯
概述⇢在五一单片机当中博主也有写过一篇关于轻触按键控制的文章,对轻触按键不了解的话可以看看🔗【51单片机】独立按键控制LED灯(四种形式)
说明⇢在下述图当中是两个按键控制两个LED灯的面包板接线图。
说明⇢博主并非使用面包板接线图的,而是自己使用了洞洞板来焊接一个个模块,最终合成一个开发板的。就像和普中51的A2开发板一样。
示例要求如下👇
- 按下B1按键第一个LED点亮,再按一下B1按键LED灯熄灭。依次...
- 按下B11按键第二个LED点亮,再按一下B11按键LED灯熄灭。依次...
🎓拓展知识点如下⇣
- 快捷键[CTRL+ALT+空格]可以弹出代码提示框。
- 当我们把GPIO初始化配置好了之后单片机默认是低电平,所以我们需要再初始化完成之后再设置成高电平。
- 按键当中的初始化使用的Mode模式是上拉模式的。注:当然你也可以自己在外部电路上接一个上拉电阻,这样模式的选择也可以不用是上拉模式。
注意⇢按键会产生抖动,一般有两种方法可以解决按键产生抖动的问题。
⒈软件消抖、定时器扫描或延时函数。
⒉硬件消抖、小电容103并联接地。
第一个程序代码
示例代码如下◊
main.c
#include "stm32f10x.h" // Device header #include "Delay.h" #include "LED.h" #include "Key.h" #include "stdint.h" uint8_t Ret;int main(void) {LED_Init();Key_Init();while (1){Ret=KeyNum();if(Ret==1){ LED1_Ture();}else if(Ret==2){LED2_Ture();}else{LED3_Ture();}} }
LED.c
#include "stm32f10x.h" // Device header/* 概述:LED的初始化函数。 ㈠使用RCC开启GPIO的时钟 [RCC-即复位与时钟控制,主要是通过寄存器配置时钟源]㈡使用GPIO_Init函数初始化GPIO口。㈢使用输出或者输入函数控制GPIO口。 说明:快捷键[CTRL+ALT+空格]可以弹出代码提示框。 */ void LED_Init() {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_15 | GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_0);//GPIO_Pin_x为高电平GPIO_SetBits(GPIOC, GPIO_Pin_15 | GPIO_Pin_14); //GPIO_Pin_x为高电平 } //ON:打开 OFF:关闭 void LED1_ON() {GPIO_SetBits(GPIOA,GPIO_Pin_1); }void LED1_OFF() {GPIO_ResetBits(GPIOA,GPIO_Pin_1); }void LED2_ON() {GPIO_SetBits(GPIOC,GPIO_Pin_15); }void LED2_OFF() {GPIO_ResetBits(GPIOC,GPIO_Pin_15); } //IO电平翻转 void LED1_Ture() {if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0) == 0){//如果PA0的输出寄存器=0GPIO_SetBits(GPIOA, GPIO_Pin_0);//PA1=1}else//如果PA0的输出寄存器=1{GPIO_ResetBits(GPIOA,GPIO_Pin_0);//PA1=0} }void LED2_Ture() {if(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_15) == 0){GPIO_SetBits(GPIOC, GPIO_Pin_15);}else{GPIO_ResetBits(GPIOC,GPIO_Pin_15);} }void LED3_Ture() {if(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_14) == 0){GPIO_SetBits(GPIOC, GPIO_Pin_14);}else{GPIO_ResetBits(GPIOC,GPIO_Pin_14);} }
LED.h
#ifndef __LED_H #define __LED_Hextern void LED_Init(void);extern void LED1_ON(void); extern void LED1_OFF(void); extern void LED2_ON(void); extern void LED2_OFF(void);extern void LED1_Ture(void); extern void LED2_Ture(void); extern void LED3_Ture(void); #endif
Key.c
#include "stm32f10x.h" // Device header #include "Delay.h"void Key_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure); }uint8_t Key_GetNum(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 = 2;}return KeyNum; }
Key.h
#ifndef __Key_H #define __Key_Hextern void Key_Init(void); extern unsigned char KeyNum(void);#endif
说明⇢以上便是独立按键控制LED的全部代码。
注意⇢在这里对应的按键是可以控制对应LED灯的以及翻转状态,当按键按下的时候对应的LED灯点亮、当按键松手的时候对应的LED灯熄灭。
//大多数运用场景在IO口电平翻转 GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0)
⒉光敏传感器控制蜂鸣器
概述⇢第二个示例讲的是用光敏电阻传感器控制蜂鸣器。如果你对蜂鸣器不是很理解的话,推荐看看博主写的这篇文章。🔗
说明⇢在下述图当中是两个按键控制两个LED灯的面包板接线图。
重要知识点⇢在这里还是主要介绍下光敏传感器到底是啥玩意。
说明⇢在上述主要是由光敏电阻、电位器、电阻、LED灯、LM393组合而成的光敏传感器的模块,其主要功能是⇢光线越强,光敏电阻的阻值就会越小,信号输出低电平(灯亮),当遮挡光敏电阻的时候,信号输出为高电平(灯灭)
引脚⇢分别有四个引脚,1.Vcc、2.Gnd、3.AO、4.DO
注意⇢AO是ADC模数转换的引脚。
检测距离调节:顺时针调节电位器,检测距离增加;逆时针调节电位器,检测距离减少。
第二个程序代码
示例代码如下◊
main.h
#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();}} }
Key.c
#include "stm32f10x.h" // Device header #include "Delay.h"void Key_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure); }uint8_t Key_GetNum(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 = 2;}return KeyNum; }
Key.h
#ifndef __KEY_H #define __KEY_Hvoid Key_Init(void); uint8_t Key_GetNum(void);#endif
Buzzer.c
#include "stm32f10x.h" // Device headervoid Buzzer_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB, GPIO_Pin_12); }void Buzzer_ON(void) {GPIO_ResetBits(GPIOB, GPIO_Pin_12); }void Buzzer_OFF(void) {GPIO_SetBits(GPIOB, GPIO_Pin_12); }void Buzzer_Turn(void) {if (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) == 0){GPIO_SetBits(GPIOB, GPIO_Pin_12);}else{GPIO_ResetBits(GPIOB, GPIO_Pin_12);} }
Buzzer.h
#ifndef __BUZZER_H #define __BUZZER_Hvoid Buzzer_Init(void); void Buzzer_ON(void); void Buzzer_OFF(void); void Buzzer_Turn(void);#endif
LightSensor.c
#include "stm32f10x.h" // Device headervoid LightSensor_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);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;GPIO_Init(GPIOB, &GPIO_InitStructure); }uint8_t LightSensor_Get(void) {return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13); }
LightSensor.h
#ifndef __LIGHT_SENSOR_H #define __LIGHT_SENSOR_Hvoid LightSensor_Init(void); uint8_t LightSensor_Get(void);#endif
说明⇢以上便是第二个示例代码的全部程序内容。
相关文章:

【STM32】按键控制LED 光敏传感器控制蜂鸣器
🔎【博主简介】🔎 🏅CSDN博客专家 🏅2021年博客之星物联网与嵌入式开发TOP5 🏅2022年博客之星物联网与嵌入式开发TOP4 🏅2021年2022年C站百大博主 🏅华为云开发…...

M-OFDM模糊函数原理及仿真
文章目录 前言一、M序列二、M-OFDM 信号1、OFDM 信号表达式2、模糊函数表达式 三、MATLAB 仿真1、MATLAB 核心源码2、仿真结果①、m-OFDM 模糊函数②、m-OFDM 距离分辨率③、m-OFDM 速度分辨率④、m-OFDM 等高线图 四、资源自取 前言 本文进行 M-OFDM 的原理讲解及仿真&#x…...

【MySQL】MVCC与Read View
目录 一、数据库并发的三种场景 二、读写场景的MVCC (一)表中的三个隐藏字段 (二)undo 日志 (三)模拟MVCC (四)Read View (五)当前读和快照读 三、RC和…...

相机--双目立体相机
教程 链接1 教程汇总 立体匹配算法基础概念 视频讲解摄像机标定和双目立体原理 两个镜头。 双目相机也叫立体相机--Stereo Camera,属于深度相机。 作用 1,获取图像特征; 2,获取图像深度信息; 原理 原理和标定 …...

多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现
多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现 目录 多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现效果一览基本介绍…...

工厂模式 vs 策略模式:设计模式中的 “创建者” 与 “决策者”
在日常工作里,需求变动或者新增功能是再常见不过的事情了。而面对这种情况时,那些耦合度较高的代码就会给我们带来不少麻烦,因为在这样的代码基础上添加新需求往往困难重重。为了保证系统的稳定性,我们在添加新需求时,…...
23、Swift框架微调实战(3)-Qwen2.5-VL-7B LORA微调OCR数据集
一、模型介绍 Qwen2.5-VL 是阿里通义千问团队开源的视觉语言模型,具有3B、7B和72B三种不同规模,能够识别常见物体、分析图像中的文本、图表等元素,并具备作为视觉Agent的能力。 Qwen2.5-VL 具备作为视觉Agent的能力,可以推理并动态使用工具,初步操作电脑和手机。在视频处…...

37. Sudoku Solver
题目描述 37. Sudoku Solver 回溯 class Solution {vector<vector<bool>> row_used;vector<vector<bool>> col_used;vector<vector<bool>> box_used;public:void solveSudoku(vector<vector<char>>& board) {row_used.r…...
C# Renci.SshNet 登陆 suse配置一粒
C# 调用Renci.SshNet 的SSH类库,登陆 suse linux系统,如果没有配置,会报错: Renci.SshNet.Common.SshAuthenticationException: No suitable authentication method found to complete 1、需要root登陆os,配置 /etc/ssh/sshd_con…...

RV1126-OPENCV 图像叠加
一.功能介绍 图像叠加:就是在一张图片上放上自己想要的图片,如LOGO,时间等。有点像之前提到的OSD原理一样。例如:下图一张图片,在左上角增加其他图片。 二.OPENCV中图像叠加常用的API 1. copyTo方法进行图像叠加 原理…...

修改 vscode 左侧导航栏的文字大小 (更新版)
1. 起因, 目的: 问题: vscode 左侧的文字太小了!!!我最火的一篇文章,写的就是这个问题。 看来这个问题,是很广泛的一个痛点。我最近更新了 vscode, 这个问题又出现了。再来搞一下。…...
从C++编程入手设计模式2——工厂模式
从C编程入手设计模式 工厂模式 我们马上就要迎来我们的第二个创建型设计模式:工厂方法模式(Factory Method Pattern)。换而言之,我们希望使用一个这样的接口,使用其他手段而不是直接创建的方式(说的有…...

云原生 Cloud Native Build (CNB)使用初体验
云原生 Cloud Native Build(CNB)使用初体验 引言 当“一切皆可云”成为趋势,传统开发环境正被云原生工具重塑。腾讯云CNB(Cloud Native Build)作为一站式开发平台,试图解决多环境协作难题。 本文将分享c…...

格式工厂 FormatFactory v5.20.便携版 ——多功能媒体文件转换工具 长期更新
—————【下 载 地 址】——————— 【本章下载一】:https://pan.xunlei.com/s/VORWF3Q7D0eCVV06LHbzheD-A1?pwdjikz# 【本章下载二】:https://pan.quark.cn/s/8ee59ed83658 【百款黑科技】:https://ucnygalh6wle.feishu.cn/wiki/…...

数据可视化--使用matplotlib绘制高级图表
目录 一、绘制等高线图 contour() 二、绘制矢量场流线图 streamplot() 三、绘制棉棒图 stem() 四、绘制哑铃图 五、绘制甘特图 六、绘制人口金字塔图 barh() 七、绘制漏斗图 简易版漏斗图 八、绘制桑基图 Sankey()---创建桑基图 add()---添加桑基图的选项 finish()…...
卷积神经网络(CNN)完全指南:从原理到实战
卷积神经网络(CNN)完全指南:从原理到实战 引言:为什么CNN改变了计算机视觉? 2012年,AlexNet在ImageNet竞赛中以压倒性优势获胜,将错误率降低了近10个百分点,这标志着卷积神经网络(CNN)时代的开始。如今&a…...

如何做好一个决策:基于 Excel的决策树+敏感性分析应用
决策点: 开发新产品? (是 / 否) 因素 (如果是): 市场接受度 (高 / 中 / 低);概率: 高(0.3), 中(0.5), 低(0.2) 结果值 (NPV): 高(+$1M), 中(+$0.2M), 低(-$0.5M) 不开发成本/收益: $0 开发计算: EMV(市场接受度) = (0.3 * 1M) + (0.5 * 0.2M) + (0.2 * -0.5M) = $0.3M + $…...

【模拟电子电路-工具使用】
模拟电子电路-工具使用 ■ 1. 模拟软件■ 1. circuit JS ■ 2. 万用表■ 3. 示波器■ 4.■ 5.■ 6.■ 7. ■ 1. 模拟软件 ■ 1. circuit JS ■ 2. 万用表 ■ 3. 示波器 ■ 4. ■ 5. ■ 6. ■ 7....

[ElasticSearch] ElasticSearch的初识与基本操作
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
Spring AI 代理模式(Agent Agentic Patterns)
一、Agentic Patterns 核心思想 根据Anthropic《构建高效代理》研究报告,高效LLM代理的设计应遵循两大核心原则: 简单性优先:避免过度设计,从最简单的解决方案开始可组合性:通过模块化设计实现灵活组合而非复杂框架 …...

搜索引擎2.0(based elasticsearch6.8)设计与实现细节(完整版)
1 简介 1.1 背景 《搜索引擎onesearch 1.0-设计与实现.docx》介绍了1.0特性,搜索schema,agg,表达式搜索映射,本文介绍onesearch 2.0 新特性, 参考第2节 规划特性与发布计划 1.2 关键词 文档 Document elasticsearch 一行数据称为…...
ps中前景色和背景色
在Photoshop(简称PS)中,前景色和背景色是两个非常重要的概念,它们直接影响着绘图、填充、渐变等操作的最终效果。以下是对前景色和背景色的全面、深入解释: 一、前景色与背景色的定义 前景色:指的是当前绘…...
网页前端开发(基础进阶2--JS)
前面学习了html与css,接下来学习JS(JavaScript与Java无关)。 web标准(网页标准)分为3个部分: 1.html主要负责网页的结构(页面的元素和内容) 2.css主要负责网页的表现(…...

Go 即时通讯系统:客户端与服务端 WebSocket 通信交互
客户端和服务端的交互 客户端与服务端建立连接 客户端:客户端通过浏览器或者其他应用程序发起一个 HTTP 请求到服务端的 /socket.io 路径。在请求中会携带用户的 UUID 作为参数(通过 c.Query("user") 获取)。 // router/socket.…...
2025年5月AI科技领域周报(5.19-5.25):大模型多模态突破 具身智能开启机器人新纪元
2025年5月AI科技领域周报(5.19-5.25):大模型多模态突破 具身智能开启机器人新纪元 目录 2025年5月AI科技领域周报(5.19-5.25):大模型多模态突破 具身智能开启机器人新纪元一、本周热点回顾1. 百度发布全球首…...

某航后缀混淆逆向与顶像风控分析
文章目录 1. 写在前面2. 接口分析3. 加密分析4. 风控分析 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…...

[Protobuf]常见数据类型以及使用注意事项
[Protobuf]常见数据类型以及使用注意事项 水墨不写bug 文章目录 一、基本数据类型1、字段2、字段的修饰规则 二、自定义数据类型1、message类型2、enum类型3、Any类型4、oneof类型5、map类型 三、小工具1.hexdump2.decode 四、注意事项 一、基本数据类型 protobuf 支持多种基础…...
【C/C++】面试基础题目收集
C 软件开发面试中常见的刷题题目通常可分为以下几大类:数据结构与算法、系统编程、面向对象设计、C 语言特性、并发编程等。 🧠 一、数据结构与算法(力扣/牛客经典题) 掌握 STL 和底层结构实现能力: 📌 数…...

模拟实现线程池(线程数目为定值)和定时器
前言 昨天学习关于定时器的相关知识。今天花时间去模拟实现了一个定时器,同时也去模拟实现了一个线程池(线程数目为定值)。我感觉我收获了很多,对于线程的理解加深了。跟大家分享一下~ 线程池和定时器(这个是主要)的实现 代码 线程池 import java.ut…...

数据结构之队列实验
引言 在计算机科学中,进制转换是基础但重要的操作。例如将一个十进制数转换为二进制或八进制表示时,我们通常使用“短除法”——即不断用目标进制去除当前数,记录余数,直到商为0为止。 这种方法得到的是低位先产生的结果&#x…...