江协科技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_ReadOutputDataBit它的作用是用来读取输出寄存器的某一个位,它并不是用来读取端口的输入数据的,这个函数一般用于输出模式下,用来看一下自己输出的是什么

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行意思是如果光敏电阻感觉暗,就响,否则就不响

结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/778188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据手写面试题Scala语言实现大全(持续更新)

在大数据领域,Scala语言因其强大的函数式编程特性和对并发处理的良好支持而成为了开发者们的热门选择。有些面试官,为了考验面试者的基本功,需要让手写一些面试题,以数据结构和算法类的居多。本文将为您提供一些常见的Scala手写面试题及参考答案,帮助您在面试或工作中更好…

C# 命名空间的两种定义哦写法与区别

这两种写法在C#中都是有效的,但是它们代表了不同的语法风格和C#版本特性。 第一种写法: namespace Nebula.PDF; public class PdfDocument {}这是C# 9.0及更高版本中引入的顶级语句(top-level statements)特性。它允许你直接在文…

c++中的菱形继承

c中的菱形继承 class Animal { public:int m_age; }; class Sheep:public Animal {}; class Tuo:public Animal{}; class SheepTuo :public Sheep , public Tuo{}; SheepTuo st; st.m_age 18; m_age是谁的无法区分 class Animal { public:int m_age; }; class Sheep:virtua…

ES的集群节点发现故障排除指南(3)- end

本文是ES官方文档关于集群节点发现与互联互通的问题排查指南内容,第三部分,结束。 原文参考及相关内容: 英文原文(官网) 第一部分-(1) 第二部分-(2) 节点无法发现或…

李宏毅【生成式AI导论 2024】第5讲 让语言模型彼此合作,把一个人活成一个团队

GPD4,它也有非常强大的能力。但是GPT4如果跟其他的语言模型合作,他们其实可以发挥1加1大于二的力量。 为什么要让模型合作? 那怎么让模型彼此合作呢?有很多不同的方式。一个可能性是假设你现在手边就有一堆语言模型,他们可能有不同的能力使用,他们可能有不同的成本局来…

国外的Java面试题和国内的相比谁更卷

前言 有很多朋友很好奇国外的Java面试题长啥样,今天我们就去找5道国外的面试来和国内的对比一下看看谁难一些! 面试题分享 1. Is Java Platform Independent if then how?( Java平台是独立的吗?) Yes, Java is a…

[数据结构]插入和希尔排序

一、插入排序 插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排…

Protocol Buffers(通常简称为protobuf)是一种由Google开发的用于序列化结构化数据的接口描述语言

Protocol Buffers(通常简称为protobuf) protobuf是一种由Google开发的用于序列化结构化数据的接口描述语言。它可以用于通信协议、数据存储等领域。以下是protobuf的一些重要特点和概念: IDL(接口描述语言)&#xff1…

win10微软拼音输入法 - bug - 在PATH变量为空的情况下,无法输入中文

文章目录 win10微软拼音输入法 - bug - 在PATH变量为空的情况下,无法输入中文概述笔记实验前提条件100%可以重现 - 无法使用win10拼音输入法输入中文替代的输入法软件备注END win10微软拼音输入法 - bug - 在PATH变量为空的情况下,无法输入中文 概述 在…

Python数据可视化:用Matplotlib和Seaborn绘制精美图表

Python数据可视化:用Matplotlib和Seaborn绘制精美图表 数据可视化是数据分析中的重要环节,它能够帮助我们以直观的方式理解数据和分析结果。Python中的Matplotlib和Seaborn库是两个非常强大的数据可视化工具,它们提供了丰富的功能来创建各种…

FastAPI+React全栈开发12 搭建FastAPI开发环境

Chapter03 Getting Started with FastAPI 12 Technical requirements FastAPIReact全栈开发12 搭建FastAPI开发环境 For this chapter, you will need the following: Python setupVirtual environmentsCode editor and pluginsTerminalREST clients 对于这一章&#xff0…

Day54:WEB攻防-XSS跨站Cookie盗取表单劫持网络钓鱼溯源分析项目平台框架

目录 XSS跨站-攻击利用-凭据盗取 XSS跨站-攻击利用-数据提交 XSS跨站-攻击利用-flash钓鱼 XSS跨站-攻击利用-溯源综合 知识点: 1、XSS跨站-攻击利用-凭据盗取 2、XSS跨站-攻击利用-数据提交 3、XSS跨站-攻击利用-网络钓鱼 4、XSS跨站-攻击利用-溯源综合 漏洞原理…

OpenCV摄像头和视频处理

OpenCV视频捕获 一、引言 视频捕获是计算机视觉中常见的一项任务,它涉及从视频文件或摄像头实时流中读取帧,并对其进行处理和分析。OpenCV(开源计算机视觉库)为视频捕获提供了强大的支持,使得这一任务变得简单高效。…

计算机网络链路层

数据链路 链路是从一个节点到相邻节点之间的物理线路(有线或无线) 数据链路是指把实现协议的软件和硬件加到对应链路上。帧是点对点信道的数据链路层的协议数据单元。 点对点信道 通信的主要步骤: 节点a的数据链路层将网络层交下来的包添…

深度学习pytorch——卷积神经网络(持续更新)

计算机如何解析图片? 在计算机的眼中,一张灰度图片,就是许多个数字组成的二维矩阵,每个数字就是此点的像素值(图-1)。在存储时,像素值通常位于[0, 255]区间,在深度学习中&#xff0…

重写、重定义(隐藏)、重载区别

1、重载是在同一个作用域中比如在同一个类中、函数名一样参数不同 2、重写: 满足多态的条件:(1)虚函数前面带有virtual函数名、返回值、参数相同(2)重写函数体 3、重定义也叫隐藏、不满足重写的就是重定义

素描石膏像的眼睛:传神的关键

素描石膏像的眼睛:如何在素描绘画中画出眼睛的传神?关键要点是什么 在素描石膏像的眼睛时,要画出传神的效果,关键要点包括以下几个方面: 理解眼睛的结构:首先,需要理解眼睛的基本结构&#xff…

SlerfTools:简化操作,激发Solana生态创新潜能

在区块链世界的快速演变中,Solana生态系统以其独特的高性能吸引了全球的目光。然而,随着生态系统的蓬勃发展,用户和开发者面临的挑战也日渐增多。正是在这样的背景下,一个名为SlerfTools的新星项目应运而生,它承诺将为Solana带来一场革命性的变革。 项目的诞生 SlerfTools并非…

前端学习-CSS基础-Day3

一、CSS三大特性 1.1层叠性 相同选择器给设置相同的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式。层叠性主要解决样式冲突的问题 层叠性原则: 1.样式冲突,遵循的原则是就近原则,哪个样式离结构近&a…

【QT+QGIS跨平台编译】043:【libprotobuf-lite+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、libprotobuf-lite介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libprotobuf-lite介绍 libprotobuf-lite 是 Protocol Buffers 的 C++ 轻量级运行时库,专门设计用于在资源受限的环境下使用。与标准的 libprotobuf(Protocol Buffers…