stm32入门-----GPIO口输入的学习与使用

目录

前言

一、硬件介绍

1.按键

2.传感器模块

二、按键控制LED灯亮灭

1.电路连线图

2. 工程文件添加 

3.GPIO口读取函数介绍

(1)输入数据的读取 

(2)输出数据的读取 

4.代码编写

(1)按键模块

(2)LED模块

(3)主函数main.c 

三、光敏传感器控制蜂鸣器警报

1.电路连接图

2.代码编写

(1)蜂鸣器模块

(2)光敏传感器模块

(3)主函数main.c 


前言

        本期继续学习stm32的GPIO口,上一期是学习了GPIO口进行输出操作,那么本期就学习GPIO口的输入操作,本期分为两个实际项目,分别是通过按键控制LED灯的亮灭、通过光敏传感器去控制蜂鸣器的警报。(视频:[3-4] 按键控制LED&光敏传感器控制蜂鸣器_哔哩哔哩_bilibili)

一、硬件介绍

1.按键

按键:常见的输入设备,按下导通,松手断开
按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动

对此我们在编写代码的时候要对按键进行消抖处理,学过51的都知道了吧。下面在看看按键的硬件电路,对于按键的硬件电路,我们一般情况都是用第一行的样式,也就是IO口低电平有效,当按键没有按下的时候IO口就保持高电平状态,所以上面会接一个上拉电阻来实现保持电平,当按键按下的时候,IO口就接地,此时为低电平整体,按键导通电路。对于下面的第第二行样式效果是一样的,不过跟上面的方式相反,是属于高电平有效,但是一般情况都是不用到,基本上都是用第一行低电平有效的方式,所以稍微了解一下就行了。

2.传感器模块

传感器模块:传感器元件(光敏电阻 / 热敏电阻 / 红外接收管等)的电阻会随外界模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出,再通过电压比较器进行二值化即可得到数字电压输出

 传感器模块是经常用到的,比如红外线传感器,超声波传感器等等,不过本期我们用到的是光敏电阻传感器,学过光敏电阻的都知道,光敏电阻就是光线越量的时候电阻就越小,光线暗的时候电阻就变大,对于光敏电阻传感器同样的,下面电路图我们可以看出,光线量的时候DO口就会被导入高电平,此时LED指示灯就会量,DO口为低电平,反之光线暗的时候LED指示灯就会灭,此时DO口为高电平。(想了解更多传感器请看这个:IoT物联网嵌入式设备中30种常见传感器模块简介及原理讲解_数据采集各个模块的传感器-CSDN博客) 

知道了这些,下面就开始今天的项目吧。

二、按键控制LED灯亮灭

1.电路连线图

先看电路的接线图:

这里我们要用到的是GPIOA口的1和2引脚,GPIB口的1和11引脚,前者是LED的引脚,后面是按键的引脚。对于编程,我们最好用模块化编程去做。

2. 工程文件添加 

这里打开项目的根目录,然后创建一个hardware的文件夹:

然后打开三个小方块这个图标,把这个文件夹添加进去,后面就是在这里创建圈起来的这四个文件。 

然后就是打开魔术棒图标:

 按照下面123步骤去把根目录下的hardware这个文件夹添加进去就行了。

3.GPIO口读取函数介绍

这里我们要学习下面几个GPIO口的读取函数,其实也很简单,也就是读取IO口输入输出寄存器里面的数据。

(1)输入数据的读取 

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
这个函数是用来读取输入数据寄存器某一个端口的输入值,参数是GPIOx和GPIO_Pin,用来指定某一个端口。

返回值是uint8_t,代表这个端口的高低电平。


uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
这个函数比上一个函数少了一个Bit,它是用来读取整个输入数据寄存器的,参数只有一个GPIOx,用来指定外设。

返回值是uint16_t,是一个16位的数据,每一位代表一个端口值。

(2)输出数据的读取 

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
这个函数是用来读取输出数据寄存器的某一位,所以它并不是用来读取端口的输入数据的,这个函数一般用于输出模式下,用来看一下自己输出的是什么。


uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
这个函数比上一个函数少了一个Bit,是用来读取整个输出寄存器的。

4.代码编写

这里要用到相关的延时函数,我会上传到本期的资源绑定,自行下载。

要用到的模块也就这些:

(1)按键模块

Key.c文件:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"void Key_init(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_initstruct; GPIO_initstruct.GPIO_Mode=GPIO_Mode_IPU; GPIO_initstruct.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_11;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_initstruct);}uint8_t Keynum(){uint8_t num=0;if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0){Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)Delay_ms(20);num=1;}if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0){Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)Delay_ms(20);num=2;}return num;
}

Key.h文件

#ifndef __KEY_H
#define __KEY_Hvoid Key_init();uint8_t Keynum();
#endif
(2)LED模块

LED.c文件

#include "stm32f10x.h"                  // Device headervoid LED_init(void){//定义时钟 GPIOARCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_initstruct; GPIO_initstruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_initstruct.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_2;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_initstruct);GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);}
//低电平亮
void LED1_ON(){GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
void LED1_OFF(){GPIO_SetBits(GPIOA,GPIO_Pin_1);
}//电平翻转
void LED1_turn(){if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0){GPIO_SetBits(GPIOA,GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_1);}	
}void LED2_ON(){GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
void LED2_OFF(){GPIO_SetBits(GPIOA,GPIO_Pin_2);
}//电平翻转
void LED2_turn(){if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0){GPIO_SetBits(GPIOA,GPIO_Pin_2);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_2);}	
}

LED.h文件

#ifndef __LED_H
#define __LED_Hvoid LED_init(void);void LED1_ON();
void LED1_OFF();
void LED2_ON();
void LED2_OFF();
void LED1_ON();
void LED2_ON();
#endif
(3)主函数main.c 

最后就是主函数main.c文件

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"uint8_t keynum;int main(void)
{	LED_init();Key_init();while(1){keynum=Keynum();if (keynum==1){LED1_turn();}if (keynum==2){LED1_turn();}}
}

三、光敏传感器控制蜂鸣器警报

1.电路连接图

工程文件添加的操作步骤跟上面的一模一样的,这里我就给大家看结果,要添加哪些文件,步骤不熟悉的话请重新看什么的就行了,这里就不多说了。

2.代码编写

(1)蜂鸣器模块

Buzzer.c文件

#include "stm32f10x.h"                  // Device headervoid Buzzer_init(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_initstruct; GPIO_initstruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_initstruct.GPIO_Pin=GPIO_Pin_12;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_initstruct);GPIO_SetBits(GPIOB,GPIO_Pin_12);}
//低电平亮
void Buzzer_ON(){GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}
void Buzzer_OFF(){GPIO_SetBits(GPIOB,GPIO_Pin_12);
}//电平翻转
void Buzzer_turn(){//读取输出的电平,然后去调整if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_12)==0){GPIO_SetBits(GPIOB,GPIO_Pin_12);}else{GPIO_ResetBits(GPIOB,GPIO_Pin_2);}	
}

Buzzer.h文件

#ifndef __BUZZER_H
#define __BUZZER_Hvoid Buzzer_init();
void Buzzer_ON();
void Buzzer_OFF();
void Buzzer_turn();#endif
(2)光敏传感器模块

Lightsensor.c文件

#include "stm32f10x.h"                  // Device headervoid Lightsensor_init(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_initstruct; GPIO_initstruct.GPIO_Mode=GPIO_Mode_IPU; GPIO_initstruct.GPIO_Pin=GPIO_Pin_13;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_initstruct);}uint8_t Lightsensor_get(){//有光的时候,io口输入高电平到stm32,被读取到;光线不好,就输入低电平return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);
}

Lightsensor.h文件

#ifndef __LIGHTSENSOR_H
#define __LIGHTSENSOR_H
void Lightsensor_init();
uint8_t Lightsensor_get();#endif
(3)主函数main.c 
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Lightsensor.h"
#include "Buzzer.h"int main(void)
{	Buzzer_init();Lightsensor_init();while(1){if(Lightsensor_get()==1){Buzzer_ON();}else{Buzzer_OFF();}}
}

现象的话就是,当你用手遮住光敏传感器的时候,蜂鸣器就会响起来。

以上就是本期的全部内容了,我们下次见!

每日壁纸:

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

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

相关文章

智能制造 v3.13.16 发布,ERP、MES 更新

智能制造一体化管理系统 [SpringBoot2 - 快速开发平台],适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模…

java:aocache 与Spring Aop兼容问题

本文适用于所有AspectJ与Spring AOP混用的场景。 Spring AOP 是基于动态代理的实现AOP,基于 JDK代理和CGLib代理实现运行时织入(runtime weaving)。 Spring AOP的切面定义沿用了ASpectJ的注解体系,所以在Spring体系中注解定义切面…

this关键字、static关键字(静态变量、静态方法、静态代码块)、代码块、包

一、this关键字 1、使用区域:定义类时在类的方法中使用,包括构造方法和成员方法 2、特点:表示Java程序运行时正在调用此方法的对象 3、使用范围: (1)引用当前对象中的成员变量 典例:用于区…

MySQL-事务、日志

事务 特性 原子性 是指事务开始后,必须成功执行完所有的操作才会结束,否则会回滚到事务刚开始前。 拿转账来说,一个成功的 A向B转账100元的过程 会涉及如下过程: A:从数据库读取A的余额;A的余额-100&am…

QT小细节

QT小细节 1 QTextToSpeech1.1 cmake1.2 qmake QT6 6.7.2 1 QTextToSpeech 从下图可以看到,分别使用qmake或者cmake编译情况下的,QTextToSpeech的使用方法 QTextToSpeech官方链接,也可以直接在QT Creator的帮助中搜索 1.1 cmake 将上图中的…

ArkUI组件——循环控制/List

循环控制 class Item{name: stringprice:number}private items:Array<Item> [new Item("A0",2399),new Item("BE",1999),new Item("Ro",2799)] ForEach(this.items,(item:Item) > {})List组件 列表List是一种复杂的容器&#xff0c;…

微信小程序新建项目发现导航条不见了,及如何找回。

原因是现在小程序新建用的是 Skyline 渲染引擎 开启全局Skyline渲染引擎&#xff0c;因为Skyline不支持原生导航栏&#xff0c;所以就没显示原生导航栏了。 解决方法也很简单 app.json文件中的 “renderer”: “skyline”, 修改为 “renderer”:“webview”app.json文件中的…

CSS基础学习之元素定位(6)

目录 1、定位类型 2、取值 2.1、static 2.2、relative 2.3、absolute 2.4、fixed 2.5、stickty 3、示例 3.1、相对定位(relative) 3.2、绝对定位&#xff08;absolute&#xff09; 3.3、固定定位&#xff08;fixed&#xff09; 3.4、粘性定位&#xff08;sticky&…

大模型中的MoE是什么?

大模型中的MoE是什么&#xff1f; MoE&#xff08;Mixture of Experts&#xff09;是一种用于提高深度学习模型性能和效率的架构。其核心思想是通过引入多个专家&#xff08;Experts&#xff09;模型&#xff0c;每个输入数据只选择和激活其中的一部分专家模型来进行处理&…

nacos 适配瀚高数据库、ARM 架构

下载nacos源码&#xff1a; https://github.com/alibaba/nacos/tree/2.3.1 瀚高技术文档 1、修改pom.xml 根目录nacos-all > pom.xml<dependencyManagement><dependency><groupId>com.highgo</groupId><artifactId>HgdbJdbc</artifactI…

硅纪元视角 | 微软开发全新AI模型,革新电子表格处理效率!

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

使用llama-cpp-python制作api接口

文章目录 概要整体操作流程技术细节小结 概要 使用llama-cpp-python制作api接口&#xff0c;可以接入gradio当中&#xff0c;参考上一节。 llama-cpp-python的github网址 整体操作流程 下载llama-cpp-python。首先判断自己是在CPU的环境下还是GPU的环境下。以下操作均在魔搭…

【Linux杂货铺】期末总结篇4:shell编程

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️什么是Shell脚本&#xff1f;二. ⛳️Shell 入门三. ⛳️Shell 变量3.1 &#x1f514;变…

Kotlin中Unit、Any和Nothing

Unit Unit是一个特殊的类型&#xff0c;它表示“没有意义的值”的单元类型。在Kotlin中&#xff0c;当你不需要函数返回任何具体值时&#xff0c;可以使用Unit类型。 和Java 中 void一样。 Any 所有非空类的父类 Any?所有类的父类 类似Java中Object Nothing 表示一个函数或…

旗晟巡检机器人的应用场景有哪些?

巡检机器人作为现代科技的杰出成果&#xff0c;已广泛应用于各个关键场景。从危险的工业现场到至关重要的基础设施&#xff0c;它们的身影无处不在。它们以精准、高效、不知疲倦的特性&#xff0c;担当起保障生产、守护安全的重任&#xff0c;为行业发展注入新的活力。那么&…

如何使用简鹿水印助手或 Photoshop 给照片添加文字

在社交媒体中&#xff0c;为照片添加个性化的文字已经成为了一种流行趋势。无论是添加注释、引用名言还是表达情感&#xff0c;文字都能够为图片增添额外的意义和风格。本篇文章将使用“简鹿水印助手”和“Adobe Photoshop”这两种工具给照片添加文字的详细步骤。 使用简鹿水印…

IDEA实现NPM项目的自打包自发布自部署

目录 前言 正文 操作背景 NPM自发布 Package自发布 NPM部署 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in University of Nottingham Ningbo China&#x1f…

射线和平面求交

射线和平面求交 1、平面方程 如果已知平面的高度&#xff08;即沿法向量方向的距离&#xff09;为 height&#xff0c;平面方程可以表示为&#xff1a; n ^ ⋅ p h e i g h t \bold{\hat{n}} \cdot p height n^⋅pheight p p p 是平面上的任意一点 height 的正负取决于法向量…

W外链创建抖音私信卡片教程,私信卡片跳转微信工具

W外链地址wai.cn 在数字化时代的浪潮中&#xff0c;私域流量的价值愈发凸显&#xff0c;成为企业获取用户、建立品牌忠诚度、提升转化率的关键手段。抖音&#xff0c;作为当下最热门的短视频社交平台之一&#xff0c;其用户基数庞大、互动性强&#xff0c;为企业私域引流提供了…

一些颜色的RGB整理

(214,219,233) (215,220,230) (189,189,189) (193,210,240) (190,210,240) (0,60,119) (0,60,120) (230,230,250)