【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灯熄灭。依次...

🎓拓展知识点如下⇣

  1. 快捷键[CTRL+ALT+空格]可以弹出代码提示框。 
  2. 当我们把GPIO初始化配置好了之后单片机默认是低电平,所以我们需要再初始化完成之后再设置成高电平。
  3. 按键当中的初始化使用的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

说明⇢以上便是第二个示例代码的全部程序内容。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为OD机试真题——斗地主之顺子(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

Qt找不到windows API报错:error: LNK2019: 无法解析的外部符号 __imp_OpenClipboard

笔者在开发中出现的bug完整报错如下: spcm_ostools_win.obj:-1: error: LNK2019: 无法解析的外部符号 __imp_OpenClipboard,函数 "void __cdecl spcmdrv::vCopyToClipboard(char const *,unsigned __int64)" (?vCopyToClipboardspcmdrvYAXPE…

4.8.4 利用Spark SQL实现分组排行榜

在本次实战中,我们的目标是利用Spark SQL实现分组排行榜,特别是计算每个学生分数最高的前3个成绩。任务的原始数据由一组学生成绩组成,每个学生可能有多个成绩记录。我们首先将这些数据读入Spark DataFrame,然后按学生姓名分组&am…

[PyMySQL]

掌握pymysql对数据库实现增删改查数据库工具类封装,数据库操作应用场景数据库操作应用场景 校验测试数据 : 删除员工 :构造测试数据 : 测试数据使用一次就失效,不能重复使用 : 添加员工(is_delete)测试数据在展开测试前无法确定是否存在 : 查询,修改,删除员工操作步骤:!~~~~~~~…

cs224w课程学习笔记-第12课

cs224w课程学习笔记-第12课 知识图谱问答 前言一、问答类型分类二、路径查询(Path queries)2.1 直观查询方法2.2 TransE 扩展2.3 TransE 能力分析 三、连词查询(conjunctive queries)3.1 Query2box 原理1)、投影2)、交集查询(AND 操作)3)、联合查询(OR 操…

AI任务相关解决方案2-基于WOA-CNN-BIGRU-Transformer模型解决光纤通信中的非线性问题

文章目录 1. 项目背景与研究意义1.1 光纤通信中的非线性问题1.2 神经网络在光纤非线性补偿中的应用现状 2. 现有模型 CNN-BIGRU-attention 分析2.1 模型架构与工作原理2.2 模型性能评估与局限性 3. 新模型优化方案3.1 WOA算法原理与优势3.2 WOA-CNN-BIGRU-MHA模型构建3.3 WOA-C…

HTTP Accept简介

一、HTTP Accept是什么 HTTP协议是一个客户端和服务器之间进行通信的标准协议,它定义了发送请求和响应的格式。而HTTP Accept是HTTP协议中的一个HTTP头部,用于告诉服务器请求方所期望的响应格式。这些格式可以是媒体类型、字符集、语言等信息。 HTTP A…

39-居住证管理系统(小程序)

技术栈: springBootVueMysqlUni-app 功能点: 群众端 警方端 管理员端 群众端: 1.首页: 轮播图展示、公告信息列表 2.公告栏: 公告查看及评论 3.我的: 联系我们: 可在线咨询管理员问题 实时回复 居住证登记申请 回执单查看 领证信息查看 4.个人中心: 个人信息查看及修改…

鸿蒙OSUniApp 开发的滑动图片墙组件#三方框架 #Uniapp

UniApp 开发的滑动图片墙组件 前言 在移动应用中,图片墙是一种极具视觉冲击力的内容展示方式,广泛应用于相册、商品展示、社交分享等场景。一个优秀的滑动图片墙组件不仅要支持流畅的滑动浏览,还要兼容不同设备的分辨率和性能,尤…

碰一碰系统源码搭建==saas系统

搭建“碰一碰”系统(通常指基于NFC或蓝牙的短距离交互功能)的源码实现,需结合具体技术栈和功能需求。以下是关键步骤和示例代码: 技术选型 NFC模式:适用于Android/iOS设备的近场通信,需处理NDEF协议。蓝牙…

自动驾驶决策规划框架详解:从理论到实践

欢迎来到《自动驾驶决策规划框架详解:从理论到实践》的第二章。在本章中,我们将深入探讨自动驾驶系统中至关重要的“大脑”——决策规划模块。我们将从基本概念入手,逐步解析主流的决策规划框架,包括经典的路径速度解耦方法、工业界广泛应用的Apollo Planning框架、应对复杂…

服务器定时任务查看和编辑

在 Ubuntu 系统中,查看当前系统中已开启的定时任务主要有以下几种方式,分别针对不同类型的定时任务管理方式(如 crontab、systemd timer 等): 查看服务器定时任务 一、查看用户级别的 Crontab 任务 每个用户都可以配…

小白的进阶之路系列之四----人工智能从初步到精通pytorch自定义数据集下

本篇涵盖的内容 在之前的文章中,我们已经讨论了如何获取数据,转换数据以及如何准备自定义数据集,本篇文章将涵盖更加深入的问题,希望通过详细的代码示例,帮助大家了解PyTorch自定义数据集是如何应对各种复杂实际情况中,数据处理的。 更加详细的,我们将讨论下面一些内容…

DeepSeek实战:打造智能数据分析与可视化系统

DeepSeek实战:打造智能数据分析与可视化系统 1. 数据智能时代:DeepSeek数据分析系统入门 在数据驱动的决策时代,智能数据分析系统正成为企业核心竞争力。本节将使用DeepSeek构建一个从数据清洗到可视化分析的全流程智能系统。 1.1 系统核心功能架构 class DataAnalysisS…

力扣100题---字母异位词分组

1.字母异位词分组 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 方法一&#xff1a;字母排序 class Solution {public List<List<String>> groupAnagr…

使用子查询在 SQL Server 中进行数据操作

在 SQL Server 中&#xff0c;子查询&#xff08;Subquery&#xff09;是一种在查询中嵌套另一个查询的技术&#xff0c;可以用来执行复杂的查询、过滤数据或进行数据计算。子查询通常被用在 SELECT、INSERT、UPDATE 或 DELETE 语句中&#xff0c;可以帮助我们高效地解决问题。…

Flask集成pyotp生成动态口令

Python中的pyotp模块是一个用于生成和验证一次性密码&#xff08;OTP&#xff09;的库&#xff0c;支持基于时间&#xff08;TOTP&#xff09;和计数器&#xff08;HOTP&#xff09;的两种主流算法。它遵循RFC 4226&#xff08;HOTP&#xff09;和RFC 6238&#xff08;TOTP&…

触控精灵 ADB运行模式填写电脑端IP教程

•ADB模式&#xff0c;如果你手机已经root则可以直接运行&#xff0c;无需安装电脑端。 •ADB模式&#xff0c;如果你手机没有root&#xff0c;那你可以windows电脑下载【极限投屏】软件&#xff0c;然后你的手机和电脑的网络要同一个wifi&#xff0c;然后把你电脑的ip地址填写…

【Python】 -- 趣味代码 - 佩奇

文章目录 文章目录 00 佩奇程序设计框架1. 绘图设置2. 绘制卡通人物的各个部分3. 主程序总结01 佩奇程序设计00 佩奇程序设计框架 这段代码使用 turtle 模块绘制了一个粉色的卡通人物图像,主要功能包括绘制鼻子、头、耳朵、眼睛、腮、嘴、身体、手、脚和尾巴等部分。代码的主…

uniapp-商城-69-shop(2-商品列表,点击商品展示,商品的详情, vuex的使用,rich-text使用)

页面中将我们的数据进行了罗列,对于单个数据的展示,还需要进行开发,这里使用了点击商品后,进行弹窗展示。 同样这里用一个组件来进行实现该弹窗的展示。 本文介绍了商品详情弹窗的实现方案。主要采用Vuex进行状态管理,通过几个关键组件协同工作: 商品列表组件productItem…