AVR单片机教程——数字输入

2019-12-02来源: eefocus关键字:AVR  单片机教程  数字输入

我们已经学习了如何使用按键和拨动开关,不知你有没有好奇 button_down 和 switch_status 等函数是如何实现的。本篇教程带你一探究竟,让我们从按键的原理开始。

在原理图中,按键的符号如下图所示:

符号很简单,就是两个触点上方有一个动片,当按下时与两个触点接触。实际上按键内部的机械结构大体上就是这样,实现的功能是,没有按下时两端断路,按下时两端短路。

还有一种画法是这样的,即电键:

就按键内部的机械结构来说,第一种更加真实,但从电路角度来看,两者没什么区别。

但是我们的开发板上的按键有4个引脚,这是怎么回事呢?其实上面两个和下面两个分别是连通的,相当于只有两个:

拨动开关,相当于单刀双掷开关:

从开发板反面可以看到拨动开关有3个引脚。拨到上方时,上面两个导通;拨到下方时,下面两个导通。


然而,光知道这些原理还不够。任何IC,包括单片机,与外界打交道的唯一途径是引脚。单片机要知道按键状态,必须由我们搭建合适的电路,把按键和开关的信息转换为电平,连接到单片机上。


先说按键吧。按键按下时,两引脚之间导通,如果一端接在某一极(电源或地)上,另一端的电平就是确定的。然而,如果不连接其他器件,当没有按下时,这一端是浮空的,电压可能高也可能低,是无效的。而我们希望不按下时检测到的是另一种电平,因此我们可以在按键一端和另一极之间接一个电路:

按键接到地,电阻接到电源,这是一种很常见的接法,其中的电阻称为上拉电阻,取值几千欧到几十千欧都没啥问题。这个电阻可以在单片机内部,也可以是一个独立的元件。在我们的开发板上,4个按键(以及4个开关,后面会提到)是通过排阻上拉的。


为什么把按键接在地上用上拉,而不是接在正电源上用下拉?这是个很复杂的问题。尽管在布尔代数中0和1是完全对称的,但电子毕竟是电子而空穴是电子的缺失,由于某些很复杂的原因,导致上拉比下拉更加常见(得多)。事实上,AVR单片机的引脚可以配置独立的上拉电阻,但是没有下拉电阻可选(部分新型号中有)。


如果你没有受过上拉电阻思想的熏陶,对于拨动开关,你可能会想到这种接法:

这种接法不需要额外的元器件,听起来很妙。然而,虽然可行,这是一种不好的方法。万一两个触点之间短路了怎么办?整块开发板都短路保护了。尽管短路保护听起来安全,但即使保护起来,在解决短路问题之前,开发板还是不能用的。还有一种情况,我真的碰到过,就是单片机上两个相邻的读取开关的引脚因为焊接时的疏忽短路了,导致一旦这两个开关状态不一样就会触发短路保护。总之,这种接法不提倡。


与按键类似,在开关这边我们也可以用上拉电阻的接法:

利用这两种电路,我们成功地将按键不按下与按下分别转换成高电平和低电平,把开关位于下方和上方分别转换成低电平和高电平。那么,单片机怎么读取电平呢?库提供了 pin_read 函数,定义在  中。我们还是通过一个例子来学习其使用方法:保持黄灯和蓝灯的状态分别与按键2和开关2的电平相同。


 1 #include

 2 #include

 3 

 4 #define BUTTON2 PIN_0

 5 #define SWITCH2 PIN_1

 6 

 7 int main()

 8 {

 9     led_init();

10     pin_mode(BUTTON2, INPUT);

11     pin_mode(SWITCH2, INPUT);

12     while (1)

13     {

14         led_set(LED_YELLOW, pin_read(BUTTON2));

15         led_set(LED_BLUE  , pin_read(SWITCH2));

16     }

17 }


异常简单的例子,不是吗?用 pin_read 读取引脚电平,再把LED设置为相应值。

当程序涉及端口操作时,为了能在硬件连接改变时方便地修改程序,建议用宏或常量建立设备与引脚之间的映射关系。这样在修改时就只有这个映射关系需要改动了,总比程序每一处调用都修改要方便得多。


值得一提的是,尽管今天的教程介绍了更底层的知识,但这仍不是我们能达到的最底层的地方。在几篇教程之后,你就可以抛弃库函数了。

关键字:AVR  单片机教程  数字输入 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic481673.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:AVR单片机教程——数字输出
下一篇:AVR单片机教程——拨动开关

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AVR单片机教程——烧写HEX文件
每一次build项目,编译器都会生成多个文件,其中有一个就是hex文件。之前在IDE中配置的external tools,就是把这个hex文件烧写到单片机中去的。然而,有些时候你想运行别人的程序,但拿不到别人的源码,只能拿到一个hex文件。比如,我现在就把明天作业的答案(没错,明天有作业)以hex文件的形式(平台不让上传hex文件,所以我就打了个包,使用前请先解压)给你,让你抢先体验一下。这时,你就需要用AVRDUDESS来烧写hex文件。初次打开AVRDUDESS,界面上所有选项都是默认的。在左上角下拉框中选择USBasp(在最后的位置)。点击右上角Detect,会自动选择好单片机型号。在Flash框中选择要烧写的文件。点击Go
发表于 2019-12-02
AVR单片机教程——烧写HEX文件
AVR单片机教程——随机点亮LED
;led_set 的第一个参数只有在 [0, 3] 范围内才有效,因此我们把 rand() 的返回值对4取模。srand(1) 被打上注释,是因为这行调用没有必要。把这段代码编译并烧写进单片机,你会发现LED闪烁的时间是不等长的,这是因为可能存在连续两次亮相同灯的情况。为了解决这个问题,我们引入一个变量,保存当前亮的LED,并让下一个亮的LED与当前的不同。代码如下: 1 #include <ee1/led.h> 2 #include <ee1/delay.h> 3  4 #include
发表于 2019-12-02
AVR单片机教程——按键状态
今天我们来讲按键。开发板的右下角有4个按键,按下会有明显的“咔嗒”声。如何检测按键是否被按下呢?首先要把按键或直接或间接地连接到单片机上。与之前使用的4个LED不同,4个按键没有全部连接到单片机上——左边2个是连接的,右边2个通过按键上方标有B2、B3的接口引出(从左到右分别为B0、B1、B2和B3)。如果要使用B2、B3,要用杜邦线连接到16个单片机引出针脚上。开发板库中与按键相关的函数定义在 <ee1/button.h> ,这里是库函数手册。值得一提的是1.1版本的库中,换用枚举类型表示按键等设备,不再使用整数与宏定义(但用整数也是兼容的)。在Atmel Studio 7.0中写代码时,编辑器会提
发表于 2019-12-02
AVR单片机教程——按键动作
上一篇教程中我们学习了如何读取按键状态。而按键的动作,比如单击,至少需要两个状态才能判定,长按、双击的判定更加复杂。今天我们来学习如何使用库函数判断按键单击,以及其实现原理。我们要实现的是:当一个按键被单击时,一个LED的状态改变(即亮变暗,暗变亮);4个按键对应4个LED。利用库提供的 button_pressed 函数,很容易就能实现这个功能。 1 #include <ee1/button.h> 2 #include <ee1/led.h> 3 #include <ee1/delay.h> 4  5 int mai
发表于 2019-12-02
AVR单片机教程——拨动开关
在按键的上方有4个拨动开关。开关与按键,在原理和使用方法上都是很类似的,但有不同的用途——按键按下后松开就会弹起,而开关可以保存其状态。<switch.h> 定义了与开关相关的函数。switch_status 对应 button_down ,switch_changed 对应 button_pressed ,使用与按键是基本相同的。这里通过一个异常简单的例子来演示开关函数的使用,并说明开关操作与按键的细微差别:使LED与开关状态保持同步。仿照上一篇教程,我们可以简单地把 button_pressed 替换为 switch_
发表于 2019-12-02
AVR单片机教程——开发环境配置
优秀作品设计者聊了几句,他说同时控制舵机和扬声器很难控制好延时,扬声器输出的音乐节奏会乱。我第一反应当然是他没有用定时器中断,一问果然如此,并且他不知道中断也不知道定时器。我也就不想多说了,告辞。之前设计模块化单片机开发系统的时候,一直觉得“业余爱好者因为开发平台封装性太强而无法学会使用单片机高级功能”(其实就是专指Timer/Counter,因为总线、ADC等都有库,唯独T/C必须用户自己写中断)这个论调站不住脚,甚至还写了个问卷,结果虽然与预期相符,但我还把原因归结为问卷能传播的范围太小。现在觉得,就算是大四的学生,水平也就这样。参观完这个展览,我更坚定了要好好写这份教程的想法。要想学好单片机,良好的开发环境必不可少。 
发表于 2019-12-03
AVR单片机教程——开发环境配置
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved