文章目录
- 前置知识
- 按键介绍
- 传感器模块
- 硬件电路
- 按键硬件电路
- 传感器模块硬件电路
- C语言数据类型在Keil中的对应写法
- C语言枚举
- 按键控制LED
- 接线图
- Hardware文件夹(模块化编程)
- LED驱动程序封装
- Key(按键)驱动程序封装
- main.c源文件
- 光敏传感器控制蜂鸣器
- 接线图
- Hardware文件夹
- Buzzer(蜂鸣器)驱动程序封装
- LightSensor(光敏传感器)驱动程序封装
- main.c源文件
前置知识
按键介绍
- 按键:常见的输入设备,按下导通,松手断开
- 按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动
传感器模块
传感器元件(光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出,再通过电压比较器进行二值化即可得到数字电压输出
【注意】传感器元件长得很相似,要注意辨别(我当时刚开始做的时候就搞混了,导致实验现象出问题)
传感器原件电路原理图
【补充分析】
当 N1 阻值变小时,下拉作用增强,中间 AO 端电压被拉低,极端情况下,N1阻值为 0,AO 输出被完全下拉,输出 0V
当 N1 阻值增大时,下拉作用减弱,中间 AO 端电压由于 R1 的上拉作用升高,极端情况下,N1阻值为无穷大,相当于断路,AO 输出被 R1 拉高至 VCC
得到的 AO(模拟电压输出)通过排针直接输出
硬件电路
按键硬件电路
下接按键方式
【分析】
选取一个 GPIO 接口,通过 K1 接地
按键按下时,PA0 被直接下拉到 GND,此时读取 PA0 口的电压就是低电平
按键松开时,PA0 被悬空,PA0 引脚电压不确定,所以在这种接法下必须要求 PA0 是上拉输入模式,默认 PA0 口为高电平
【分析】
相比于上一种接法,这种接法在外部接了一个上拉电阻
按键按下时,PA0 被直接下拉到 GND,此时读取 PA0 口的电压就是低电平
按键松开时,引脚由于上拉作用,自然保持为高电平
在这种状态下,引脚不会出现悬空状态,所以此时 PA0 引脚可以配置为浮空输入或者上拉输入
上接按键方式
【分析】
选取一个 GPIO 接口,通过 K1 接到 3.3V
按键按下时,PA0 被直接上拉到 3.3V,此时读取 PA0 口的电压就是高电平
按键松开时,PA0 被悬空,PA0 引脚电压不确定,所以在这种接法下必须要求 PA0 是下拉输入模式,默认 PA0 口为低电平(但是一般的单片机不一定有下拉输入模式)
【分析】
相比于上一种接法,这种接法在外部接了一个下拉电阻
按键按下时,PA0 被直接上拉到 3.3V,此时读取 PA0 口的电压就是高电平
按键松开时,引脚由于下拉作用,自然保持为低电平
在这种状态下,引脚不会出现悬空状态,所以此时 PA0 引脚可以配置为浮空输入或者下拉输入
推荐使用下接按键的方式,原因和LED接法类似,因为很多单片机和芯片都使用了高电平弱驱动,低电平强驱动的规则
传感器模块硬件电路
因为使用的是模块方案,所以电路非常简单(传感器详细的内部硬件电路上面已经简单介绍过了)
C语言数据类型在Keil中的对应写法
关键字 | 位数 | 表示范围 | stdint关键字 | ST关键字 |
---|---|---|---|---|
char | 8 | -128 ~ 127 | int8_t | s8 |
unsigned char | 8 | 0 ~ 255 | uint8_t | u8 |
short | 16 | -32768 ~ 32767 | int16_t | s16 |
unsigned short | 16 | 0 ~ 65535 | uint16_t | u16 |
int | 32 | -2147483648 ~ 2147483647 | int32_t | s32 |
unsigned int | 32 | 0 ~ 4294967295 | uint32_t | u32 |
long | 32 | -2147483648 ~ 2147483647 | ||
unsigned long | 32 | 0 ~ 4294967295 | ||
long long | 64 | -( 2 64 2^{64} 264)/2 ~ ( 2 64 2^{64} 264)/2-1 | int64_t | |
unsigned long long | 64 | 0 ~ ( 2 64 2^{64} 264)-1 | uint64_t | |
float | 32 | -3.4e38 ~ 3.4e38 | ||
double | 64 | -1.7e308 ~ 1.7e308 |
C语言枚举
-
关键字:enum
-
用途:定义一个取值受限制的整型变量,用于限制变量取值范围;宏定义的集合
-
定义枚举变量:
-
enum{FALSE = 0, TRUE = 1} EnumName;
因为枚举变量类型较长,所以通常用 typedef 更改变量类型名
-
-
引用枚举成员:
EnumName = FALSE;
EnumName = TRUE;
按键控制LED
接线图
Hardware文件夹(模块化编程)
LED驱动程序封装
LED.c
LED.h
Key(按键)驱动程序封装
Key.c
【说明】
-
Key_GetNum
的作用是读取某个硬件按钮(按键)的状态,并返回一个对应的数字,表示哪个按键被按下 -
函数返回一个
uint8_t
类型的值(无符号8位整数),用于表示按键的编号 -
初始化
KeyNum
为 0,表示默认没有按键被按下 -
通过
GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)
检查GPIOB
的引脚1 的输入状态,如果该引脚的值为 0(表示按钮被按下),则进行以下操作:- 调用
Delay_ms(20)
,延迟20毫秒,消除按键抖动 - 进入一个
while
循环,直到按钮被释放(即引脚不再为 0) - 再次延迟20毫秒,进一步消除抖动
- 将
KeyNum
设置为 1,表示第一个按键被按下
- 调用
-
读取第二个按键(GPIO_Pin_11),和第一个引脚类似
如果该引脚的值为 0,执行相同的去抖动和状态读取逻辑,然后将
KeyNum
设置为 2,表示第二个按键被按下 -
函数返回
KeyNum
,如果没有按键被按下,返回值为 0;如果第一个按键被按下,返回 1;如果第二个按键被按下,返回 2
Key.h
main.c源文件
光敏传感器控制蜂鸣器
接线图
Hardware文件夹
Buzzer(蜂鸣器)驱动程序封装
Buzzer.c
Buzzer.h
LightSensor(光敏传感器)驱动程序封装
LightSensor.c
LightSensor.h
main.c源文件
STM32 专栏文章均参考 《STM32入门教程-2023版 细致讲解 中文字幕》教程视频