【例3-4】按钮开关模拟输入。电路如图3-7所示,开始高4位的灯亮,低4位的灯灭,编程实现S1按钮按一下,4个灯一组亮、灭交替。U1AT89C51R7 470RED7VC15R6 470RED614P3.S1R5 470RED5P3.1TXD0P3.0/RXDR4 470ED4中GNDB38A1P2.2R3470RED3P2.4/A12PSL43手29233/A1R2470RED2P2.0/AGR1470RED19RSTPO.7IADTPOROLEDO18XTAL207P19XTAL1图3-7例3-4电路原理图分析:按键按下时为低电平,抬起时为高电平:按键的消抖动需延时8mS:P1口作为输出口控制灯,初值为OFH,亮、灭交替取反即可。在对按键的处理过程中,一般采用编写个键处理函数,如keyscan(,在主函数中对该函数使用,同时可以定义一个位变量,按键动作将位置1(或变量取反)。#include<reg51.h>#define ucharunsignedchar#defineintuint unsignedsbit S1=P3'2;//按键位定义bit il://存放键动作状态i1=0;void dlxms(uint xms)//延时xms毫秒( uint tl,t2;for( tl=0;tl<xms; tl++)for(t2=0; t2<110; t2++);1void keyscan(( S1=1;//读之前先置1if( S1==0)//如果按键按下(dlxms(8);//延时,去抖动if( S1==0)//键继续按下吗?( il=l;while( Sl==0) ;//按键没抬起,等待11174
74 【例3-4】按钮开关模拟输入。电路如图3-7所示,开始高4位的灯亮,低4位的灯灭, 编程实现S1按钮按一下,4个灯一组亮、灭交替。 图3-7 例3-4电路原理图 分析:按键按下时为低电平,抬起时为高电平;按键的消抖动需延时8ms;P1口作为输 出口控制灯,初值为0FH,亮、灭交替取反即可。在对按键的处理过程中,一般采用编写一 个键处理函数,如keyscan(),在主函数中对该函数使用,同时可以定义一个位变量,按键 动作将位置1(或变量取反)。 #include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit S1=P3^2; //按键位定义 bit i1; //存放键动作状态 i1=0; void dlxms(uint xms) //延时xms毫秒 { uint t1,t2; for( t1=0; t1<xms; t1++) for( t2=0; t2<110; t2++); } void keyscan() { S1=1; //读之前先置1 if( S1==0) //如果按键按下 { dlxms(8); //延时,去抖动 if( S1==0) //键继续按下吗? { i1=1; while( S1==0); //按键没抬起,等待 } } }
voidmain()(P1=0x0f;while(1)( keyacan();if(il==l)//如果按键按下{PI=PI;i1=0; ;1子1说明:开关接在P3.2上是为以后介绍中断的时间准备的:本例题是属于查询方式,后面介绍中断的时间可以模拟外部中断输入。修改:电路如图3-7所示,开始是所有的灯都亮,按一下S1,灯变为500ms闪烁,再按一下,变为全亮(相当于S1为一个控制开关,控制着等的亮、灭闪烁)。3.251单片机中断系统应用举例所谓中断,是指CPU正常运行程序时,由于CPU内部事件或外设请求,引起CPU终止正在运行的程序,转去执行请求中断的外设(或内部事件)的中断服务程序,中断服务程序执行完毕,再返回被中止的程序,这个过程称为中断。利用中断可以避免不断检测外设状态,提高CPU的效率。3.2.1中断系统的再认识1.中断的有关概念(1)中断源与中断请求引起中断的原因,或是能发出中断申请的来源,称为中断源。中断源有外部中断和内部中断,内部中断由程序预先安排的中断指令引起,或由于CPU运算中产生的某些错误(如除法出错、运算溢出)引起。外部中断是外设或协处理器向CPU发出的中断申请引起的,外部中断义称为硬件中断。中断源向CPU发出中断信号的过程称为中断甲请或中断请求。(2)可屏蔽中断与非屏蔽中断可屏蔽中断有时也称为直接中断。屏蔽是指CPU可以不处理的中断请求。这种屏蔽实际上是CPU的一种工作方式,可以通过软件(指令)来设置,也就是可以通过指令,使CPU或者允许接受中断请求,或者不接受中断请求。具体的指令由CPU的指令系统来决定。可屏蔽中断是最常见的一种中断方式,所有的微处理器都有这种中断方式。对非屏蔽中断来说,如果该中断源申请了中断,CPU是一定要处理的。CPU不可以也不能用软件将该中断屏蔽掉。一般一些紧急的情况,如掉电中断申请,就可以安排为这种中断方式,以保证紧急情况一定能得到处理。但并不是所有的微处理器的中断系统都有这种75
75 void main( ) { P1=0x0f; while(1) { keyacan(); if(i1==1) //如果按键按下 { P1=~P1; i1=0;; } } } 说明:开关接在P3.2上是为以后介绍中断的时间准备的;本例题是属于查询方式,后 面介绍中断的时间可以模拟外部中断输入。 修改:电路如图3-7所示,开始是所有的灯都亮,按一下S1,灯变为500ms闪烁,再按 一下,变为全亮(相当于S1为一个控制开关,控制着等的亮、灭闪烁)。 3.2 51单片机中断系统应用举例 所谓中断,是指CPU正常运行程序时,由于CPU内部事件或外设请求,引起CPU终止正在 运行的程序,转去执行请求中断的外设(或内部事件)的中断服务程序,中断服务程序执行 完毕,再返回被中止的程序,这个过程称为中断。利用中断可以避免不断检测外设状态, 提高CPU的效率。 3.2.1 中断系统的再认识 1.中断的有关概念 (1)中断源与中断请求 引起中断的原因,或是能发出中断申请的来源,称为中断源。中断源有外部中断和内 部中断,内部中断由程序预先安排的中断指令引起,或由于CPU运算中产生的某些错误(如 除法出错、运算溢出)引起。外部中断是外设或协处理器向CPU发出的中断申请引起的,外 部中断又称为硬件中断。 中断源向CPU发出中断信号的过程称为中断申请或中断请求。 (2)可屏蔽中断与非屏蔽中断 可屏蔽中断有时也称为直接中断。屏蔽是指CPU可以不处理的中断请求。这种屏蔽实际 上是CPU的一种工作方式,可以通过软件(指令)来设置,也就是可以通过指令,使CPU或 者允许接受中断请求,或者不接受中断请求。具体的指令由CPU的指令系统来决定。可屏蔽 中断是最常见的一种中断方式,所有的微处理器都有这种中断方式。 对非屏蔽中断来说,如果该中断源申请了中断,CPU是一定要处理的。CPU不可以也不 能用软件将该中断屏蔽掉。一般一些紧急的情况,如掉电中断申请,就可以安排为这种中 断方式,以保证紧急情况一定能得到处理。但并不是所有的微处理器的中断系统都有这种
中断方式,51单片机的中断系统就没有非屏蔽中断。(3)中断的开放与关闭中断的开放与关闭,亦称为开中断和关中断,是指CPU对中断系统的控制状态,只有当CPU处于开中断状态时,才能接受外部的中断申请。反之,当CPU处于关中断状态时,则不能接受外部的中断申请。CPU具有开中断和关中断控制状态,和CPU是否接受屏蔽中断申请是一致的。当CPU处于关中断控制时,也就是对外实现了中断的屏蔽。CPU只有在开中断的控制状态下,才可以接受可屏蔽中断申请。中断的开放与关闭和非屏蔽中断无关。CPU有开中断状态和关中断状态是中断系统工作的需要。当CPU在开中断状态下接受了一个外设的中断申请时,就应该处理这个外设要求CPU完成的工作。在此期间,一般来说,CPU不应该再去接受其他的中断申请,而是应该把中断关闭,一心一意地为已接受的中断申请服务。而当中断服务完毕之后,则使中断开放,以便接受新的中断申请。所以,开/关中断状态的存在与设置是完成中断系统的工作所不可缺少的。(4)中断优先级与中断嵌套当有多个中断源请求中断时,中断系统判别中断申请的优中所先级,CPU响应优先级高的中断,挂起优先级低的中断。CPU在氏L运行中断服务子程序时,若有新的更高优先级的中断申请进入35,则CPU要挂起原中断进入更高级的中断服务子程序,实现中区口店断嵌套功能。中断嵌套的示意图如图3-8所示。(5)中断响应与中断服务程序图3-8中断嵌套示意图CPU执行中断服务程序的过程称为中断响应;为相应的中断源而编写的程序称为中断服务程序;中断服务程序在内存中存放的首地址称为中断服务程序入口地址。2.中断处理过程对于不同的计算机,中断处理的具体过程可能不尽相同,即使是同一台计算机,由于中断方式的不同(如可屏蔽中断、非屏蔽中断等),中断处理也会有差别,但是基本的处理过程应该是相同的。一个完整的中断处理的基本过程应包括:中断请求、中断优先权判别、中断响应、中断处理及中断返回。(1)中断请求中断请求是中断源(或者通过接口电路)向CPU发出信号,要求CPU中断原来执行的程序并为它服务。中断请求信号可能是电平信号,也可能是脉冲信号。CPU能够接受的中断请求信号则随CPU而定。外设向CPU发出中断请求信号需要两个条件:①外设本身的工作已经完成,如键已按下、光电输入机已准备好数据、实时时钟的定时时间已到等,才可向CPU申请中断。②计算机系统允许该外设发中断请求信号。如果系统由于某种原因不充许它发中断请求,即使外设本身的工作已经完成并发出了状态信号,对应的I/0接口电路也不发出中断请求信号,这称为接口电路中断屏蔽或中断禁止。反之,则称为接口电路中断允许或中断开76
76 中断方式,51单片机的中断系统就没有非屏蔽中断。 (3)中断的开放与关闭 中断的开放与关闭,亦称为开中断和关中断,是指CPU对中断系统的控制状态,只有当 CPU处于开中断状态时,才能接受外部的中断申请。反之,当CPU处于关中断状态时,则不 能接受外部的中断申请。 CPU具有开中断和关中断控制状态,和CPU是否接受屏蔽中断申请是一致的。当CPU处于 关中断控制时,也就是对外实现了中断的屏蔽。CPU只有在开中断的控制状态下,才可以接 受可屏蔽中断申请。中断的开放与关闭和非屏蔽中断无关。 CPU有开中断状态和关中断状态是中断系统工作的需要。当CPU在开中断状态下接受了 一个外设的中断申请时,就应该处理这个外设要求CPU完成的工作。在此期间,一般来说, CPU不应该再去接受其他的中断申请,而是应该把中断关闭,一心一意地为已接受的中断申 请服务。而当中断服务完毕之后,则使中断开放,以便接受新的中断申请。所以,开/关中 断状态的存在与设置是完成中断系统的工作所不可缺少的。 (4)中断优先级与中断嵌套 当有多个中断源请求中断时,中断系统判别中断申请的优 先级,CPU响应优先级高的中断,挂起优先级低的中断。CPU在 运行中断服务子程序时,若有新的更高优先级的中断申请进入 ,则CPU要挂起原中断进入更高级的中断服务子程序,实现中 断嵌套功能。中断嵌套的示意图如图3-8所示。 (5)中断响应与中断服务程序 CPU执行中断服务程序的过程称为中断响应;为相应的中 断源而编写的程序称为中断服务程序;中断服务程序在内存中存放的首地址称为中断服务 程序入口地址。 2.中断处理过程 对于不同的计算机,中断处理的具体过程可能不尽相同,即使是同一台计算机,由于 中断方式的不同(如可屏蔽中断、非屏蔽中断等),中断处理也会有差别,但是基本的处 理过程应该是相同的。一个完整的中断处理的基本过程应包括:中断请求、中断优先权判 别、中断响应、中断处理及中断返回。 (1)中断请求 中断请求是中断源(或者通过接口电路)向CPU发出信号,要求CPU中断原来执行的程序 并为它服务。中断请求信号可能是电平信号,也可能是脉冲信号。CPU能够接受的中断请求 信号则随CPU而定。 外设向CPU发出中断请求信号需要两个条件: ① 外设本身的工作已经完成,如键已按下、光电输入机已准备好数据、实时时钟的定 时时间已到等,才可向CPU申请中断。 ② 计算机系统允许该外设发中断请求信号。如果系统由于某种原因不允许它发中断请 求,即使外设本身的工作已经完成并发出了状态信号,对应的I/O接口电路也不发出中断请 求信号,这称为接口电路中断屏蔽或中断禁止。反之,则称为接口电路中断允许或中断开 图 3-8 中断嵌套示意图
放。满足上述两个条件后,中断源可以向CPU提出中断请求。但CPU是否响应中断,还取决于它是处在允许中断状态还是处在禁正中断状态。这由CPU内部设置的中断允许触发器控制。中断允许触发器的状态由软件控制,这样CPU可处在中断允许状态或中断开放状态,或可处在中断屏蔽状态或中断禁止状态。(2)中断优先权判别一个计算机系统常有多个中断源:同一中断请求引脚也可以接有多个可以提出中断请求的外设,如图3-9所示。遇到几个设备同时中断请求时,CPU先响应谁,这就有一个中断优先权的问题。VOTH接口V/OTH接口VOTH接口价1ATCPU外设外设外设1+*INT图3-9同一中断源请求引脚有多个外设中断优先权有3条原则:1)多个中断源同时甲请中断时,CPU先响应优先权高的中断请求。②优先权级别低的中断正在处理时,若有级别高的中断请求,则在高级别中断服务程序执行完后再返回低级别中断服务程序继续执行,这称为中断嵌套。③同级别或低级别的中断源提出中断请求时,CPU要等到正在处理的中断服务程序执行完毕返回主程序,并执行广主程序的一条指令后,才接着响应。中断源中断优先权的高低有的是在计算机设计、制造时就规定了的,例如有的计算机规定掉电、故障处理等中断请求的优先权级别高于一般中断请求。有的是让用户自己安排的,这可以采用硬件办法,也可以采用软件办法。例如,将许多会提出中断请求的外设用电路连接成一个链,外设越排在前面,优先权越高,连成链的逻辑电路使排在后面的外设只有在它前面各外设均不中断请求时才能提出中断请求,当前面的外设有中断请求时,将屏蔽后面各外设的中断请求或中断后面外设原已进入的中断服务程序。软件办法采用查询手段依次询问各外设有未提出中断请求,如有则转去为该外设服务,如无则循序询问下一个外设,这样先查询的外设优先权高,后查询的外设优先权低。(3)中断响应如果提出中断请求的中断源优先权高,而且接口电路与CPU都中断开放,CPU将响应中断,自动执行下列工作:①保留断点:中止正在执行的程序,并对断点进行保护,即将断点地址的值压入堆栈保存,以便中断服务程序执行完后能返回断点处继续执行程序。②转入中断服务程序:将中断服务程序的人口地址送入PC,以转到中断服务程序。各中断源要求服务的内容不同,所以要编制不同的中断服务程序,它们有不同的入口地址。CPU首先要确定是哪一个中断源在申请中断,然后将对应的入口地址送入PC。(4)中断处理77
77 放。 满足上述两个条件后,中断源可以向CPU提出中断请求。但CPU是否响应中断,还取决 于它是处在允许中断状态还是处在禁止中断状态。这由CPU内部设置的中断允许触发器控 制。中断允许触发器的状态由软件控制,这样CPU可处在中断允许状态或中断开放状态,或 可处在中断屏蔽状态或中断禁止状态。 (2)中断优先权判别 一个计算机系统常有多个中断源;同一中断请求引脚也可以接有多个可以提出中断请 求的外设,如图3-9所示。遇到几个设备同时中断请求时,CPU先响应谁,这就有一个中断 优先权的问题。 图3-9 同一中断源请求引脚有多个外设 中断优先权有3条原则: ① 多个中断源同时申请中断时,CPU先响应优先权高的中断请求。 ② 优先权级别低的中断正在处理时,若有级别高的中断请求,则在高级别中断服务程 序执行完后再返回低级别中断服务程序继续执行,这称为中断嵌套。 ③ 同级别或低级别的中断源提出中断请求时,CPU要等到正在处理的中断服务程序执 行完毕返回主程序,并执行了主程序的一条指令后,才接着响应。 中断源中断优先权的高低有的是在计算机设计、制造时就规定了的,例如有的计算机 规定掉电、故障处理等中断请求的优先权级别高于一般中断请求。有的是让用户自己安排 的,这可以采用硬件办法,也可以采用软件办法。例如,将许多会提出中断请求的外设用 电路连接成一个链,外设越排在前面,优先权越高,连成链的逻辑电路使排在后面的外设 只有在它前面各外设均不中断请求时才能提出中断请求,当前面的外设有中断请求时,将 屏蔽后面各外设的中断请求或中断后面外设原已进入的中断服务程序。软件办法采用查询 手段依次询问各外设有未提出中断请求,如有则转去为该外设服务,如无则循序询问下一 个外设,这样先查询的外设优先权高,后查询的外设优先权低。 (3)中断响应 如果提出中断请求的中断源优先权高,而且接口电路与CPU都中断开放,CPU将响应中 断,自动执行下列工作: ① 保留断点:中止正在执行的程序,并对断点进行保护,即将断点地址的值压入堆栈 保存,以便中断服务程序执行完后能返回断点处继续执行程序。 ② 转入中断服务程序:将中断服务程序的人口地址送入PC,以转到中断服务程序。各 中断源要求服务的内容不同,所以要编制不同的中断服务程序,它们有不同的入口地址。 CPU首先要确定是哪一个中断源在申请中断,然后将对应的入口地址送入PC。 (4)中断处理
中断处理也称为中断服务,实际上就是在执行中断服务程序。在中断服务程序中,一般要完成以下工作:①保护现场:根据需要把断点处有关寄存器的内容推入堆栈保护。因为CPU的寄存器无论是在调用程序和被调用程序中都是可以使用的。如果某些寄存器在主程序中已经保存了数据,并且在以后的执行中还要继续使用,而在中断服务程序中也要用到这些寄存器,则原来的数据就会被新的数据取代,以后主程序再使用这些数据就要出错。因此,对于子程序中要使用的寄存器,一般都应先推入堆栈加以保护。具体应保护哪些寄存器的内容,则应视情况而定。②处理开/关中断:一般的中断系统在响应中断后是自动关中断的,在退出中断服务程序前,一定要恢复到开中断的状态,以便CPU在结束这次中断处理后,接受和处理其他的中断申请。另外,进入中断服务程序后,需要考虑是否还允许其他中断源申请中断。③执行中断服务程序:中断服务的核心就是执行中断服务程序,对于程序设计者来说,就是要根据外设和CPU交换数据的要求,编写中断服务程序。④恢复现场:在结束中断服务程序之前,要将推入堆栈保护的寄存器内容,弹出到各自所属的寄存器,以便回到主程序后,继续执行原来的程序。③结束中断服务程序:中断服务程序的最后必须有一条中断返回指令,用以结束中断服务程序的执行。(5)中断返回中断返回是在中断服务程序,用一条返回指令来实现的。此时,CPU将压入堆栈保护的断点地址弹出到计数器PC,从而使CPU继续执行中断了的主程序。3.2.251单片机中断系统结构51系列单片机中,不同型号的单片机的中断源数量不同。51单片机的51子系列有5个中断源,52子系列有6个中断源。它们均有两级优先级,通过4个专用中断控制寄存器(IE、IP、TCON、SCON)进行中断管理。1.原理结构图51单片机的中断系统包括中断源和中断控制等,其结构原理如图3-10所示。优先级中断允许寄存器IE0查询电路中断优先级INTO高优先级ITO寄存器IP源允许总允许中断请求国TFO源码向量入口INTI-ZET低优先级中断请求TFIL源码向量入口图3-1051单片机中断系统结构图78
78 中断处理也称为中断服务,实际上就是在执行中断服务程序。在中断服务程序中,一 般要完成以下工作: ① 保护现场:根据需要把断点处有关寄存器的内容推入堆栈保护。因为CPU的寄存器 无论是在调用程序和被调用程序中都是可以使用的。如果某些寄存器在主程序中已经保存 了数据,并且在以后的执行中还要继续使用,而在中断服务程序中也要用到这些寄存器, 则原来的数据就会被新的数据取代,以后主程序再使用这些数据就要出错。 因此,对于子程序中要使用的寄存器,一般都应先推入堆栈加以保护。具体应保护哪 些寄存器的内容,则应视情况而定。 ② 处理开/关中断:一般的中断系统在响应中断后是自动关中断的,在退出中断服务 程序前,一定要恢复到开中断的状态,以便CPU在结束这次中断处理后,接受和处理其他的 中断申请。 另外,进入中断服务程序后,需要考虑是否还允许其他中断源申请中断。 ③ 执行中断服务程序:中断服务的核心就是执行中断服务程序,对于程序设计者来 说,就是要根据外设和CPU交换数据的要求,编写中断服务程序。 ④ 恢复现场:在结束中断服务程序之前,要将推入堆栈保护的寄存器内容,弹出到各 自所属的寄存器,以便回到主程序后,继续执行原来的程序。 ⑤ 结束中断服务程序:中断服务程序的最后必须有一条中断返回指令,用以结束中断 服务程序的执行。 (5)中断返回 中断返回是在中断服务程序,用一条返回指令来实现的。此时,CPU将压入堆栈保护的 断点地址弹出到计数器PC,从而使CPU继续执行中断了的主程序。 3.2.2 51 单片机中断系统结构 51系列单片机中,不同型号的单片机的中断源数量不同。51单片机的51子系列有5个中 断源,52子系列有6个中断源。它们均有两级优先级,通过4个专用中断控制寄存器(IE、I P、TCON、SCON)进行中断管理。 1.原理结构图 51单片机的中断系统包括中断源和中断控制等,其结构原理如图3-10所示。 图3-10 51单片机中断系统结构图