江协科技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行意思是如果光敏电阻感觉暗,就响,否则就不响
结束
相关文章:
江协科技STM32:按键控制LED光敏传感器控制蜂鸣器
按键控制LED LED模块 左上角PA0用上拉输入模式,如果此时引脚悬空,PA0就是高电平,这种方式下,按下按键,引脚为低电平,松下按键,引脚为高电平 右上角PA0,把上拉电阻想象成弹簧 当按键…...
最佳矢量绘图设计软件Sketch for Mac v99.5 最新中文激活版
Sketch for Mac是一款功能强大的矢量绘图软件,它提供了简单易用的界面和丰富的工具,让用户能够轻松创建精美的设计作品。 软件下载:Sketch for Mac v99.5 最新中文激活版 Sketch具有直观的布局和智能的工具,使得设计师能够快速实现…...
【IntelliJ IDEA】运行测试报错解决方案(附图)
IntelliJ IDEA 版本 2023.3.4 (Ultimate Edition) 测试报错信息 命令行过长。 通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行 解决方案 修改运行配置,里面如果没有缩短命令行,需要再修改选项里面勾选缩短命令行让其显示&#x…...
【Kotlin】List、Set、Map简介
1 List Java 的 List、Set、Map 介绍见 → Java容器及其常用方法汇总。 1.1 创建 List 1.1.1 emptyList var list emptyList<String>() // 创建空List 1.1.2 List 构造函数 var list1 List(3) { "abc" } // [abc, abc, abc] var list2 ArrayList<In…...
OpenCV 形态学处理函数
四、形态学处理(膨胀,腐蚀,开闭运算)_getstructuringelement()函数作用-CSDN博客 数字图像处理(c opencv):形态学图像处理-morphologyEx函数实现腐蚀膨胀、开闭运算、击中-击不中变换、形态学梯度、顶帽黑帽变换 - 知乎…...
互联网摸鱼日报(2024-03-27)
互联网摸鱼日报(2024-03-27) 36氪新闻 谈“肉”色变,预制菜“顶流”要完? 欧美监管机构出重拳,苹果和谷歌都要被拆分了吗? 为什么产品经理的薪资待遇,这么高? AI PC:一场浩荡的革命 二氧化…...
2014年认证杯SPSSPRO杯数学建模B题(第二阶段)位图的处理算法全过程文档及程序
2014年认证杯SPSSPRO杯数学建模 B题 位图的处理算法 原题再现: 图形(或图像)在计算机里主要有两种存储和表示方法。矢量图是使用点、直线或多边形等基于数学方程的几何对象来描述图形,位图则使用像素来描述图像。一般来说&#…...
C++基本语法
C是如何工作的 文章目录 C是如何工作的1、新建Hello World工程1.1使用Visual Studio新建项目1.2 HelloWorld1.2.1 命名空间1.2.2 输出输出 1.3 注释1.4 函数1.4.1 使用有返回的函数1.4.2 自定义函数 1、新建Hello World工程 1.1使用Visual Studio新建项目 按照下面的图片&…...
Node Sass does not yet support your current environment
项目运行时报错:Node Sass does not yet support your current environment 原因是node版本过高。 解决办法: 使用nvm管理node版本,(如何安装nvm?请点击跳转) 具体步骤如下: 1.查看当前node…...
长陆工业自动控制系统邀您到场参观2024第13届生物发酵产品与技术装备展
参展企业介绍 珠海市长陆工业自动控制系统股份有限公司于2004年在素有“百岛之市,浪漫之城”的珠江口西岸核心城市—珠海成立。长陆工业是流程工业智能制造自动化、信息化综合解决方案的提供者。产品遍及冶金、化工、建材、食品、石油、橡塑、能源、环保、物流、粮…...
数据仓库——维度表更新
维度表的更新 维度表修改规律: 绝大部分维度表都是不变的很多维度虽然会变化,但是变化的很缓慢源记录产品键不会改变产品描述及其他属性的改变都很缓慢在源OLTP 系统中,新的值会覆盖旧的值在数据仓库中,覆盖维度表的属性并不总是适当的做法…...
Web3创作整理 - 2024-02-23 ~ 2024-03-25
Web3 创作整理 - 2024-02-23 ~ 2024-03-25 整理下3月份的文章,方便大家阅读 分类文章地址🫑ETH什么是Dapp🎼ETH什么是以太坊🎵ETH如何才能拥有ETH🎶ETHBTC网络 vs ETH网络🎙️ETHETH网络中的区块链…...
CSS(一)---【CSS简介、导入方式、八种选择器、优先级】
零.前言 本系列适用于零基础小白,亦或是初级前端工程师提升使用。 知识点较为详细,如果追求非常详细,请移步官方网站或搬运网站。 1.CSS简介 CSS全称:“Cascading Style Sheets”,中文名:“层叠样式表”…...
智慧公厕解决方案打造更加智能的卫生空间
一、智慧公厕方案概述 智慧公厕方案旨在解决现有公厕存在的诸多问题,包括民众用厕困难、环境卫生状况不佳、管理效率低下等方面。针对民众的需求和管理方面的挑战,智慧公厕提供了一套综合解决方案,包括智能导航、环境监测、资源管理等功能&a…...
美团0316春招笔试题
下面是美团2024-03-16笔试真题,进行了VP,由于未参与评测,故不保证正确性,仅供参考。 第一题 小美点外卖 求和然后减去满减和红包即可。 #include <bits/stdc.h> using namespace std; using LL long long ; int n, t, x,…...
typescript 实现RabbitMQ死信队列和延迟队列 订单10分钟未付归还库存
Manjaro安装RabbitMQ 安装 sudo pacman -S rabbitmq rabbitmqadmin启动管理模块 sudo rabbitmq-plugins enable rabbitmq_managementsudo rabbitmq-server管理界面 http://127.0.0.1:15672/ 默认用户名和密码都是guest。 要使用 rabbitmqctl 命令添加用户并分配权限…...
怎样才能把重建大师的空三导进去CC?
导出空三文件xml两者都是通用的,cc和photoscan都可以兼容。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件,输入倾斜照片,激光点云,POS信息及像控点,输出高精度彩色网格模型,可一键…...
命令模式(请求与具体实现解耦)
目录 前言 UML plantuml 类图 实战代码 模板 Command Invoker Receiver Client 前言 命令模式解耦了命令请求者(Invoker)和命令执行者(receiver),使得 Invoker 不再直接引用 receiver,而是依赖于…...
开发一款MMOARPG难度到底有多大
开发一款MMOARPG难度到底有多大 MMORPG游戏开发到底有多难,我们按照过去开发的标准,就比如开发一款传奇,那时候哪会用什么别人的引擎,都是自研,从基础图形API开始。我们不考虑美术和策划,就单指程序&#x…...
RTSP应用:实现视频流的实时推送
在实现实时视频流推送的项目中,RTSP(Real Time Streaming Protocol)协议扮演着核心角色。本文将指导你通过安装FFmpeg软件,下载并编译live555,以及配置ffmpeg进行视频流推送,来实现一个基本的RTSP流媒体服务…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
