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

#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语言数据类型

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值