STM32学习笔记2 --- GPIO输入

news2024/11/24 16:49:38

目录

AD/DA

按键

传感器模块

传感器模块细节

按键模块电路

传感器模块接入电路

OLED

​编辑

代码

封装驱动代码

GPIO读取函数

按键控制LED代码

 部分解释

光敏传感器代码

部分解释

接线图

c知识补充


AD/DA

AD:模拟-数字转换

DA:数字-模拟转换

数字信号是计算机可操作的

模拟量(0-5V)  数字量(0-255V(8位))

运算放大器:很高放大倍数的放大电路单元

用上放大器的经典电路             ?   ++++++

运算放大器作为电压比较器,对模拟电压进行二值化

按键

----过滤抖动----加延时

传感器模块

:利用传感器元件(光敏电阻/热敏电阻/红外接收管等)

通过与定值电阻分压即可得到模拟电压输出

再通过电压比较器进行二值化即可得到数字电压输出

传感器模块细节

滤波电容(一接电路一接低maybe)(分析时可去):给电压输出进行滤波,滤除一些干扰,保证输出电压波形的平滑

电压比较器芯片:含两个独立的电压比较器(运算放大器)电路

电位器:拧动产生电流

DO输出指示灯:指示DO的输出电平,低电平点亮,高电平熄灭

R5:默认输出高电平(防止一直亮)!

按键模块电路

必须要求PA0是上拉输的模式,否则就会出现引脚电压不确定的错误现象

按键松开是高电平

上拉电阻VDD/下拉电阻VSS:给输入提供默认电平,防止处于浮空状态,输入数据易被干扰不确定。上通下断,上拉输入模式(默认为高电平的输入模式)//都断,浮空输入模式。(见stm32  1)

传感器模块接入电路

OLED

供电:3~5.5V,通信协议:I2C/SPI,分辨率:128*64

需要接在单片机I2C通信的引脚上 当然我给的驱动函数模块用的是GPIO口模拟的12C通信 所以这两个端口就可以接在任意的GPIO口上

代码

LED驱动/按键驱动

封装驱动代码

.h文件

#ifndef __Key_H   //防止头文件重复包含
#define __Key_H




#endif

按键初始化时

GPIO_Mode_IPU; //上拉输入

uint8_t      unsigned   char


GPIO读取函数
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//返回这个端口的高低电平
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);//读取整个输入数据寄存器
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取自己输出的内容
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);//读取自己输出的内容,整个输出数据寄存器

按键控制LED代码

main.h

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

uint8_t KeyNum;	

int main(void)	
{	//使用前,按键和灯都需要初始化,实际初始化的是按键和灯接入的IO口

	LED_Init();
	Key_Init();	

	while (1)
	{	
        KeyNum = Key_GetNum();		//获取按键键码

		if (KeyNum == 1)			//按键1按下
		{	LED1_ON();			//LED1翻转
		}
		
		if (KeyNum == 2)			//按键2按下
		{	LED1_OFF();			//LED2翻转
		}
	}
}

/key.c
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
void Key_Init(void)//按键初始化
{	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启GPIOB的时钟	
	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);						//将PB1和PB11引脚初始化为上拉输入
}
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
 部分解释
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0)//按键按下
	{
		Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0);
		Delay_ms(20);
		KeyNum = 1;
	}

消抖:

这里的while用意:其实是用于排除手一直按着不松开的情况。
如果一直按着,程序将停留在while不向下进行。
正确操作是手按下一定会有一个手抬起的动作,抬起时有抖动肯定会让那个!=0这样程序就会往下进行
总之,这一段进行完后,按键应当是按下的状态,电路接通

光敏传感器代码
/main.c
//----------------------按键控制LED--------------------------
#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();				
		}
	}
}

//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;//将PB13引脚初始化为上拉输入
	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);			//返回PB13输入寄存器的状态
}

/lightsensor.h
#ifndef __LIGHT_SENSOR_H
#define __LIGHT_SENSOR_H

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

#endif
部分解释

这里选择上下拉都可以,光敏电阻不遮挡默认输出低电平,选择上下拉在不遮挡情况下13口都是低电平,选择上拉的话,拔掉13口输入线,13口就默认高电平了,蜂鸣器就会一直响,所以只要13口有输入,上下拉都可以

光线暗,电阻变大,AO分压大,AO输出为一,电压比较器IN+大于IN-, DO输出高电平

此时光敏传感器接的那个端口读取了端口的值应为1(传感器给的,对于GPIO来说是输入)

LightSensor_Get() == 1,此时为暗

接线图

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


c知识补充

stm32中  c语言数据类型

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

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

相关文章

使用Idea进行Java开发断点打不进去

我在进行打断点时 出现了这个问题导致我无法进行断点测试 问题原因: 打的断点太多了 ,导致线程冲突 解决办法 : 删除之前打完未去掉的断点 完美解决 Nice! 有可能会不小心点到断点失效键,断点有可能会变成灰色 则为无…

【系统分析师】-综合知识-企业信息化与系统规划

1、一个有效的客户关系管理( Customer Relationship Management,CRM)解决方案应具备畅通有效的客户交流渠道、对所获信息进行有效分析和(CRM 与 ERP 很好地集成)等特点。 通过将(人力资源、业务流程与专业技术&#x…

uniapp连接手机调试App,并最终打包成apk文件,和上传到应用商店的问题

对于一些刚开始使用uniapp开发app的同学来说,有时候仅仅是第一步连接手机进行开发测试都很难进行。这篇文章就来向大家介绍一些怎样连接手机进行调试我们开发中的项目,并最终将开发好的项目打成apk包进行安装,和将开发好的App应用上传到应用商…

【递归】用递归的方法求阶乘

用递归的方法求 阶乘&#xff0c;这里我们以 求5&#xff01;为例&#xff0c;使用C语言实现 #include<stdio.h>int fact(int n){if(n1){return 1;}elsereturn n*fact(n-1); }int main(){int result;resultfact(5);printf("5的阶乘是 &#xff1a;%d",result)…

宝众宝达IPO终止:原实控人去世时间矛盾,婚外情主角任总经理

近日&#xff0c;上海证券交易所披露的信息显示&#xff0c;江苏宝众宝达药业股份有限公司&#xff08;下称“宝众宝达”&#xff09;及其保荐人中信建投证券撤回上市申请文件。因此&#xff0c;上海证券交易所决定终止对其首次公开发行股票并在主板上市的审核。 据贝多财经了解…

XXLJob接入说明

1、配置 1.1、pom文件 引入依赖 <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId> </dependency> 1.2、bootstrap.yml 增加xxljob读取配置 common-xxljob.yaml 内容如下&#xff1a; xxl:job:adm…

JavaScript(二十七)——JavaScript 函数定义

目录 JavaScript 函数定义 函数声明 函数表达式 Function() 构造函数 函数提升&#xff08;Hoisting&#xff09; 自调用函数 函数可作为一个值使用 函数是对象 箭头函数 JavaScript 函数定义 JavaScript 使用关键字 function 定义函数。 函数可以通过声明定义&#…

力扣第45题:跳跃游戏 贪心DP(C++)

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…

【附保姆级教程】两个月内快速涨粉17万,变现2w+,儿童英语阅读,家长辅导孩子必备!

目录 一、前言 二、儿童英语阅读教程 第一步&#xff1a;利用AI代写英语阅读短文 第二步&#xff1a;使用Flux生成场景图 第三步&#xff1a;将文本转为音频 第四步&#xff1a;使用canva工具进行排版 第五步&#xff1a;剪辑视频 一、前言 大家好&#xff0c;我是小奇…

如何在国外市场推广中国游戏

在国外市场推广中国游戏需要一种考虑文化差异、市场偏好和有效营销渠道的战略方法。以下是成功向国际观众介绍和推广中国游戏的关键步骤和策略&#xff1a; 进行市场调研 了解目标市场&#xff1a;首先确定哪些外国市场对你的游戏最具潜力。考虑类似游戏类型的受欢迎程度、玩…

找工作准备刷题Day21 动态规划算法 (卡尔41期训练营 8.6)

上周有些事情回了趟老家&#xff0c;祝广大博友身体健康&#xff0c;多运动。前面的贪心算法题目后面慢慢补&#xff0c;近期找到了一个实习&#xff0c;大概持续三个月&#xff0c;现在计划是白天工作&#xff0c;晚上下班以后运动运动刷题。要加强牛客网那种两小时3道题的刷题…

【LVS】负载均衡--nat模式/实验

一、LVS运行原理 LVS:Linux Virtual Server &#xff0c;负载调度器&#xff0c;内核集成&#xff0c;章文嵩&#xff0c;阿里的四层 SLB(Server LoadBalance) 是基于LVSkeepalived 实现 LVS 官网 : http://www.linuxvirtualserver.org/ LVS 相关术语 VS: Virtual Server&…

poetry配置镜像

1.简介 poetry 是一个包管理和打包的工具。 在 Python 中&#xff0c;对于初学者来说&#xff0c;打包系统和依赖管理是非常复杂和难懂的。即使对于经验丰富的开发者&#xff0c;一个项目总是要同时创建多个文件&#xff1a; setup.py ,requirements.txt,setup.cfg , MANIFES…

Python爬虫入门:如何设置代理IP进行网络爬取或数据采集

在如今这个信息爆炸的时代&#xff0c;数据成为了最有价值的资源之一。而Python作为一种强大且易学的编程语言&#xff0c;被广泛应用于数据采集和网络爬虫中。然而&#xff0c;直接进行网络爬取往往会遇到IP被封禁的问题&#xff0c;因此使用代理IP就成了一个有效的解决方案。…

SpringBoot中读取配置的七种方法总结

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

Python | TypeError: unsupported operand type(s) for +=: ‘int’ and ‘str’

Python | TypeError: unsupported operand type(s) for : ‘int’ and ‘str’&#xff1a;深度解析 在Python编程中&#xff0c;遇到“TypeError: unsupported operand type(s) for : ‘int’ and ‘str’”这类错误通常意味着你尝试将一个整数&#xff08;int&#xff09;和…

基于OpenCV+MFC的视频读取与对象跟踪平台

基于OpenCVMFC的视频读取与对象跟踪平台 引言一、软件功能简介二、各个功能介绍1、视频操作模块功能介绍1.1打开视频1.2打开摄像头1.3开始录制1.4结束录制1.5暂停1.6恢复1.7关闭1.8还原 2、对象跟踪模块功能介绍2.1 BSM跟踪2.2 颜色跟踪2.3 光流跟踪2.4 KCF多对象跟踪 资源链接…

干货 | 2024步入数字化转型深水区,云原生业务稳定性如何保障(免费下载)

云原生业务的稳定性保障是一个涉及多个层面的复杂任务&#xff0c;以下是一些关键措施和策略&#xff0c;以确保云原生业务的高效稳定运行&#xff1a; 一、平台安全性评估与加固 云原生平台安全评估&#xff1a;对云原生平台&#xff08;如Kubernetes、Docker等&#xff09;…

数学建模--智能算法之鱼群算法

目录 核心原理 应用与实现 实现步骤 性能分析与改进 鱼群算法在解决哪些具体优化问题方面表现最佳&#xff1f; 如何根据不同的应用场景调整鱼群算法的参数设置以提高其性能&#xff1f; 鱼群算法与其他群体智能优化算法&#xff08;如遗传算法、粒子群优化&#xff09;…

鸿道Intewell工业操作系统ARM平台生态:飞腾E2000Q

在这个智能制造和工业自动化的新时代&#xff0c;工业操作系统不仅是技术进步的推动者&#xff0c;更是企业转型升级的加速器。随着全球工业的快速发展&#xff0c;对于能够适应复杂工业环境、满足多样化生产需求的工业操作系统的需求愈发迫切。 鸿道Intewell工业操作系统ARM…