江协科技STM32:按键控制LED&光敏传感器控制蜂鸣器

按键控制LED

LED模块

左上角PA0用上拉输入模式,如果此时引脚悬空,PA0就是高电平,这种方式下,按下按键,引脚为低电平,松下按键,引脚为高电平

右上角PA0,把上拉电阻想象成弹簧

当按键松手时,引脚由于上拉作用,自然保持为高电平,当按键按下时,引脚直接接到GND,有一股无穷大的力把这个引脚往下拉,弹簧对抗不了无穷大的力,所以已经为低电平,这种情况引脚不会出现悬空状态,所以此时PA0引脚可以配置为浮空输入或者上拉输入

如果是上拉输入,那就会有两个上拉电阻,然后它们共同作用,这时高电平就会更强一些,对应高电平就更加稳定,不过也会有点瑕疵,当引脚被强行拉低时,损耗也就会更大一些

左边的PA0要设置乘下拉输入模式,当按键按下时,引脚为高电平,松开时,引脚回到默认低电平

不过最好还是设置成上拉输入模式,了解一下就行

右边的PA0需要配置下拉输入模式或浮空输入模式

总结

这两个电路接法按键按下时引脚是低电平,松手是高电平

这两个接法是按下时是高电平,松手是低电平

传感器模块

D0数字输出随便接一个端口,比如PA0

A0模拟输出,目前不考虑

编程部分

复制之前的文件夹,改成现在的按键控制LED名字

打开工程,然后开始修改,这里用模块化编程的思想来编写按键的程序和LED的程序

在工程文件夹新建Hardware,用来存放硬件驱动,也就是把按键程序和LED程序都放在这里面

然后点击这里

新建一个叫Hardware

创建成功就会出现右边这个

然后点击魔术棒

选择C/C++,点击这个

把刚才新建的Hardwar文件夹添加到头文件的路径列表中,这样就添加了一个Hardware文件夹

然后右键,添加新的文件

选择第一个,名字LED,,路径存在Hardwar文件夹里面,然后点击ADD

然后继续创建

这样就建好了LED.C和LED.h两个文件用来封装LED的驱动程序

LED.c用来存放驱动程序的主体代码

LED.H用来存放这个驱动程序可以对外提供的函数或变量的声明

然后点开.c文件,右键,选择这个

.h文件,要添加一个放在头文件重复包含的代码,这里格式都是固定的,我们的函数和变量声明就放在这个括号里面

这里完成之后要注意在endif那块换行,不然会有警告

然后就开始写LED.c文件开始写LED初始化函数,这个函数用来初始化LED,只要是用外设来控制一定要打开时钟,配置端口模式这写东西

这个就是上个LED灯的设置模式,直接按原来的设置就行,需要改变的就是引脚,因为是两个灯,所以控制Pin_1和Pin_2

这样LED初始化代码就写完了

这时只需要调用这个函数,LED的两个GPIO口就初始化完成了

因为这个函数需要被外部引用,所以复制这个函数,放到LED.h文件里面,这样就是对模块外部声明,这个函数是可以被外部调用的函数

然后删除之前的代码,在上面写这个来声明

然后在主函数里面直接,调用LED_Init,这样就完成了LED的初始化,然后编译,下载

这里就会看到灯都会亮,说明端口配置和模块化编程没有问题,亮是因为GPIO配置好了默认激素低电平

可以回到这里加上这个,这样,如果不操作LED,灯就是灭的

然后开始正式编写功能代码

我们需要电路和熄灭LED函数

还是在这个里面编写,这个函数就是用来点亮LED1的函数

这个函数使用来熄灭LED1的函数

然后复制粘贴编写LED2,点亮和熄灭函数,把名字和引脚改一下

这就是打开和关闭LED2D函数了

然后把这四个函数放在LED.h文件声明一下,这样LED的驱动函数模块就封装好了

然后在主函数调用

LED1就闪烁了

写上LED2的

两个灯会交替闪烁

然后开始写按键部分的代码

还是跟之前一样在Hardware里面创建Key.C和Key.h文件

还是一样的操作

在Key.C文件创建按键初始化函数,在这里面,我们把按键的两个端口都初始化为上拉输入模式

时钟启动写GPIOB

第七行因为我们要读取按键,所以问你选择GPIO_Mode_IPU上拉输入

第八行因为我们按键接在了PB1和PB11口上,所以写这两个,选中1号和11号口

然后来写读取按键值的函数,调用这个函数就可以返回按下按键的键码,它的返回值就是uint8_t等价于unsigned char

初始化按键返回值,然后返回KeyNum,按键键码默认给0,如果没有按键按下,就返回0,

然后写读取函数

读取函数介绍

这四个GPIO的读取函数

GPIO_ReadInputDataBit 它的作用是用来读取输入数据寄存器某一个端口的输入值的,它的参数是GPIOx和GPIO_Pin,用来指定某一个端口,

它的返回值是uint8_t,代表这个端口的高低电平,读取按键就需要用到这个函数

GPIO_ReadInputData它的作用,它是用来读取整个输入数据寄存器的,参数只有一个GPIOx,用来指定外设,返回值是uint16_t是一个16位的数据,每一位代表一个端口值

GPIO_ReadInputDataBit它的作用是用来读取输出寄存器的某一个位,它并不是用来读取端口的输入数据的,这个函数一般用于输出模式下,用来看一下自己输出的是什么

GPIO_ReadOutputData它的作用是用来读取整个输出寄存器的

看图来理解

所以说,如果想要输入GPIO口的话,就需要GPIO_ReadInputData,GPIO_ReadOutputDataBit这两个参数

如果在输出模式下,想看要看现在看输出什么就用GPIO_ReadOutputDataBit,GPIO_ReadOutputData

这就是这四个函数的用途

回到Key.c

因为需要读取外部输入的一个端口值,所以需要GPIO_ReadInputDataBit这个函数

上面代码意思是如果==0就代表按键按下,然后又因为按键按下有抖动所以要消抖,然后让KeyNum=1返回到函数,代表按键1按下

复制粘贴按键1的,然后按键二改一下名字

然后再Key.h里面声明

然后初始化按键,并且创建全局变量KeyNum

然后

上面代码意思就是如果按键1按下,LED1灯亮,如果按键2按下LED2熄灭

这就是这个操作了

我们需要的程序是按一下熄灭,再按一下点亮,也就是按键按下,LED的状态取反,所以继续编写

这就需要用到GPIO_ReadOutputBit的函数了

上面的函数逻辑就是,调用这个GPIO_ReadOutputBit函数,读取当前的端口的输出状态,如果当前输出0,就给它置1,否则就置0,这样就实现了端口的电平翻转

然后给LED2也加上翻转的功能

然后声明一下

然后修改一下,就完成了

蜂鸣器模块

还是复制文件夹,改名字

还是一样的步骤,再Harewar文件夹,添加蜂鸣器.c和.h文件

然后还是一样的步骤

逻辑跟LED.c是一样的还是开启时钟配置端口,名字改一下,改成Buzzer开头的,把引脚改成Pin_12

这样蜂鸣器的驱动程序就完成了

然后去.h文件声明一下

添加这个头文件

初始化蜂鸣器

测试一下蜂鸣器,响就没问题,

然后来弄光敏传感器的模块,还是一样的步骤再Hardware里面添加传感器.c和.h文件

还是一样的步骤

创建初始化传感器函数

选择的是GPIOB

GPIO模式,可以选择上拉输入模式,如果这个模块始终都接在端口上,也可以选择浮空输入,只要保证引脚不会选课即可,这里选择上拉输入模式,引脚因为光敏传感器连接的是PB13号端口,所以改成Pin_13

这样初始化就完成了

然后就写读取端口的函数,因为要求比较简单,所以直接写一个返回端口值的就行了

这就完成了

然后声明一下

添加这个

13行意思是如果光敏电阻感觉暗,就响,否则就不响

结束

相关推荐
QTDS13887 小时前
为什么说开放式比入耳式耳机更受欢迎?精选开放式耳机推荐
科技·手机
redcocal7 小时前
地平线秋招
python·嵌入式硬件·算法·fpga开发·求职招聘
辰哥单片机设计10 小时前
门磁模块详解(防盗感应开关 STM32)
stm32·单片机·嵌入式硬件·传感器
夜间去看海11 小时前
基于51单片机的自动清洗系统(自动洗衣机)
嵌入式硬件·51单片机·proteus·洗衣机
yrx02030711 小时前
stm32 IIC总线busy解决方法
stm32·单片机·嵌入式硬件
邓校长的编程课堂13 小时前
智能体趋势:未来科技的核心驱动力
科技
Archie_IT13 小时前
【STM32系统】基于STM32设计的SD卡数据读取与上位机显示系统(SDIO接口驱动、雷龙SD卡)——文末资料下载
arm开发·stm32·单片机·嵌入式硬件
辰哥单片机设计13 小时前
1×4矩阵键盘详解(STM32)
stm32·单片机·嵌入式硬件·矩阵·传感器
wmkswd14 小时前
CAN总线-STM32上CAN外设
stm32·单片机·嵌入式硬件