AVR单片机基本输入和外部中断实验二

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在本例中,通过介绍利用按键开关控制发光二极管的亮灭来了解AVR单片机的端口检测外部信号的功能和方法。
本例中有3个功能模块,描述如下:
● 单片机系统:检测外界的按键开关信号,根据按键的开关状态控制发光二极管的亮灭状态。
● 外围电路:首先是产生信号的按键电路,包括对按键去抖动电路的介绍;然后是发光二极管的控制电路。
●中断源
中断源是指能够向单片机发出中断请求信号的部件和设备。对于单片机来讲,往往存在多个中断源。中断源一般可分为内部中断源和外部中断源。
单片机内部集成的许多功能模块,如定时器、串行通讯口、模/数转换器等,它们在正常工作时往往无需CPU参与,而当处于某种状态或达到某个规定值需要程序控制时,会通过发出中断请求信号通知CPU。这一类的中断源位于单片机内部,称作内部中断源。内部中断源在中断条件成立时,一般通过片内硬件会自动产生中断请求信号,无须用户介入,使用方便。内部中断是CPU管理片内资源的一种高效的途径。
典型的硬件去抖动电路如图2.1.4,74LS02按键输出端口通过/Q端接入单片机的I/O口,74LS02构成一个R-S触发器电路实现按键的消抖。
●软件消抖的原理和实现
软件消抖的基本原理是在软件中对按键进行两次检测确认,记载第一次检测到按键按下后,间隔10ms左右再次检测按键是否按下,只有在两次都检测到按键按下时才最终确认有键按下,这样就避开了按键的抖动时间,从而消除了抖动的影响。
{
_delay_ms(20); //判断按键按下,延时一会再判断是否按下,以消除干扰
if(!(PIND & (1 << PD7))) //按键真正按下后,进行相应处理
{
PORTB = 0Xaa;//
while(!(PIND & (1 << PD7))); //
//PORTB = 0Xaa;//
}
}
}
图2.1.6为LED显示电路,当按键K3被按下时,D1、D3、D5、D7点亮,D2、D4、D6、D8熄灭。当按键K4被按下时,D1、D3、D5、D7熄灭,D2、D4、D6、D8点亮。
2、元器件选择
在这里列出和本例相关的、关键部分的器件名称及其在电路中的作用。
● ATmega16:单片机,检测按键按下情况并控制发光二极管的亮灭。
●软件程序:通过读取AVR单片机相应端口的状态,编写相应的程序控制发光二极管的亮灭。
本例的目的在于希望读者完成本例后,能完成相关电路的设计和相应程序的编写,从而掌握以下知识点:
◆ 了解AVR单片机端口输入功能,掌握使用AVR单片机端口输入功能检测外部信号的原理。
◆ 熟悉单片机端口输入输出功能的综合使用。
DDRB = 0Xff; //PB端口置为输出
PORTD = 0Xc0; //一定要使能上拉电阻,否则会有干扰
DDRD = 0X3F; //K3、K4按键(PD6、PD7)设置为输入端口
while(1)
{
if(!(PIND & (1 << PD6))) //判断按键是否按下
{
_delay_ms(20); //判断按键按下,延时一会再判断是否按下,以消除干扰
●中断向量
中断源发出的请求信号被CPU检测到之后,如果单片机的中断控制系统允许响应中断,CPU会自动转移,执行一个固定的程序空间地址中的指令。这个固定的地址称作中断入口地址,也叫做中ຫໍສະໝຸດ Baidu向量。中断入口地址往往是由单片机内部硬件决定的。
AVR学习笔记二、基本输入和外部中断实验
-------基于LT_Mini_M16
2.1利用按键控制发光二极管的亮灭
2.1.1实例功能
在“点亮发光二极管”和“让发光二极管动起来”这两个例子中,都是通过单片机程序来控制发光二极管的亮灭。如果想要控制发光二极管的亮灭,只有通过打开或者关闭电源来实现控制。那么怎样实现人工参与控制呢?
1单片机的中断系统
关于中断的概念可以在一般的教材中找到,本例中只做简要叙述,不再详细说明。
中断属于一种对事件的实时处理过程。中断源可能随时停止单片机当前正在处理的工作,转而去处理中断事件,待中断时间处理完毕之后,再返回原来工作的断点处,继续原来的工作。
对于单片机的中断系统,需要了解这几个概念:中断源、中断信号、中断向量、中断优先级、中断嵌套、中断控制(屏蔽)、中断响应条件、中断响应过程(中断服务程序)。
●LED的亮灭控制
通过将单片机的PB0-PB7口设置为输出状态,根据K3、K4两个按键的按下情况,控制不同的发光二极管点亮或熄灭。
● AVR单片机端口输入状态的读取
AVR单片机端口配备有3个寄存器,分别是方向控制寄存器DDRx,数据寄存器PORTx,和输入引脚寄存器PINx(x=A\B\C\D)。当I/O工作在输入方式,要读取外部引脚上的电平时,应读取PINxn的值,而不是PORTxn的值。
脉冲的上跳沿或下降沿(上升沿触发型或下降沿触发型)
高电平或低电平(电平触发型)
电平的变化(状态变化触发型)
对于单片机来讲,不同的中断源,产生什么类型的中断信号能够触发申请中断,取决于芯片内部的硬件结构,而且通常也可以通过用户的软件来设定。
单片机的硬件系统会自动对这些中断信号进行检测。一旦检测到规定的信号出现,将会把相应的中断标志位置“1”(在I/O空间的控制或状态寄存器中),通知CPU进行处理。
系统中的外部设备也可以用作中断源,这时要求它们能够产生一个中断信号(通常是高(低)电平或者电平跳变的上升(下降)沿),送到单片机的外部中断请求引脚供CPU检测。这些中断源位于单片机外部,称为外部中断源。通常用作外部中断源的有输入输出设备、控制对象、以及故障源等。
●中断信号
中断信号是指内部或外部中断源产生的中断申请信号,这个中断信号往往是电信号的某种变化形式,通常有以下几种类型:
● PD6、PD7:连接按键K3、K4,检测两个按键的状态。
2.1.4程序设计
1、程序功能
● 按键软件消抖
本例中采用软件消抖的方法,在程序中加入软件延时,去除按键的抖动。
●按键检测
通过将单片机的PD6、PD7口设置为输入状态,同时使能这两个口的内部上拉电阻(因为这两个口在按键没有按下时处于悬空状态,易受外界干扰,所以必须将其内部上来电阻使能,使其平时处于高电平状态),检测按键是否按下。
图2.1.1按键开关图2.1.2按键闭合断开时的电压波动示意图
(2)按键去抖动的方法和原理
为了去除按键的抖动,保证单片机对按键的一次输入只响应一次,可以采用硬件和软件两种方法:硬件电路去抖动是在外围电路中加入去抖动电路(如R-S触发器);软件去抖动是在程序中加入延时程序以跳过抖动时间,等待信号稳定后再次判断按键的输入电平,如果信号电平保持不变,则可以确认一次按键按下。
1、按键的去抖动电路
(1)按键的响应过程
我们日常所说的按键,实际上是一个机械开关,本实例所用的按键外观如图2.1.1所示。理想的按键的闭合和断开时,接触点的电压应该立即变高或者变低,但是由于机械触点的弹性以及按键按动时电压突变等原因,在触点闭合或断开的瞬间会出现电压抖动现象,如图2.1.2所示。在发生抖动的时间一般在5-10ms。
if(!key)//再次判断按键是否按下,
{
…//按键按下的处理程序
}
}
While(!key); //判断按键是否放开,key=1表示按键释放,退出按键处理函数
}
2.1.3电路
本例中的电路如图2.1.5和2.1.6所示。
1、电路原理
图2.1.5是按键检测电路,两个按键分别连接到单片机的PD6、PD7管脚,AVR单片机在程序里把PD6、PD7设置为带上拉的端口,这样按键没有按下时,PD6、PD7处于高电平状态,当按键按下时PD6、PD7被连接到地,电平状态变为低电平,程序中检测到PD6、PD7的电平为低电平时,就可以认为按键被按下了。
本例中三个功能模块描述如下:
● 单片机系统:对按键事件产生的中断时间作出响应,并在数码管上显示按键按下的次数。
● 外围电路:通过将按键连接到单片机的外部中断检测端口,实现中断产生电路,数码管显示电路用于指示按键的按下状态。
● 软件程序:编写AVR单片机的外部中断服务程序,从而实现对中断事件的响应。
2.2.2器件和原理
一次按键处理过程如下:当按键按下之后,相应的按键接触点的电压以高低电平的方式输入到单片机的I/O口。按键的闭合与断开是有一定时间的,一般为0.1-1S。而AVR单片机的机器周期一般为1us甚至更短,在0.1-1S的时间段内,程序会检测很多次按键的输入电平,这样单片机可能会认为按键被按下了多次,从而出现误判。
图2.1.3R-S触发器的基本原理
在启动过程中,/S端一旦下降到开门电平,Q端电平就会上升,反馈到门B的输入端,此时门B在/R的低电平作用下处于导通状态,/Q输出高电平反馈到A的输入端,如果这时/S端电压有一个高的跳动,则A门截止,Q段输出低电平,这个低电平反馈到A的输入端,使A门导通,Q端电平为高,这样就保证了Q端电平的稳定,从而消除按键的抖动。
◆ 掌握AVR单片机按键的硬件去抖动的电路设计和原理。
◆ 掌握AVR单片机端口输入输出程序的编写。
◆ 掌握AVR单片机按键软件去抖动功能的实现。
2.1.2器件和原理
本例主要介绍AVR单片机外围电路中按键去抖电路的设计,分别介绍相应的软件和硬件解决方案。然后利用C语言编写通过按键控制发光二极管亮灭状态的程序。
●D1-D8:发光二极管,指示按键状态。
●RP1:阻值为330Ω的排阻,限流电阻。
● K3、K4:按键,当按键按下时,与按键连接的单片机端口的电平发生变化。
图2.1.5按键电路图2.1.6 LED电路
3、管脚连接
在这里列出和本例相关的、关键部分的单片机端口与外围电路的连接。
● PB0-PB7:连接8个发光二极管LED1-LED8,控制发光二极管的亮灭。
在有些应用场合,需要单片机对人工的开关信号作出相应的响应和处理,通过控制电源的通断会影响到单片机系统中的其他功能,所以通过控制电源的方法并不明智。能不能通过按动一个按键来实现发光二极管的亮灭呢?
当然可以,前面已经讲过,AVR单片机的I/O口都是双向的,也就是既能当作输出控制端口,也能当作输入检测端口。既然我们可以通过控制端口输出不同的高低电平使发光二极管实现点亮和熄灭;那么为什么不能通过监测端口输入电平的状态来进行相应的处理呢。
2、主要变量和函数说明

3、使用WINAVR开发环境,makefile文件同前面的例子,直接复制到本实例程序的文件夹中即可。
4、程序代码
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
PORTB = 0X00; //输出低,LED全部熄灭
●硬件去抖动电路的原理
用R-S触发器形成去抖电路是单片机外围电路设计中常用的方法,这种方法可以减少单片机软件对按键动作的延时和计算。
先来了解一下R-S触发器的基本工作原理和工作特点。R-S触发器的基本构成如图2.1.3所示,这个电路有两个与非门交叉耦合而成,/S、/R是信号输入端,低电平有效。Q和/Q既表示触发器状态,又是触发器的输出端。
图2.1.474LS02实现的硬件消抖电路
在按键接口软件的设计中,除了要考虑按键消抖外,一般还要判别按键的释放,只有检测到按键释放后,才能确定为一次完整的按键动作。
通用的案件检测程序如下:
Keyscan()
{
if(!key)//判断按键是否按下,key=0表示按键按下
{
delayms(20);//延时20ms。避开按键抖动时间
}
2.2利用外部中断检测按键
2.21实例功能
前面例子中分别介绍了按键控制发光二极管的亮灭,但是我们注意到,在程序中需要一直检测按键的状态,这样明显的浪费了单片机的资源,降低了单片机的工作效率,。那么有没有一种方法可以让单片机不用一直检测按键的状态,而只在有按键动作时才去响应呢?
当然有!单片机中除了具有基本输入输出功能的作用外,还有专门检测外界信号并作出响应的中断系统。在本例中,通过利用外部中断实现单片机对按键事件的响应和处理。
if(!(PIND & (1 << PD6))) //按键真正按下后,进行相应处理
{
PORTB = 0X55;//按键按下,灯亮
while(!(PIND & (1 << PD6)));//等待按键释放
//PORTB = 0X55; //把这句话从上面移到这里,按键释放后,灯才点亮
}
}
if(!(PIND & (1 << PD7))) //判断按键是否按下
相关文档
最新文档