欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > 【STM32】按键控制LED 光敏传感器控制蜂鸣器

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

2024/11/6 17:33:48 来源:https://blog.csdn.net/m0_74209563/article/details/143363099  浏览:    关键词:【STM32】按键控制LED 光敏传感器控制蜂鸣器

文章目录

  • 前置知识
    • 按键介绍
    • 传感器模块
    • 硬件电路
      • 按键硬件电路
      • 传感器模块硬件电路
    • 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关键字
char8-128 ~ 127int8_ts8
unsigned char80 ~ 255uint8_tu8
short16-32768 ~ 32767int16_ts16
unsigned short160 ~ 65535uint16_tu16
int32-2147483648 ~ 2147483647int32_ts32
unsigned int320 ~ 4294967295uint32_tu32
long32-2147483648 ~ 2147483647
unsigned long320 ~ 4294967295
long long64-( 2 64 2^{64} 264)/2 ~ ( 2 64 2^{64} 264)/2-1int64_t
unsigned long long640 ~ ( 2 64 2^{64} 264)-1uint64_t
float32-3.4e38 ~ 3.4e38
double64-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版 细致讲解 中文字幕》教程视频

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com