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

目录

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文件

cs 复制代码
#ifndef __Key_H   //防止头文件重复包含
#define __Key_H




#endif

按键初始化时

cs 复制代码
GPIO_Mode_IPU; //上拉输入

++uint8_t unsigned char++


GPIO读取函数
cs 复制代码
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

cs 复制代码
/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
部分解释
cs 复制代码
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这样程序就会往下进行

总之,这一段进行完后,按键应当是按下的状态,电路接通

光敏传感器代码
cs 复制代码
/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语言数据类型

相关推荐
__water44 分钟前
『功能项目』QFrameWork框架重构OnGUI【63】
c#·unity引擎·重构背包框架
优思学院1 小时前
优思学院|如何从零开始自己学习六西格玛?
大数据·运维·服务器·学习·六西格玛黑带·cssbb
Crazy Struggle1 小时前
C# + WPF 音频播放器 界面优雅,体验良好
c#·wpf·音频播放器·本地播放器
LN花开富贵1 小时前
stm32g431rbt6芯片中VREF+是什么?在电路中怎么设计?
笔记·stm32·单片机·嵌入式硬件·学习
怀九日1 小时前
C++(学习)2024.9.18
开发语言·c++·学习·面向对象·引用·
一道秘制的小菜1 小时前
C++第七节课 运算符重载
服务器·开发语言·c++·学习·算法
qq21084629531 小时前
【stm32笔记】使用rtt-studio与stm32CubeMx联合创建项目
笔记·stm32·嵌入式硬件
CV金科1 小时前
蓝桥杯—STM32G431RBT6按键的多方式使用(包含软件消抖方法精讲)从原理层面到实际应用(一)
stm32·单片机·嵌入式硬件·蓝桥杯
晨曦_子画1 小时前
C#实现指南:将文件夹与exe合并为一个exe
c#
2021.091 小时前
五、CAN总线
嵌入式硬件