小白跟做江科大32单片机之按键控制LED

news2024/12/24 8:16:24

原理部分

1.LED部分使用的是这样的连接方式

2.传感器模块的电路图

滤波电容如果接地,一般用于滤波,在分析电路时就不用考虑。下面这个电路就是看A端和B端哪端的拉力大,就能把电压值对应到相应的电压值

比较器部分

如果A端电压>B端电压,接VCC,反之接地

传感器需要上拉或下拉驱动,一般用下拉驱动

3.按键需要消除抖动

4.连接示意图


代码编写

1.思路

首先实现LED亮灭,随后实现按键1控制LED亮灭,最后实现2个按键各自控制两个ledd的亮灭

2.按照江科大老师给的电路连接接图进行连接

注意: 

    由于连接图中两个LED,一个连接的GPIO口为A1,一个连接的GPIO口为A2,所以需要分别定义

    GPIO口默认为低电平

3.复制之前已经构建好的模板库

4.新建hardware文件夹并将路径联系到工程中,在hardware中新建led.c,led.h;key.c,‘key.h文件

5.led.h代码如下所示:

#ifndef _LED__H
#define _LED__H

void led_Init(void);
void led1_on(void);
void led1_off(void);
void led2_on(void);
void led2_off(void);
void turn_1(void);
void turn_2(void);

#endif

6.led.c代码如下所示:

#include "stm32f10x.h" 
void led_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    //开启GPIOB的时钟
                                                            //使用各个外设前必须开启时钟,否则对外设的操作无效
    
    /*GPIO初始化*/
    GPIO_InitTypeDef GPIO_InitStructure;                    //定义结构体变量
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //GPIO模式,赋值为推挽输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;    //GPIO引脚,赋值为第1,2号引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //GPIO速度,赋值为50MHz
    
    GPIO_Init(GPIOA, &GPIO_InitStructure);                    //将赋值后的构体变量传递给GPIO_Init函数
                                                            //函数内部会自动根据结构体的参数配置相应寄存器
                                                            //实现GPIOB的初始化
    //LED默认为灭,SetBits是灭,ReSetBits是亮
    GPIO_SetBits(GPIOA, GPIO_Pin_1|GPIO_Pin_2);
}

void led1_on(void)
{
    GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}

void led1_off(void)
{
    GPIO_SetBits(GPIOA, GPIO_Pin_1);
}

void led2_on(void)
{
    GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}

void led2_off(void)
{
    GPIO_SetBits(GPIOA, GPIO_Pin_2);
}

void turn_1(void)
{
    if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1)==0)
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_1);
    }
    else
   {
     GPIO_ResetBits(GPIOA, GPIO_Pin_1);
   }
}

void turn_2(void)
{
    if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2)==0)   //获取输出寄存器的状态,如果当前引脚输出低电平
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_2);   //设置PA2引脚为高电平
        
    }
    else
   {
      GPIO_ResetBits(GPIOA, GPIO_Pin_2);  //设置PA2引脚为高电平
   }
}

7.key.h代码如下所示:

#ifndef _KEY__H
#define _KEY__H

void key_Init(void);
uint8_t key(void);

#endif

8.key.c代码如下所示:

#include "stm32f10x.h" 
#include "Delay.h"

void key_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);    //开启GPIOB的时钟
                                                            //使用各个外设前必须开启时钟,否则对外设的操作无效
    
    /*GPIO初始化*/
    GPIO_InitTypeDef GPIO_InitStructure;                    //定义结构体变量
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //GPIO模式,赋值为推挽输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_11;    //GPIO引脚,赋值为第1,2号引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //GPIO速度,赋值为50MHz
    
    GPIO_Init(GPIOB, &GPIO_InitStructure);                    //将赋值后的构体变量传递给GPIO_Init函数
                                                            //函数内部会自动根据结构体的参数配置相应寄存器
                                                            //实现GPIOB的初始化
    
    
}

uint8_t key(void)
{
    uint8_t keynum=0;
    if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0)
    {
        Delay_ms(20);
        while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0);
        Delay_ms(20);
        keynum=1;
    }
    if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0)
    {
        Delay_ms(20);
        while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0);
        Delay_ms(20);
        keynum=2;
    }
    return keynum;
}
9.main.c代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "led.h"
#include "key.h"

uint8_t keynum=0;
int main()
{
   
   led_Init();
   key_Init();
    while (1)
    {
        keynum=key();
        if(keynum==1)
        {
            turn_1();
        }
        if(keynum==2)
        {
            turn_2();
        }
    }
}
 

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

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

相关文章

【MySQL】表的连接和复合查询

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:MySQL 目录 👉🏻连接JOIN👉🏻子查询👉🏻合并查询 👉🏻连接JOI…

【算法】位运算算法——消失的两个数字(困难)

题解:消失的两个数字(位运算算法) 目录 1.题目2.题解3.示例代码如下4.总结 1.题目 题目链接:LINK 2.题解 本题要求时间复杂度O(N),空间复杂度O(1),分别否了我们 排序遍历 和 哈希数组 的想法。想要在规定时间/空间复杂度内完成本题,需要借…

辅导男朋友转算法岗第1天|tokenizer

文章目录 LLM训练流程LLM中的tokenizersBPEWordPieceUnigramSentencePiece(使用BBPE或Unigram) LLM训练流程 【大语言模型LLM基础之Tokenizer完全介绍-哔哩哔哩】 https://b23.tv/2kdTKxf LLM中的tokenizers 三种不同分词粒度的Tokenizers word-based…

python 获取网页乱码怎么解决

在使用python爬取网页时,经常会遇到乱码问题,一旦遇到乱码问题,就很难得到有用的信息。本人遇到乱码问题,一般有以下几个方式: 1、查看网页源码中的head标签,找到编码方式,例如: 可…

【UML用户指南】-02-UML基本元素的介绍(二)

1、语法和语义规则 命名——为事物、关系和图起的名字; 范围——使名字具有特定含义的语境; 可见性——这些名字如何让其他成分看见和使用; 完整性——事物如何正确、一致地相互联系; 执行——运行或模拟一个动态模型意味着什…

安卓 Flutter Channel 源码解析

Flutter 官方提供三种 Platform 与 Dart 端消息通信方式,他们分别是 MethodChannel 、 BasicMessageChannel 、 EventChannel MethodChanel :用于传递方法调用, MethodCallHandler 最终必须在 UI 线程通过 result. success(x) 方法返回…

【深度学习】YOLOv10实战:20行代码将笔记本摄像头改装成目标检测监控

目录 一、引言 二、YOLOv10视觉目标检测—原理概述 2.1 什么是YOLO 2.2 YOLO的网络结构 三、YOLOv10视觉目标检测—训练推理 3.1 YOLOv10安装 3.1.1 克隆项目 3.1.2 创建conda环境 3.1.3 下载并编译依赖 3.2 YOLOv10模型推理 3.2.1 模型下载 3.2.2 WebUI推理 …

成功解决“ImportError: cannot import name ‘mapping‘ from ‘collections‘”错误的全面指南

成功解决“ImportError: cannot import name ‘mapping’ from ‘collections’”错误的全面指南 成功解决“ImportError: cannot import name ‘mapping’ from ‘collections’”错误的全面指南 一、引言 在Python编程中,当我们尝试从某个模块中导入某个名称时&…

上弦外媒新闻发稿:2024年度国外主流新闻媒体和海外媒体软文分发平台有哪些?

2024年度主流海外媒体新闻发稿和海外媒体软文分发平台有很多,下面是一些常见的和广受认可的平台: 主流新闻媒体 CNN - 美国知名新闻网络,覆盖广泛的国际新闻。BBC - 英国广播公司,提供全球新闻和深入报道。纽约时报 - 美国主流报…

UnityAPI学习之 事件函数(生命周期函数)的整体调用流程及细节

事件函数(生命周期函数)的整体调用流程 Reset() 这个函数会在用户首次添加该组件时或单击 Reset 按钮时被调用,且只在编辑器生效,可用于保存默认值 示例: using System.Collections; using System.Collections.Generic; using UnityEngine;public cla…

Docker中布置Jenkins实现Android项目的自动化构建

因项目需要,要在服务器上使用Jenkins完成Android项目的自动化构建,但服务器上登录的账户没有管理员权限,无法用sudo命令,因此需要把相应环境布置在docker中。 环境搭建 docker容器相关命令 创建容器 docker create -it contai…

Android Handler机制使用及全面解析

前言 我是真的不想写这篇总结,说实话,关于Handler,全面且优秀的文章多的很。 但是这东西吧,还是想以自己的方式再去细看一下它的原理,实现源码,它的各种机制,在App中使用到的地方。 这样或许…

【深度揭秘GPT-4o】:全面解析新一代AI技术的突破与优势

目录 ​编辑 1.版本对比:从GPT-3到GPT-4,再到GPT-4o的飞跃 1.1 模型规模的扩展 1.2 训练数据的更新 1.3 算法优化与效率提升 1.4 案例分析 2.技术能力:GPT-4o的核心优势 2.1 卓越的自然语言理解 2.1.1 上下文理解能力 2.1.2 语义分…

地质灾害位移应急监测站

地质灾害位移应急监测站是一种专门用于地质灾害预警和应急响应的设施,它能够实时监测和分析山体、建筑物、管道等的位移变化情况。以下是关于地质灾害位移应急监测站的详细介绍: 主要组成部分 传感器:安装于需要监测的位置,用于…

chap4 simple neural network

全连接神经网络 问题描述 利用numpy和pytorch搭建全连接神经网络。使用numpy实现此练习需要自己手动求导,而pytorch具有自动求导机制。 我们首先先手动算一下反向传播的过程,使用的模型和初始化权重、偏差和训练用的输入和输出值如下: 我…

鹤城杯 2021 流量分析

看分组也知道考http流量 是布尔盲注 过滤器筛选http流量 将流量包过滤分离 http tshark -r timu.pcapng -Y "http" -T json > 1.json这个时候取 http.request.uri 进一步分离 http.request.uri字段是我们需要的数据 tshark -r timu.pcapng -Y "http&quo…

MFC 模态对话框的实现原理

参考自MFC 模态对话框的实现原理 - 西昆仑 - OSCHINA - 中文开源技术交流社区 1. 模态对话框 在涉及 GUI 程序开发的过程中,常常有模态对话框以及非模态对话框的概念 模态对话框:在模态对话框活动期间,父窗口是无法进行消息响应&#xff0…

The book

Deep Learning for Coders with Fastai and PyTorch: AI Applications Without a PhD is the book that forms the basis for this course. We recommend reading the book as you complete the course. There’s a few ways to read the book – you can buy it as a paper bo…

到无穷大和更远,用分形更好

文章目录 一、说明二、分形到底是什么?三、更多更深刻的四、引进无穷小会产生什么样的怪事?五、希尔伯特曲线六、还有什么有趣的要补充的吗? 一、说明 ​​​​​​​数学领域有太多有趣的领域,领域我特别感兴趣。这是一个奇妙的…

【PostgreSQL17新特性之-冗余IS [NOT] NULL限定符的处理优化】

在执行一个带有IS NOT NULL或者NOT NULL的SQL的时候,通常会对表的每一行,都会进行检查以确保列为空/不为空,这是符合常理的。 但是如果本身这个列上有非空(NOT NULL)约束,再次检查就会浪费资源。甚至有时候…