新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 单片机学习之十一:中断方式按键

单片机学习之十一:中断方式按键

作者:时间:2016-09-28来源:电子产品世界收藏

  1、 实验现象

本文引用地址:http://www.eepw.com.cn/article/201609/310467.htm

  最右面的数码管初始显示0,每次按下外部按键K0执行加一,计数到九时重新回零。

  2、 实验目的

  掌握方式响应按键的原理

  掌握服务程序的具体编写:如何进行键的识别,如何去抖动

  3、 实验任务分析

  上一个试验我们了解了查询方式按键的原理。当工作于查询方式的时候,要不间断的对外部按键进行查询,其间不能干其他的任何工作。如果的工作量较大,这种方式就很难适应。

  为了进一步提高单片机的工作效率,可以采用方式。

  中断方式的按键响应过程如下:单片机处理自己的工作,如果有按键按下,向单片机发出中断请求,单片机就会停下现在正在处理的工作,转去执行中断程序,执行之后回来继续刚才的工作;如果没有按键按下,单片机就作自己的工作,不理睬外部键盘。

  怎样向单片机发出中断请求呢?发出中断请求的来源叫做中断源。单片机可提供五个中断源。其中2个为外部中断请求INT0和INT1,2个为片内定时/计数器T0和T1的计满溢出中断,还有一个是片内串行口中断请求TI或者RI。在本试验中,我们用到的是外部中断INT1。

  还是先看看电路吧。(注意在作中断试验之前,我们必须先把JMP4跳线插上,这样按键动作才能发出中断请求。)

  

 

  我们在试验一中曾经给大家介绍过,单片机的P3口是双功能口,第一种功能可以作通用的I/O口。而在本试验中,我们要用到P3口的第二功能。大家看P3.2和P3.3两个引脚,斜线后面标示的就是P3口的第二功能,分别是INT0和INT1,也就是单片机的两个外部中断源。

  我们发现,当任何一个按键按下的时候,P3.3引脚,即INT1上就会出现一个低电平,向单片机发出中断申请。如果单片机开放了外部中断,就响应中断请求,进入中断服务程序。

  那么单片机是否开放中断功能是由什么控制的呢?在这里就涉及到另外一个特殊功能寄存器IE啦。还记得单片机内部256字节的数据RAM吗?其中高128字节(80h~ffh)是特殊功能寄存器区。以前我们介绍过PSW就在这个区域,同样IE也在这个区域,它的名字叫做“中断允许寄存器”,专门负责程序是否响应中断的,它的各位功能说明如下:

  EA:CPU中断允许标志。EA=0,CPU禁止各种中断;EA=1,CPU开放中断。但是,每个中断源的中断请求是否允许,还需要由各自的允许位决定。所以在本程序中,大家不要忘了首先把EA置1哦!

  ES:串行口允许中断。ES=1,允许串行口中断;ES=0,禁止串行口中断。所以,在这个程序中,这一位和我们没有关系,不理它就是啦。

  ET1:定时器/计数器T1的溢出中断允许。ET1=1时,允许T1溢出中断;ET1=0时,禁止T1溢出中断。同样,这一位和我们也没有关系。

  EX1:外部中断1(即INT1)允许中断。当EX1=1时,允许INT1中断;当EX1=0时,禁止INT1中断。可见,这一位的值和我们这个试验密切相关,所以大家千万不要忘了把这一位置1。

  下面的ET0和EX0的功能与ET1和EX1类似,是分别控制定时器T0和外部中断INT0的,这里就不再赘述啦。

  在前面分析时,我们发现,四个按键中任何一个按下,都会发出中断请求。那么,如何判断中断请求是由那个按键发出的呢?这就是中断服务程序的工作了。在中断服务程序中,需要完成如下工作:键识别、去抖动、和键功能处理。

  那么,键识别是如何完成的呢?它的思路是这样的。

  (1)、先把P1口的状态读入a寄存器,然后把高四位屏蔽掉

  (2)、判断是否k0按键按下,(即判断a中的数是否00001101),如果是就调用延时程序去抖,否则,表示不是K0按下,退出中断返回主程序

  (3)、调用延时程序后,重复上面的(1)(2)步。如果确定k0按下,转中断服务程序,否则就是抖动,退出中断返回主程序。

  在这里还需要说明一点:在进入中断服务程序之后,我们首先应该关闭中断,因为如果不关闭中断,就有可能会引起混乱。在中断服务程序返回主程序之前,再把中断打开。

  4、实验程序

  org 0000h

  ljmp start ;(1)为什么这里要放一条跳转指令呢,我们在后面解释把

  org 0013h

  ljmp ext1 ;(2)同上

  org 0030h

  start: clr p1.5 ;主程序开始

  mov r7,#0ffh

  setb ea ;cpu开放中断

  setb ex1 ;允许外部中断1申请中断

  setb it1 ;(3)设置外部中断1触发方式为跳变触发,原因在后面详细解释

  lcall play1 ;调用初始状态显示子程序

  ajmp $ ;等待按键发出中断申请

  ext1: clr ea ;进入中断,先关闭中断

  lcall key_reader ;调用键识别子程序

  pass: setb ea ;返回主程序之前先开中断

  reti ;(4)中断返回指令,

  key_reader: mov a,p1 ;读入P1口的状态

  anl a,#0fh ;屏蔽高四位

  cjne a,#0dh,pass;如果a的内容不是00001101(表示不是k0按下),就退出中断

  lcall del10ms ;否则,表示k0按下,调用10ms延时去抖

  mov a,p1 ;再次读入p1口的内容

  anl a,#0fh ;屏蔽高四位

  cjne a,#0dh,pass ;如果a的内容不是00001101,就是抖动,退出中断

  lcall play2 ;否则,确定按键按下,转数码显示程序

  ret

  play1: mov a,#48h ;让最右面的数码管显示0的子程序

  mov p0,a

  mov p2,#01h;

  ret

  play2: inc r7 ;查表求段码,然后送到P0口的子程序,大家很熟了

  mov a,r7

  mov dptr,#tab

  movc a,@a+dptr

  mov p0,a

  mov p2,#01h

  cjne a,#48h,next;如果没有显示到最后一个数字0,就继续查表显示

  mov r7,#0ffh ;否则,重新从表头开始显示

  next: ret

  del10ms: mov r5,#10 ;延时10ms子程序

  del1: mov r4,#02h

  del2: mov r3,#0ffh

  del3: djnz r3,del3

  djnz r4,del2

  djnz r5,del1

  ret

  tab: db 0ebh,52h,62h,0e1h,64h,44h,0eah,40h,60h,48h ;存放0~9的段码表

  end

  相信通过上面的详细注释,大家基本上已经看懂这个程序了。下面我就几个小问题再给大家作一些解释。

  5、注释

  1、先看(1)语句,我们发现程序开始的时候,在地址为0000h的地方,放了一条跳转指令。主程序是从程序存储器中0030h的地方开始存放的,为什么要把前面的空间空出来呢?这是因为前面的空间我们是有用处的。

  由于不同类型的中断,具有不同的中断入口地址。CPU在响应中断的时候,会根据中断源的类别,转到相应的入口去执行中断服务程序。外部中断1的入口地址是0013h(其余4个中断的入口地址大家可以查阅相关资料),那么cpu在响应了外部中断1后,会自动的到这个地址来,从这个地址开始往下执行程序。所以我们要把前面的一段空出来,以免覆盖这个地址。

  2、再看看(2)语句,它在中断1的入口处放了一个跳转指令,所以,cpu在响应外部中断后,会到这个入口处往下执行程序。于是CPU就会从这里转去中断服务程序。大家可能会说,为什么要跳转,直接从这里开始存放中断服务程序 不就可以了嘛。

  由于我们很难预料中断服务程序的长度,所以我们就拿不准主程序应该从什么单元开始存放。这样就容易造成整个程序的结构混乱。

  所以还是采用上面的方法吧,看起来结构清楚规范,容易理解。

  3、(3)语句的意思是设置外部中断1为跳变方式触发。大家可能觉得,当K0按下的时候,INT1上会出现一个低电平,为什么不能采用电平方式触发呢?解释如下:当我们选外部中断为电平方式触发的时候,当INT1输入低电平的时候,cpu响应中断。在中断返回之前,INT1必须回到高电平,否则就会第二次产生中断。所以,如果我们按下按键的时间较长,就会产生多次的中断,导致程序混乱。所以我们在这里要采用边沿方式触发。

  顺便说说it1,它是外部中断触发方式控制位,为1的时候选择跳变方式触发,为0的时候选择电平方式触发。那么它在哪里呢?

  it1是tcon寄存器其中的一位,tcon和我们知道的psw,ie一样,也是一个特殊功能寄存器。位置当然也在特殊功能寄存器区啦。

  TCON是定时器/计数器(T0,T1)的控制寄存器,关于它的应用我们以后通过例子详细说明。它的各位的功能说明如下:

  TF1:定时器/计数器(T1)的溢出中断标志,当T1产生溢出试,由硬件置1,CPU响应中断后,由硬件置0;TF0类似。(以后通过试验详细说明)

  TR1:置1时启动定时/计数器,置0时停止定时/计数器;TR0类似。(以后通过试验详细说明)

  IE1:外部中断1请求标志。当它置一的时候,请求中断。

  IT1:外部中断1触发方式控制位。如果IT1是1,则外部中断为跳变方式触发,否则,为电平方式触发。选择何种方式触发,视程序的具体情况来定。

  IE0:外部中断0请求标志,含义同IE1。

  IT0:外部中断0触发方式控制位,含义同IT1。

  4、语句(4)是中断返回指令,功能和子程序返回指令ret相类似,通常被安排在中断服务程序的最后。CPU执行完这条指令后,从原来被中断处开始,重新执行被中断的程序。

  现在大家对中断的基本概念和简单的编程处理方法有所了解了把,下面一个试验“按键控制跑马灯”,在这个试验里面,我们要了解关于中断现场保护的问题。



关键词: 单片机 中断

评论


相关推荐

技术专区

关闭