确定sw1开关信号输入端口_基础教程15 Arduino端口内部的上拉功能

本专栏内容经修订后,已在豆瓣阅读集结成书出版:

81a329e0d091c88dca97ae71d6ea2d04.png
https://read.douban.com/ebook/106875966/​read.douban.com

我是潘,曾经是个工程师。这是为 http://Ardui.Co 制作的 “Arduino 公开课” 系列的入门教程。这节课我们将开始介绍 Arduino 的相关电路。要设计一个强大而稳定的系统,模拟方面的知识是必修课。有任何疑问请在评论区提出,我会逐一回答。

第3课我们介绍了按键控制LED开关,当时设置了一个下拉电阻,确保按钮的稳定性,不会误触发。此外,DHT系列温度传感器、霍尔传感器、旋转编码器等脉冲信号模块应用中,也经常看到上/下拉电阻。那么,这个电阻是否去掉呢?

在大部分应用场合中,答案是否定的。不过,外接电阻可以拿掉,因为Arduino Uno 的ATmega328P 芯片已经内置了上拉电阻,简单修改一下外部电路接线和程序,就可以起用。这是ATmega328P 的 Datasheet 的电路结构如下:

36a9368daaaba2fe6506b29da56831b3.png

首先要理解上拉电阻的含义:

上拉电阻(Pull-up resistors)维基百科的解释是:是当某输入端口未连接设备或处于高阻抗的情况下,一种用于保证输入信号为预期逻辑电平的电阻元件。他们通常在不同的逻辑器件之间工作,提供一定的电压信号。

其作用是,如果外部组件未启用,上拉电阻则“微弱地”将输入电压信号“拉高”。如果外部组件启用,它将取消上拉电阻所设置的高电平。通过这样,上拉电阻可以使引脚即使在未连接外部组件的时候也能保持确定的逻辑电平。

简单来说,如果没有外部信号输入的情况下,保证端口处于一个可以确定的状态。假如没有这个电阻,电平可能会因为电源纹波、浪涌等因素,而跳跃,触发端口。

另外,与上拉电阻接 Vcc 相反,下拉电阻则是接地的,确保没有输入的情况下,处于低电平状态电平。不过,ATmega328P 每个端口都内置了上拉电阻,但没有下拉电阻,其他型号请参考Datasheet。

我们把第3课按钮开关的接线调整一下:

29d28a105f63a592bef8b2c6e64079b1.png

线路简洁了很多。程序修改如下:

/*
  作者:Ardui.co
  效果:按一下打开,再按一下关闭
  版本:1.0
  更新时间:2017年2月23日
*/
int Light = 0; //创建变量Light,并标记 LED 状态为熄灭
void setup ()
{
 pinMode(9, INPUT_PULLUP);// 设置D9为输入状态,并且启动内置上拉电阻
 pinMode(13, OUTPUT);
}
void loop()
{
 int n = digitalRead(9); 
 if (Light == 0)
 {
 if (n == LOW) //改为低电平触发
 {
 delay(500); //消除抖动
 digitalWrite(13, HIGH);
 Light++; //标记LED状态为亮
 }
 }
 else 
 {
 if (n == LOW)
 {
 delay(500); //消除抖动
 digitalWrite(13, LOW);
 Light--; //标记LED状态为熄灭
 }
 }
}

这个程序核心是这行代码:

pinMode(9, INPUT_PULLUP)

将 INPUT 改为 INPUT_PULLUP,D9 被拉高了,成了一个常态,所以触发状态要改为 LOW 的模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值