ArduinoUNO实战-第四章-按键控制led

参考:
上拉和下拉的解释

前言

我们将通过面包板接入一个按键,当按下时led灯亮,再次按下时熄灭

上拉下拉电阻

上拉电阻:把一个不确定的信号通过电阻连接到高电平,是电信号初始化为高电平。

下拉电阻:把一个不确定的信号通过电阻连接到地,使电信号初始为低电平。

本质:上拉是对器件注入电流,下拉是输出电流

上拉电阻

在这里插入图片描述

电阻R12将KEY1网路标识上拉到高电平,在按键s2没有按下的情况下key1将被钳制在高电平,从而避免了引脚悬空而引起的误动作。
按键的上拉电阻可以选择3.3k、4.7k、5.1k、10k等,但是电阻越小,电流越大,功耗也越大。10k的上拉电阻带来的电流,是大多数芯片所能识别到的引脚电流,如果电阻太大,电流太小,引脚识别不了,所以10k是个折中的方案。这里的电流,简单来说是根据公式VDD/R拉电阻计算出来的。

下拉电阻

在这里插入图片描述

这里电阻R29将DIR下拉到低电平,在光耦没有导通的情况下DIR将被钳制在低电平,从而避免了引脚悬空而引起的误动作。

作用解释

提高电路稳定性,避免引起误动作。第一图中的按键如果不通过电阻上拉到高电平,那么在上电瞬间可能就发生误动作,因为在上电瞬间单片机的引脚电平是不确定的,上拉电阻R12的存在保证了其引脚处于高电平状态,而不会发生误动作。

提高输出管脚的带载能力。受其他外围电路的影响单片机在输出高电平时能力不足,达不到VCC状态,这会影响整个系统的正常工作,上拉电阻的存在就可以使管脚的驱动能力增强。这里特别强调如下:带片上I2C资源的单片机,其SCL和SDA引脚是开漏引脚,如果当做普通的GPIO来用的话,你会发现该引脚输出高电平极不稳定甚至因为负载的关系都无法正常输出高电平,这时候就需要在这两个引脚上加上拉电阻了。

STM32内部的上拉其实是一个弱上拉,也就是说通过此上拉电阻输出的电流很小,如果想要输出一个大电流。那么就需要外接上拉电阻了,其实就是增加导线的输出电流。

下拉电阻情况相反,让STM32的CPU引脚输出低电平,结果由于后续电路影响输出的低电平达不到GND。所以接个下拉电阻,其实就是为了降低导线的输出电流。

另外当上下拉电阻都不开启,此时是浮空模式,引脚的电压是不确定的,此模式下的管脚电压会时不时改变。

所以为了防止引脚悬空,产生积累电荷、静电荷,造成电路不稳定。一般情况下,我们都会给引脚设置成上拉或者下拉模式,使它有一个确定的默认电平状态。 作者:凡亿教育 https://www.bilibili.com/read/cv17533862/ 出处:bilibili

效果

原理图

在这里插入图片描述

接法一:

只接黑色和蓝色,黑色接地GND,蓝色接2号引脚并设置上拉

另外当上下拉电阻都不开启,此时是浮空模式,引脚的电压是不确定的,此模式下的管脚电压会时不时改变。
所以为了防止引脚悬空,产生积累电荷、静电荷,造成电路不稳定。一般情况下,我们都会给引脚设置成上拉或者下拉模式,使它有一个确定的默认电平状态。

接法二:

只接红色、黑色、电阻。红色接入5V,黑色接地。记得一定要接电阻,否则按键按下相当于红色直接接地相当于短路。红色接了电阻,相当于是上拉电阻

实图

在这里插入图片描述

面包板

在这里插入图片描述

  • 中间abcde或者fghij的竖着部分是连通的,也就是1a,1b,1c,1d,1e这五个一条线是连通的,2a,2b,2c,2d,2e也是,但是1a和2a不连通同理,1f,1g,1h,1i,1j也是连通
  • 顶部和底部红色和蓝色之间一般是用来接电,横着部分是连通的,不如+1,+2,+3,+4,+5是连通-1,-2,-3,-4,-5连通

按键

在这里插入图片描述

  • 两边红色竖线,表示竖着的是连通的,横着连通

  • 当按钮按下时左右才能连通起来

  • 如果一端接到GND,一端接到2号引脚,当按钮按下时,相当于把2号直接接地,相当于是低电平;当按钮松开时,由于2号和GND断开,相当于什么都没接,由于2号配置了上拉,此时2号是高电平。

  • 当按键按下的时候,不会立马低电平,因为有抖动,先经过杂波才会低下来,这个抖动大约20ms延时。例如:
    在这里插入图片描述

  • 开启上拉时,引脚默认电压为高电平

  • 开启下拉时,引脚默认电压为低电平

  • 上拉和下拉不开启时,这种状态我们称为浮空模式

Mind+图形化编程

在这里插入图片描述

IDE

方案一:

/*
  测试按键控制led
*/
// led的输出13号引脚
#define LED 13
// 按键输入上拉2号引脚
#define KEY 2

// the setup function runs once when you press reset or power the board
void setup() {
  // LED设置为输出
  pinMode(LED, OUTPUT);
  // KEY设置为输入
  //pinMode(KEY, INPUT);
  // 设置KEY使能上拉电阻
  pinMode(KEY, INPUT_PULLUP);
  
}

// the loop function runs over and over again forever
void loop() {
  ScanKey();
}

void ScanKey()
{
  // 判断按键是否按下,是否输入低电平
  if(digitalRead(KEY) == LOW)
  {
    // 为了电波抖动,延时20ms
    delay(20);
    // 重新读取
    if(digitalRead(KEY) == LOW)
    {
      // 让LED电平翻转
      digitalWrite(LED, !digitalRead(LED));
      // 避免led一直在闪,所以循环等待按键松开
      while(digitalRead(KEY) == LOW);
      
    }
  }
}

方案二:

多语言i18n.c


//声明了一个字符串数组,每个字符串不能超过32字节(GB2312编码的汉字16个),如果你要显示的汉字特别长,请修改32这个数字
//变量定义所有可能用到的这个数组中注意数组的首地址是0
//建立这个外挂文件的目的就是为了解决使用IDE编程环境无法编辑GB2312内码汉字的问题,请勿使用IDE编程环境打开编辑此文件,这样操作会将此文件改写为UTF8内码的文件!
int language=1;//中文1,英文0
const char cn[][32]={"您按下了按键","专心","专注","专业"};
const char en[][32]={"key is pulldown","Attentively","Absorbed","Major"};

主程序

/*
  测试按键控制led
*/

// 这就是定义的带汉字的专用文件,可以写多个数组哦,这里仅举例
#include "i18n.c"


// led的输出13号引脚
#define LED 13
// 按键输入上拉2号引脚
#define KEY 2
// 判断按键按下的标记位,按下时为1
int KEY_NUM = 0;

// the setup function runs once when you press reset or power the board
void setup() {
  // 打开串口
  Serial.begin(9600);
  // LED设置为输出
  pinMode(LED, OUTPUT);
  // KEY设置为输入
  //pinMode(KEY, INPUT);
  // 设置KEY使能上拉电阻
  pinMode(KEY, INPUT_PULLUP);
  
}

// the loop function runs over and over again forever
void loop() {
  ScanKey();
  if(KEY_NUM == 1)
  {
    Serial.println(en[0]);
    // 让LED电平翻转
    digitalWrite(LED, !digitalRead(LED));
  }
}

void ScanKey()
{
  // 重置标记位
  KEY_NUM = 0;
  // 判断按键是否按下,是否输入低电平
  if(digitalRead(KEY) == LOW)
  {
    // 为了电波抖动,延时20ms
    delay(20);
    // 重新读取
    if(digitalRead(KEY) == LOW)
    {
      // 说明按键按下
      KEY_NUM = 1;
      // 避免led一直在闪,所以循环等待按键松开
      while(digitalRead(KEY) == LOW);
      
    }
  }
}

当按下按键时,串口输出

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值