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

news2025/6/4 11:48:07

    🔎【博主简介】🔎

        🏅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的输出寄存器=0
		GPIO_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_H

extern 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_H

extern 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_H

void Key_Init(void);
uint8_t Key_GetNum(void);

#endif

Buzzer.c

#include "stm32f10x.h"                  // Device header

void 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_H

void Buzzer_Init(void);
void Buzzer_ON(void);
void Buzzer_OFF(void);
void Buzzer_Turn(void);

#endif

LightSensor.c

#include "stm32f10x.h"                  // Device header

void 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_H

void LightSensor_Init(void);
uint8_t LightSensor_Get(void);

#endif

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

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

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

相关文章

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 策略模式:设计模式中的 “创建者” 与 “决策者”

在日常工作里,需求变动或者新增功能是再常见不过的事情了。而面对这种情况时,那些耦合度较高的代码就会给我们带来不少麻烦,因为在这样的代码基础上添加新需求往往困难重重。为了保证系统的稳定性,我们在添加新需求时,…

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…

RV1126-OPENCV 图像叠加

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

修改 vscode 左侧导航栏的文字大小 (更新版)

1. 起因&#xff0c; 目的: 问题&#xff1a; vscode 左侧的文字太小了&#xff01;&#xff01;&#xff01;我最火的一篇文章&#xff0c;写的就是这个问题。 看来这个问题&#xff0c;是很广泛的一个痛点。我最近更新了 vscode&#xff0c; 这个问题又出现了。再来搞一下。…

云原生 Cloud Native Build (CNB)使用初体验

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

格式工厂 FormatFactory v5.20.便携版 ——多功能媒体文件转换工具 长期更新

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VORWF3Q7D0eCVV06LHbzheD-A1?pwdjikz# 【​本章下载二】&#xff1a;https://pan.quark.cn/s/8ee59ed83658 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…

数据可视化--使用matplotlib绘制高级图表

目录 一、绘制等高线图 contour() 二、绘制矢量场流线图 streamplot() 三、绘制棉棒图 stem() 四、绘制哑铃图 五、绘制甘特图 六、绘制人口金字塔图 barh() 七、绘制漏斗图 简易版漏斗图 八、绘制桑基图 Sankey()---创建桑基图 add()---添加桑基图的选项 finish()…

如何做好一个决策:基于 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的初识与基本操作

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

搜索引擎2.0(based elasticsearch6.8)设计与实现细节(完整版)

1 简介 1.1 背景 《搜索引擎onesearch 1.0-设计与实现.docx》介绍了1.0特性&#xff0c;搜索schema&#xff0c;agg&#xff0c;表达式搜索映射&#xff0c;本文介绍onesearch 2.0 新特性, 参考第2节 规划特性与发布计划 1.2 关键词 文档 Document elasticsearch 一行数据称为…

Go 即时通讯系统:客户端与服务端 WebSocket 通信交互

客户端和服务端的交互 客户端与服务端建立连接 客户端&#xff1a;客户端通过浏览器或者其他应用程序发起一个 HTTP 请求到服务端的 /socket.io 路径。在请求中会携带用户的 UUID 作为参数&#xff08;通过 c.Query("user") 获取&#xff09;。 // router/socket.…

某航后缀混淆逆向与顶像风控分析

文章目录 1. 写在前面2. 接口分析3. 加密分析4. 风控分析 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…

[Protobuf]常见数据类型以及使用注意事项

[Protobuf]常见数据类型以及使用注意事项 水墨不写bug 文章目录 一、基本数据类型1、字段2、字段的修饰规则 二、自定义数据类型1、message类型2、enum类型3、Any类型4、oneof类型5、map类型 三、小工具1.hexdump2.decode 四、注意事项 一、基本数据类型 protobuf 支持多种基础…

模拟实现线程池(线程数目为定值)和定时器

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

数据结构之队列实验

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