GPIO输入

GPIO输入

实现的功能:按键控制LED、光敏传感器控制蜂鸣器

按键:常见的输入设备,按下导通,松开断开

GPIO输入_第1张图片

按键抖动:由于按键内部使用的是机械弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动。

GPIO输入_第2张图片

传感器模块介绍

传感器模块:传感器元件(传感器模块就是利用传感器元件,比如如下图的光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化(比如光线越强,光敏电阻的阻值就越小),通过与定值电阻进行串联分压即可得到模拟电压输出,再通过电压比较器进行二值化(二值化就是要么是高要么是低)即可得到数字电压输出。

GPIO输入_第3张图片

GPIO输入_第4张图片

N1就是传感器元件所代表的可变电阻,它的阻值可以根据环境的光线、温度等模拟两进行变化。

N1上面的R1,是和N1进行分压的定值电阻,R1和N1串联,一端接VCC一端接VSS,这就构成了基本的分压电路,AO电压就由R1和N1两个电阻的分压得到。

N1左边的C2是一个滤波电容,它是为了给中间的电压输出进行滤波的,用来滤除一些干扰,保证输出电压波形的平滑。一般我们在电路中遇到一端接到电路中,另一端接地的电容,都可以考虑一下是不是滤波电容的作用,并不是电路的主要框架,这时候我们进行分析电路时,就可以先把这个电容抹掉,这样就可使我们的电路分析更加简单。

二值化输出是通过这个LM393芯片来完成,是一个电压比较器芯片,里面由两个独立的电压比较器电路,然后剩下的是VCC和GND供电,里面电容是一个电源供电的滤波电容,这个电压比较器其实就是一个运算放大器,当同向输入端的电压大于反向输入端的电压时,输出就会瞬间升高为最大值也就是输出接VCC;反之当同向输入端的电压小于反向输入端的电压时,输出就会瞬间降为最小值,也就是输出接GND,这样就可以对一个模拟电压进行二值化了,DO就是最后数字电压的输出。

硬件电路

GPIO输入_第5张图片

上面两个是下接按键的方式,下面两个是上接按键的方式,一般都是用下接的方式。(这个原因跟LED的接法类似,是电路设计的习惯和规范)

GPIO输入_第6张图片

随便选取一个GPIO口,比如PA0,然后通过k1接到地。当按键按下时,PA0被直接下拉到GND,此时读取PA0口的电压就是低电平、当按键松手时,PA0被悬空,悬空意味着不确定,所以必须要求PA0是上拉输入的模式,否则就会出现引脚电压不确定的错误现象。所以这种模式下,按下按键,引脚为低电平,松手,引脚为高电平。

GPIO输入_第7张图片

相比较第一个图,在这里外部接了一个上拉电阻,这个上拉大家可以想象成一个弹簧,把这个端口向屋顶上拉。当按键松手时,引脚由于上拉作用,自然保持为高电平、当按键按下时,引脚直接接到GND,也就是一股无穷大的力把这个引脚往下拉,此时为低电平。此时PA0引脚可以配置为浮空输入或者上拉输入。如果是上拉输入,那就是内外两个上拉电阻共同作用了。这时高电平就会更强一些,对应高电平就更加稳定,当然这样的话,当引脚被强行拉到低时,损耗就会大一些。

GPIO输入_第8张图片

PA0通过按键接到3.3V,这样也是可以的,不过要求PA0必须配置成下拉输入的模式。当按键按下时,引脚为高电平,松手时,引脚回到默认值低电平,这要求单片机的引脚可以配置为下拉输入的模式。

GPIO输入_第9张图片

这种接法下面在外接一个下拉电阻,这种接法PA0需要配置为下拉输入模式或者浮空输入模式。

C语言数据类型

GPIO输入_第10张图片

C语言宏定义

关键字:#define

用途:用一个字符串代替一个数字,便于理解,防止出错;提取程序中经常出现的参数,便于快速修改。

定义宏定义:

#define ABC 12345

引用宏定义:

Int a = ABC;   //等效于int a = 12345;

C语言typedef

关键字:typedef

用途:将一个比较长的变量类型名换个名字,便于使用。

定义typedef:

Typedef unsigned char uint8_t;

引用typedef:

Unit8_t a;  //等效于Typedef unsigned char a;

宏定义新名字在左边,typedef新名字在右边;宏定义不需要加分号,typedef后面必须加分号。

C语言结构体

关键字:struct

用途:数据打包,不同类型变量的集合

定义结构体变量:

struct{char x; int y; float z;} StructName;

StructName是结构体变量的名字。

因为结构体变量类型较长,所以通常用typedef更改变量类型名。

引用结构体成员:

StructName.x = 'A';   

StructName.y = 666;  

StructName.z = 1.23;

C语言枚举

关键字:enum

用途:定义一个取值受限制的整型变量,用于限制变量取值范围、宏定义的集合。

定义枚举变量:

enum{FALSE = 0, TRUE = 1} EnumName;

因为枚举变量类型较长,所以通常用typedef更改变量类型名。

引用枚举成员:

EnumName = FALSE; // EnumName = 0

EnumName = TRUE ; // EnumName = 1

你可能感兴趣的:(STM32,单片机,嵌入式硬件)