极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 62875|回复: 44

Arduino入门教程--第二十三课--使用IO口内部上拉功能

  [复制链接]
发表于 2012-12-20 21:04:11 | 显示全部楼层 |阅读模式
本帖最后由 弘毅 于 2012-12-21 10:57 编辑

《Arduino入门教程--第四课--按钮控制的LED延时开关》中,我们学习了按键控制LED灯,当时我们在按键下拉了一个10K的电阻来确保按键稳定,不会误触发
有人会问,如果我们去掉这个下拉电阻,有没有办法达到和之前一样的效果呢?
答案是肯定的。

ATmega328P芯片内部其实有上拉的功能,我们可以使用ATmega328P内部的上拉功能替代外部上拉。
ATmega328P Datasheet中有内部上拉的结构介绍,如下图:

通用数字IO.png

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

上拉电阻的作用
在上拉电阻所连接的导线上,如果外部组件未启用,上拉电阻将“微弱地”将输入电压信号“拉高”。当外部组件未连接时,对输入端来说,外部“看上去”就是高阻抗的。这时,通过上拉电阻可以将输入端口处的电压拉高到高电平。如果外部组件启用,它将取消上拉电阻所设置的高电平。通过这样,上拉电阻可以使引脚即使在未连接外部组件的时候也能保持确定的逻辑电平。


本次实验你将可能会用到如下器件
器件数量
5MM红色LED1
220Ω电阻1
超大微动开关1
标准面包板1
Arduino mango控制板1
面包板专用跳线盒1
引脚整形器1

面包板的接线图如下

Untitled Sketch_bb.jpg

可以看到,按键部分去掉上拉电阻后将变的非常简单

程序如下
  1. /*
  2. 作者:极客工坊
  3. 时间:2012年12月18日
  4. IDE版本号:1.0.1
  5. 发布地址:www.geek-workshop.com
  6. 作用:使用单片机内部上拉实现按键功能
  7. */
  8. void setup ()
  9. {
  10.   pinMode(2,INPUT_PULLUP);                 //将2号管脚设置为输入并且内部上拉模式
  11.   pinMode(12,OUTPUT);
  12. }

  13. void loop()
  14. {
  15.   int n =digitalRead(2);                   //创建一个变量n,将4号数字口的状态采集出来赋值给他。
  16.   if (n==LOW)                             //判断n是否为低电平,如果是执行下面的语句,不是则跳过。
  17.   {

  18.     delay(1000);
  19.     digitalWrite(12,HIGH);
  20.     delay(5000);
  21.     digitalWrite(12,LOW);

  22. }
  23. }
复制代码

这个程序的核心就是下面这句代码
  1. pinMode(2,INPUT_PULLUP);
复制代码

定义了2号引脚为INPUT_PULLUP模式意味着该引脚为输入模式,并且被拉高,这就是为什么按键接到了GND
当按键按下时,2号管脚变为GND,这样就完成了按键的功能
因为ATmega328P单片机管脚默认是高电平,所以我们通常设定低电平有效,这样就可以避免误触发

提示:ATmega328P仅仅只有内上拉功能,没有下拉功能哦!

回复

使用道具 举报

发表于 2012-12-21 21:28:06 | 显示全部楼层
支持技术贴,杀花
回复 支持 反对

使用道具 举报

发表于 2013-2-7 00:11:47 | 显示全部楼层
谢谢楼主的教程~回复的人那么少就来支持一下吧!
回复 支持 反对

使用道具 举报

发表于 2013-2-22 12:27:22 | 显示全部楼层
支持楼主的辛苦工作
回复 支持 反对

使用道具 举报

发表于 2013-2-22 19:57:40 | 显示全部楼层
2560没这功能啊,错误
回复 支持 反对

使用道具 举报

发表于 2013-3-5 10:26:45 | 显示全部楼层
刚好做完前一个脉冲检测实验,改了改就用上了
0.67 s
1.01 s
0.00 s
0.91 s
1.03 s
1.14 s
0.94 s
0.37 s
3.12 s
  1. unsigned long duration;
  2. void setup()
  3. {
  4.   Serial.begin(9600);  //串口波特率为9600
  5.   pinMode(2, INPUT_PULLUP); //设置引脚为上拉输入模式
  6. }

  7. void loop()
  8. {
  9.   duration = pulseIn(2, 0,60000000); //读取引脚上的低电平脉冲
  10.   Serial.print(duration/1000000.0); //通过串口输出duration变量
  11.   Serial.println(" s");
复制代码

点评

用的真快  发表于 2013-10-17 21:52
回复 支持 反对

使用道具 举报

发表于 2013-4-2 22:41:10 | 显示全部楼层
我在淘宝上买的 ,不晓得有没有上拉电阻啊
回复 支持 反对

使用道具 举报

发表于 2013-4-3 00:11:14 | 显示全部楼层
万马奔腾 发表于 2013-4-2 22:41
我在淘宝上买的 ,不晓得有没有上拉电阻啊

内部上拉电阻是芯片的功能,板子可以山寨,芯片山寨太高难
回复 支持 反对

使用道具 举报

发表于 2013-4-3 22:53:10 | 显示全部楼层
春泥蛋炒饭 发表于 2013-4-3 00:11
内部上拉电阻是芯片的功能,板子可以山寨,芯片山寨太高难

意思就是板子山寨了,但是使用的芯片还是正规的?也就是说淘宝上买的也是有内部上来电阻
回复 支持 反对

使用道具 举报

发表于 2013-4-3 23:25:42 | 显示全部楼层
太行摄狼 发表于 2013-2-22 19:57
2560没这功能啊,错误

2560可以通过初始化时设为输入模式,然后将引脚置为高电平,即开启上拉模式
回复 支持 反对

使用道具 举报

发表于 2013-4-5 01:01:18 | 显示全部楼层
万马奔腾 发表于 2013-4-3 22:53
意思就是板子山寨了,但是使用的芯片还是正规的?也就是说淘宝上买的也是有内部上来电阻

是的,这种规模的集成电路本身就很便宜了,要自己去山寨很不合算。
回复 支持 反对

使用道具 举报

发表于 2013-4-6 18:11:13 | 显示全部楼层
哎 最近看上拉下拉的 晕乎乎的。看解释都是术语,也听不懂 悲催
回复 支持 反对

使用道具 举报

发表于 2013-4-16 09:26:28 | 显示全部楼层
加油新人学习中。。。
回复 支持 反对

使用道具 举报

发表于 2013-5-30 17:33:29 | 显示全部楼层
上拉电阻的作用还没有看明白
回复 支持 反对

使用道具 举报

发表于 2013-6-1 16:25:55 | 显示全部楼层
同困惑于上拉电阻。。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-1-21 00:02 , Processed in 0.055551 second(s), 33 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表