STM32-按键及传感器模块

news2024/9/28 3:27:29

本内容是基于江协科技STM32视频整理而得。

1. 按键及传感器模块

1.1 按键简介

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

1.2 传感器模块简介

传感器模块:传感器元件(光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出,再通过电压比较器进行二值化即可得到数字电压输出。
image.png
image.png
N1是传感器代表的可变电阻,其阻值可以根据环境的光线、温度等模拟量进行变化。
C2是一个滤波电容,是为了给中间的电压输出进行滤波的,用来滤除一些干扰,保证输出电压波形的平滑。
R1是和N1进行分压的定值电阻,R1和N1串联,一端连接在VCC正极,一端接在GND负极,构成基本的分压电路。
当N1阻值变小时,下拉作用就会增强,中间的AO端的电压就会拉低,极端情况下,N1阻值为0,AO输出被完全下拉,输出0V。当N1阻值变大,下拉作用就会减弱,中间的引脚由于R1的上拉作用,电压就会升高,极端情况下,N1阻值无穷大,相当于断路,输出电压被R1拉高至VCC。AO是模拟电压输出,就直接通过排针输出了。
数字输出就是对AO进行二值化的输出,二值化是通过芯片LM393完成的,LM393是一个电压比较器芯片,里面有两个独立的电压比较器电路。VCC接到了电路的VCC,GND接到了电路的GND。C1是一个电源供电的滤波电容。电压比较器就是一个运算放大器,当IN+>IN- 时,输出接VCC,IN+<IN-时,输出接GND。
IN-接了一个电位器,这个电位器的接法也是分压电阻的原理,拧动电位器,IN-就会生成一个可调的阈值电压。
LED1是电源指示灯,LED2是DO输出电平指示灯,低电平点亮,高电平熄灭,R5上拉电阻是为了保证默认输出高电平的。

1.2.1 光敏电阻传感器

image.png
image.png
image.png

传感器电阻为光敏电阻时,光照强度降低,当无光照时,电阻呈高阻状态,IN+=VCC,IN+ > IN-,DO输出高电平;光照强度升高,电阻值降低,IN+=GND,IN+ < IN-,DO输出低电平。

1.3 硬件电路

image.png
上面两种接法按键按下时引脚是低电平,松手是高电平,
下面两种接法按键按下时引脚是高电平,松手是低电平。

1.4 GPIO读取输出寄存器和读取输入寄存器的库函数

  1. **uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);**用来读取输入数据寄存器某一个端口的输入值,返回值代表引脚的高低电平。
    image.png
    image.png

  2. **uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);**用来读取整个输入数据寄存器的,返回值是16位的,代表端口值
    image.png

  3. **uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);**用来读取输出数据寄存器的某一个位的,用于输出模式下,用来看一下输出的是什么。
    image.png

  4. **uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);**用来读取整个输出数据寄存器的,
    image.png

2. 按键控制LED代码

2.1 硬件连接

两个按键控制两个LED,KEY1控制LED1,KEY2控制LED2。实现功能:按键按下,LED亮,按键再按下,LED灭。
image.png

2.2 代码实现流程

  1. 按键代码:
    1. 初始化:开启GPIO时钟;初始化GPIO,引脚配置为上拉输入;
    2. 获取按键值:读PB1和PB11输入寄存器的值,若为0,则表明按键按下,设PB1的按键值为1,PB11的按键值为2;由于按键按下及按键松手都会有抖动,因此需要设置一段延时来进行消抖。
  2. LED代码:
    1. 初始化:开启GPIO时钟;初始化GPIO,引脚配置为推挽输出;
    2. 分别开启和关闭LED1和LED2:PA1和PA2为低电平时点亮LED;高电平时熄灭LED。
    3. LED状态翻转:获取PA1和PA2端口输出寄存器的状态,如果为0(即端口为低电平),则将其置高电平,否则,置低电平。(实现功能:如果现在LED是亮的,则按键按下,LED熄灭;如果LED是熄灭的,则按键按下,LED点亮)

2.4 代码

  • 按键代码

#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_Pin = GPIO_Pin_1 | GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;
	// 读取PB1端口的值,返回值就是输入寄存器某一位的值,0代表低电平,1代表高电平
	// 读取GPIO_Pin_1端口的值==0,就代表按键按下,
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
	{
		// 按键刚按下,会有个抖动,所以需要Delay一段时间,
		Delay_ms(20);
		// 检测一下按键松手的情况,因为按键一般是松手之后才会有动作的,
		// 如果按键一直按下,就卡在while循环里,直到松手,
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
		// 松手之后再Delay_ms(20),消除按键松手的抖动
		Delay_ms(20);
		KeyNum = 1;// 用变量将键码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;
}
  • LED代码
/*led代码*/

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

void LED_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
}

void LED1_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}

void LED1_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
}

// LED的状态取反
void LED1_Turn(void)
{
	// 调用GPIO_ReadOutputDataBit函数,读取当前的端口输出状态,
	// 当前输出0,就给它置1,否则就置0。这样就实现了端口的电平翻转
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_1);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);
	}
}

void LED2_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}

void LED2_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
}

void LED2_Turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_2);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_2);
	}
}
/*main代码*/

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"

uint8_t KeyNum;

int main()
{
	LED_Init();
	Key_Init();
	
	while(1)
	{
		// 实现按下按键,led亮,再按一下按键,led灭
		
		KeyNum = Key_GetNum();
		if (KeyNum == 1)
		{
			LED1_Turn();
		}
		if (KeyNum == 2)
		{
			LED2_Turn();
		}
		
	}
}

3. 光敏传感器控制蜂鸣器代码

3.1 硬件连接

蜂鸣器I/O口接PB12,光敏传感器DO接PB13。
实现功能:光敏传感器被遮挡,输出1:蜂鸣器开启;否则,蜂鸣器关闭。
image.png

3.2 代码流程

  1. 光敏传感器代码:
    1. 开启GPIOB时钟,配置为上拉输入模式;
    2. 获取光敏传感器的输出的高低电平;有遮挡时,输出高电平,无遮挡时,输出低电平。
  2. 蜂鸣器代码:
    1. 开启GPIOB时钟,配置为推挽模式;
    2. 开启和关闭蜂鸣器:低电平开启蜂鸣器,高电平关闭蜂鸣器。
    3. 蜂鸣器状态翻转:蜂鸣器PB12输出寄存器状态为0,则将PB12设置为高电平;否则输出当期引脚输出高电平,则设置PB12为低电平。

3.3 代码

/*光敏传感器代码*/
/**
  * 函    数:光敏传感器初始化
  * 参    数:无
  * 返 回 值:无
  */
void LightSensor_Init(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启GPIOB的时钟
	
	/*GPIO初始化*/
	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);						//将PB13引脚初始化为上拉输入
}

/**
  * 函    数:获取当前光敏传感器输出的高低电平
  * 参    数:无
  * 返 回 值:光敏传感器输出的高低电平,范围:0/1
  */
uint8_t LightSensor_Get(void)
{
	return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);			//返回PB13输入寄存器的状态
}
/*蜂鸣器代码*/
#include "stm32f10x.h"                  // Device header

/**
  * 函    数:蜂鸣器初始化
  * 参    数:无
  * 返 回 值:无
  */
void Buzzer_Init(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启GPIOB的时钟
	
	/*GPIO初始化*/
	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);						//将PB12引脚初始化为推挽输出
	
	/*设置GPIO初始化后的默认电平*/
	GPIO_SetBits(GPIOB, GPIO_Pin_12);							//设置PB12引脚为高电平
}

/**
  * 函    数:蜂鸣器开启
  * 参    数:无
  * 返 回 值:无
  */
void Buzzer_ON(void)
{
	GPIO_ResetBits(GPIOB, GPIO_Pin_12);		//设置PB12引脚为低电平
}

/**
  * 函    数:蜂鸣器关闭
  * 参    数:无
  * 返 回 值:无
  */
void Buzzer_OFF(void)
{
	GPIO_SetBits(GPIOB, GPIO_Pin_12);		//设置PB12引脚为高电平
}

/**
  * 函    数:蜂鸣器状态翻转
  * 参    数:无
  * 返 回 值:无
  */
void Buzzer_Turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) == 0)		//获取输出寄存器的状态,如果当前引脚输出低电平
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_12);						//则设置PB12引脚为高电平
	}
	else														//否则,即当前引脚输出高电平
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_12);						//则设置PB12引脚为低电平
	}
}
/*main代码*/
#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)		//如果当前光敏输出1
		{
			Buzzer_ON();				//蜂鸣器开启
		}
		else							//否则
		{
			Buzzer_OFF();				//蜂鸣器关闭
		}
	}
}

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

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

相关文章

大模型性能测试报告

性能测试背景 满足大模型在初期1万用户的正常使用 性能测试名词解释 术语 释义 VU 并发用户数 RT 响应时间 TPS 吞吐量的一种&#xff0c;指每秒处理的事务数&#xff0c;每个事务可以是一个接口或者多个接口 QPS 吞吐量的一种,指每秒服务器处理的请求数量&#xff…

HTML5新增的input元素属性:placeholder、required、autofocus、min、max等

HTML5 大幅度地增加与改良了 input 元素的属性&#xff0c;可以简单地使用这些属性来实现 HTML5 之前需要使用 JavaScript 才能实现的许多功能。 下面将详细介绍这些新增的 input 元素的属性。 属性说明属性说明placeholder在输入框显示描述性或提示性文本list为文本框添加选…

摸鱼大数据——Spark SQL——Spark SQL函数定义一

Spark SQL函数定义 1、窗口函数 回顾之前学习过的窗口函数&#xff1a; 分析函数 over(partition by xxx order by xxx [asc|desc] [rows between xxx and xxx])​分析函数可以大致分成如下3类&#xff1a;1- 第一类: 聚合函数 sum() count() avg() max() min()2- 第二类: 排…

Python酷库之旅-第三方库Pandas(011)

目录 一、用法精讲 25、pandas.HDFStore.get函数 25-1、语法 25-2、参数 25-3、功能 25-4、返回值 25-5、说明 25-6、用法 25-6-1、数据准备 25-6-2、代码示例 25-6-3、结果输出 26、pandas.HDFStore.select函数 26-1、语法 26-2、参数 26-3、功能 26-4、返回值…

3D模型格式转换工具HOOPS Exchange如何访问产品制造信息(PMI)?

在当今的制造和设计领域&#xff0c;产品制造信息&#xff08;PMI&#xff09;在确保零件和产品满足精确规格方面发挥着至关重要的作用。PMI&#xff0c;特别是几何尺寸和公差&#xff08;GD&T&#xff09;&#xff0c;提供了制造过程中必须遵循的详细指导。 随着技术的进…

centos7停服之后换阿里云的源

原因&#xff1a; Centos7停止维护 CentOS 7 官方支持在2024年6月30日结束。如果您正在使用CentOS 7&#xff0c;建议迁移到另一个仍在维护的Linux发行版&#xff0c;如CentOS Stream、AlmaLinux、Rocky Linux或者转换到使用Debian或Ubuntu。国产的华为的&#xff1a;openEule…

数据恢复篇:如何从硬盘中恢复照片

如何从计算机硬盘恢复图片&#xff1f; 和所有电子和机械设备一样&#xff0c;硬盘也可能因任何原因而损坏。如果您系统的硬盘停止工作&#xff0c;或者您在启动系统时听到振动声&#xff0c;则硬盘可能已损坏。如果是这样&#xff0c;硬盘上的数据怎么办&#xff1f; 不要惊…

Python开源工具库使用之离线翻译软件Argos-Translate

文章目录 一、软件介绍二、软件使用2.1 命令行使用2.2 Python代码调用2.3 GUI使用 三、软件获取 一、软件介绍 Argos-Translate 是一款基于 OpenNMT&#xff08;Open source Neural Machine Translation&#xff09;的离线翻译库&#xff0c;不需要联网就可以实现翻译功能&…

唐山养老院哪家好---养老!用哪种方式更合适?

人生旅途中&#xff0c;每个阶段都伴随着不同的挑战和难题。老年阶段尤其如此&#xff0c;随着岁月的流逝&#xff0c;人的身体机能逐渐衰退&#xff0c;自理能力也会随之减弱。面对这些挑战&#xff0c;老人及其家属需要找到合适的方法来保证老年的生活质量。 居家养老 在中…

7月学术会议:7月可投的EI国际会议

随着科技的迅猛发展&#xff0c;学术交流与研讨成为了推动科研进步的重要途径。进入7月&#xff0c;众多高质量的EI国际会议纷纷拉开帷幕&#xff0c;为全球的科研工作者提供了一个展示研究成果、交流学术思想的平台。以下&#xff0c;我们将详细介绍一些在7月可投的EI国际会议…

暑假提升(3)[平衡二叉树之二--红黑树]

命为志存。 —— 朱熹 红黑树RBTree 1、诞生原因2、红黑树的概念3、红黑树的性质4、红黑树的设计4、1、节点设计4、2、插入操作的设计 5、总结 1、诞生原因 由于二叉树的局限性&#xff0c;进一步出现平衡二叉树&#xff0c;来帮助我们来进一步提升我们对数据的处理&#xff0…

模电基础 - 信号的运算和处理

目录 一. 简介 二. 加法 三. 减法 四. 乘法 五. 除法 六. 总结 一. 简介 在模电基础中&#xff0c;信号的运算和处理是非常重要的内容。 信号的运算包括加法、减法、乘法、除法等。通过使用集成运放&#xff0c;可以很容易地实现这些运算。例如&#xff0c;利用反相输入…

【工具分享】I-Wanna-Get-All——主流OA漏洞检测利用工具

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 I-Wanna-Get-All安装方式功能介绍 GitHub项目地址&#xff1a;https://github.com/R4gd0ll/I-Wanna-G…

如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围

如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围 在这篇博客中&#xff0c;我将介绍如何使用HTML和JavaScript读取文件夹中的所有图片&#xff0c;并显示这些图片以及它们的RGB范围。这个项目使用现代浏览器提供的<input type"file" webkitdirecto…

生产力工具|Endnote X9如何自动更新文件信息

一、以EndNote X9.2版本为例&#xff0c;打开EndNote文献管理软件。 二、在菜单栏找到“Edit→Preferences...”&#xff0c;点击打开&#xff0c;弹出一个“EndNote Preferences”窗口。 三、进行设置 在打开的窗口左侧选择“PDF Handing”&#xff0c;右边会出现自动导入文献…

科普文:spring boot中常用的接口、工具栏、注解整理

1.springboot 常用接口 1.1 Aware接口 Spring IOC容器中 Bean是感知不到容器的存在&#xff0c;Aware(意识到的)接口就是帮助Bean感知到IOC容器的存在&#xff0c;即获取当前Bean对应的Spring的一些组件&#xff0c;如当前Bean对应的ApplicationContext等。 1.1.1 Applicati…

顶刊文献阅读及代码复现

前提:每个无人机都有 (i)自己的机载计算机,用于执行控制其自身动作所需的计算 (ii)自己的传感器系统,用于测量相对位置和速度, (iii)自己的通信设备,用于与相邻代理进行数据交换。 模型:短期的排斥力、中间范围的速度一致性和长距离的吸引力

开发工具 之十一 详解 OpenOCD 源码、构建、配合各仿真器使用示例

OpenOCD OpenOCD(Open On-Chip Debugger)是一个开源的跨平台的片上调试器,旨在提供针对嵌入式设备的调试、系统编程和边界扫描功能。其工作方式就是代替了原有那些调试适配器提供的相关工具和驱动, 直接通过普通的 USB 驱动访问适配器,进而访问目标硬件。 OpenOCD 是由 D…

【前端】使用chrom浏览器Network,查看前后台数据传输请求

使用chrom浏览器Network查看前后台数据传输请求 写在最前面查看前后台数据传输请求① 首先&#xff0c;打开开发者工具&#xff08;F12&#xff09;打开控制台&#xff0c;切换到Network面板。Network面板右键界面copy ②清空请求log ctrle两次或者点击clear图标 案例展示&…

MySQL日常运维手册

对象创建DDL查询 -- 获取创建 database 的 DDL show create database_name; -- 获取创建 表 的 DDL show create table table_name; -- 获取创建 视图 的 DDL show create view index_name; -- 获取创建 触发器 的 DDL show create trigger trigger_name; -- 获取创建 用…