第5章 MCS51单片机中断系统 5.1中断系统概述◆ 5.1.1中断及中断源 在计算机系统中,所谓中断(Interrupt)就是指CPU在执行程序的过程中,由于某一事件发生,要求CPU暂停正在执行的程序,而去执行相应的处理程序,待处理结束后,再返回到原来程序停止处继续执行。触发产生中断(Interrupt Arising)的事件称为中断源(Interrupt Source)。中断发生后,中断源向CPU发出的请求信号叫做中断请求(Interrupt Request)。CPU停止执行现行程序而处理中断称为中断响应(Interrupt Response),CPU停止执行现行程序的间断处称为断点(Breakpoint),CPU执行的与中断相关的处理程序称为中断处理程序或中断服务程序(Interrupt Service Routines),处理过程即为中断处理(Interrupt Process)。中断系统是指完成中断处理的软件和硬件资源,它包括中断源的产生、中断判优、中断响应、中断查询、中断处理等过程,它是计算机系统一个重要的组成部件。一个典型的中断处理过程如图5.1所示。 CPU响应中断请求调用中断处理程序的过程与主程序调用子程序的过程相似(见图5.2),但是,它们是不同的,主要区别在于: 调用子程序时,调用哪个子程序、完成什么任务是程序设计时事先安排好的,采用子程序调用指令实现。中断事件发生是随机的,哪个事件发生、何时调用中断处理程序是事先无法确定的,在程序中无法事先安排调用指令,调用中断处理程序的过程是由硬件自动完成的。 触发中断的事件可以是计算机外部的,也可以是计算机内部的,归纳起来,中断源有以下几种情况。 (1) 外部设备发生某一事件,如打印机准备就绪、被控设备的参数超过限位阈值等。 (2) 计算机内部某个事件发生,如定时器/计数器溢出、串行口接收到一帧数据等。 (3) 计算机发生了故障引起中断。如系统电源掉电、运算溢出、系统出错等事件。 (4) 人为设置中断。在编程和调试时人为设置的中断事件,如单步执行、设置断点。 图5.1一个典型的中断处理过程 图5.2调用子程序的过程 5.1.2中断技术的作用 计算机系统采用中断技术,可以提高CPU的工作效率和处理问题的灵活性,其作用体现在以下几个方面。 (1) 解决了快速CPU和低速外设之间的速度匹配问题,使CPU和外设同时工作。CPU的工作速度是微秒级的,而外设的工作速度一般在毫秒级以上。CPU在启动外设工作后继续执行主程序,同时外设也在工作。当外设完成某项任务后,就发出中断申请,请求CPU中断它正在执行的程序,转去执行中断处理程序。中断处理完之后,CPU恢复执行主程序,外设也继续工作。这样,可以启动多个外设同时工作,有效地提高了CPU的效率。 (2) 可以实现实时处理。所谓实时控制,就是要求计算机能及时地响应被控对象提出的分析、计算和控制等请求,使被控对象保持在最佳工作状态,以达到预定的控制效果。在实时控制中,现场的各种参数、状态随时间和现场变化,可根据要求随时向CPU发出中断申请请求CPU处理,若中断条件满足,CPU立即响应并处理。 (3) 可以对突发故障及时处理。对于系统掉电、存储出错、运算溢出等难以预料的情况或故障,可由故障源向CPU发出中断请求,CPU响应后,按照事先拟定处理预案进行处理。 (4) 可以实现多任务资源共享。当一个CPU面对多项任务时,可能会出现在同一时刻几项任务同时要求CPU处理的情况,即资源竞争。中断技术是解决资源竞争的有效方法,它可以使多项任务共享一个资源,使得CPU能够分时完成多项任务。 5.2MCS51单片机的中断系统◆ MCS51单片机有5个中断源,分为两个中断优先级,可以实现两级中断嵌套。CPU对中断采用两级管理,用户可以根据需要来设定CPU是否开放中断,而且每个中断源都可以独立地设定为允许或禁止请求中断。每个中断源的优先级也可以独立地设定为高优先级或低优先级。MCS51单片机中断系统结构如图5.3所示。 图5.3MCS51单片机中断系统结构 MCS51单片机的5个中断源分别是两个外部事件中断、两个定时器/计数器计数溢出事件触发的中断和一个串行口缓冲器接收到或发送完数据触发的中断。 外部事件中断是由来自单片机外部的信号触发的,中断请求信号分别由引脚INT0(P3.2)和INT1(P3.3)引入。定时器/计数器溢出中断是计数器发生计数溢出而触发的中断。定时器/计数器溢出中断是为了实现定时或计数的需要而设置的。当计数器发生计数溢出时,意味着定时时间到或计数值已达到要求,向CPU请求中断。这是由单片机内部发出的中断请求。串行口中断是为单片机串行数据发送和接收的需要而设置的。当串行口接收或发送完一帧串行数据时,产生一个中断请求。这种请求也是在单片机内部发出的。 中断触发后,中断触发标志被登记在寄存器中,MCS51单片机没有专用的中断标志寄存器,它用两个特殊功能寄存器TCON和SCON分别登记5个中断源的中断触发标志,以此向CPU请求中断。CPU开放中断与否、中断源是否允许中断由中断控制寄存器IE设定,而中断优先级由中断优先级寄存器IP中的位来设定。查询电路用来处理相同优先级时CPU响应中断请求的顺序,以实现硬件调用响应的中断处理程序。下面介绍MCS51单片机的中断系统。 5.2.1MCS51单片机的中断标志 MCS51单片机的5个中断源的中断请求标志如图5.3所示。中断标志位的状态为1时,表明对应的中断源触发了中断,产生了中断请求。这些标志位分别由两个特殊功能寄存器来存储,即定时器/计数器控制寄存器(Timer/Counter Control Register,TCON)和串行口控制寄存器(Serial Port Control Register, SCON)。中断系统在每个机器周期采样这些标志,并在下一个机器周期查询它们,以确定哪些中断源发出了中断请求,然后进行相应的处理。 1. 定时器/计数器控制寄存器(TCON) 定时器/计数器控制寄存器TCON锁存外部事件中断请求标志以及定时器/计数器的溢出标志。TCON的地址为88H,各位的位地址为88H~8FH,TCON寄存器的内容如图5.4所示。 D7D6D5D4D3D2D1D0 TF1TR1TF0TR0IE1IT1IE0IT0 图5.4TCON寄存器的内容 1) 外部事件中断请求标志 IE0为外部事件中断INT0的中断请求标志位,IE1为外部事件中断INT1的中断请求标志位。当外部事件发生时,在单片机引脚INT0和INT1产生中断请求信号,IE0和IE1分别由来自引脚INT0和INT1的外部中断请求信号触发。 外部事件中断可以由电平触发(Level Activated)或跳变触发(Transition Activated),中断触发的方式取决于TCON寄存器中IT0和IT1的设定。IT0和IT1分别为定义INT0和INT1引脚上中断请求信号的触发方式。 下面以外部事件中断INT0为例来说明外部事件中断触发机制。 当IT0为1时,设置外部事件中断INT0为跳变触发方式,如果在INT0引脚上出现高电平变为低电平的负跳变,IE0位由硬件自动置1,以此为标志向CPU请求中断。CPU响应中断时,自动将中断请求标志IE0清零。 当IT0为0时,外部事件中断为电平触发方式。在电平触发方式时,中断请求标志由外部中断请求触发信号控制,如果在INT0引脚上为低电平时,中断标志位IE0位则由硬件置1,以此为标志向CPU请求中断,如果在INT0引脚上为高电平时,中断标志位IE0位则被清零。 外部事件中断为跳变触发方式时,在两个连续的机器周期内,第1个机器周期在INT0引脚上检测到的中断请求信号为高电平,第二个机器周期检测到其为低电平,那么,由硬件自动把IE0置1,向CPU请求中断。因此,在这种触发方式下,中断请求信号的高电平和低电平的持续时间应不少于1个机器周期,以保证跳变能够被检测到。CPU响应中断,IE0自动清零。 在单片机复位时,IT0被清零,外部事件中断为电平触发方式。 外部事件中断INT1的中断触发机制与INT0类似。 2) 定时器/计数器溢出标志 TF0为定时器/计数器T0的计数溢出标志位,TF1为定时器/计数器T1的计数溢出标志位。 以定时器/计数器T0为例,定时器/计数器T0启动计数后,从初始值开始加1计数,当计数器计满后(计数器的所有位都为1),再计1次,计数器溢出,溢出标志位TF0由硬件自动置1并锁存,以此向CPU请求中断。CPU响应计数器溢出中断后,标志位TF0被自动清零。 定时器/计数器T1的中断触发过程与T0类似。 2. 串行口控制寄存器(SCON) 串行口控制寄存器SCON锁存串行口发送结束标志和接收到数据的标志,不论哪个中断标志有效都会触发串行口中断。SCON的地址为98H,各位的位地址为98H~9FH,SCON寄存器的内容如图5.5所示。 D7D6D5D4D3D2D1D0 SM0SM1SM2RENTB8RB8TIRI 图5.5SCON寄存器的内容 1) 串行口发送中断请求标志位: TI 当串行口发送缓冲器SBUF发送完一帧数据后,由硬件自动把TI置1,以此向CPU请求中断。值得注意的是,在CPU响应中断时,TI并不会被自动清零,必须由用户在中断处理程序中用软件清零; 否则,CPU将会陷入响应中断和中断处理当中。 2) 串行口接收中断请求标志位: RI 当串行口接收缓冲器SBUF接收完一帧串行数据后,由硬件把RI置1,以此向CPU请求中断。同样,在CPU响应中断时,RI并不会被自动清零,必须由用户在中断处理程序中用软件清零; 否则,CPU将会陷入响应中断和中断处理当中,将会造成数据帧的丢失。 由于串行口接收和发送共享一个中断源,发送结束标志TI和接收到数据标志RI只要其中有一个被置1,都会产生串行口中断请求。因此,在双工通信时,为了辨别哪一个触发了中断,首先必须在中断处理程序中检测TI和RI的状态,然后清除标志位(TI或RI),再进行相应的中断处理,以保证接收和发送的持续进行。 5.2.2MCS51单片机的中断控制 如图5.3所示,MCS51单片机的中断控制分为两级,第一级通过5个中断允许控制位来确定屏蔽或者允许某个中断源的中断请求,第二级通过1个控制位来确定CPU开放或禁止中断。MCS51单片机提供了一个专门的特殊功能寄存器——中断允许寄存器(Interrupt Enable Register,IE)来保存这些中断允许控制位。IE寄存器的地址为0A8H,寄存器中各位的位地址为0A8H ~0AFH。IE寄存器的内容如图5.6所示。 D7D6D5D4D3D2D1D0 EA——ESET1EX1ET0EX0 图5.6IE寄存器的内容 1. CPU的中断控制位: EA EA为MCS51单片机的CPU中断控制位。 当EA=0,禁止所有中断源中断CPU工作,即禁止CPU响应任何中断请求。 当EA=1,允许中断源中断CPU工作,即开放CPU的中断响应功能。CPU开放中断后,每个中断源可以独立地设置为禁止或允许中断。 2. 外部中断允许控制位: EX0和EX1 EX0为外部事件中断INT0的中断允许控制位。 当EX0=0,禁止外部事件中断CPU工作,即屏蔽了中断请求,即使外部事件发生,中断标志IE0置1,CPU也不会响应。 当EX0=1,允许外部事件中断CPU工作。在CPU开放中断(EA为1)且该控制位为1的情况下,外部事件发生时IE0被置1,向CPU请求中断。 EX1为外部事件中断INT1的中断允许控制位。外部事件中断INT1的中断控制过程与INT0类似。 3. 定时器/计数器溢出中断允许控制位: ET0和ET1 ET0为定时器/计数器T0溢出中断允许控制位。 当ET0=0,禁止定时器/计数器计数溢出时中断CPU工作。在这种情况下,即使计数器计数溢出,溢出标志位TF0置1,CPU也不会响应这个中断请求。TF0可作为查询计数器是否溢出的测试标志。 当ET0=1,允许定时器/计数器计数溢出时中断CPU工作。在CPU开放中断且该控制位为1的情况下,一旦计数器计数溢出就会把TF0置1,向CPU请求中断。 ET1为定时器/计数器T1溢出中断允许控制位。定时器/计数器T1溢出中断控制过程与T0类似。 4. 串行中断允许控制位: ES ES为串行口的中断允许控制位。当ES=0时,禁止串行口中断,即使接收缓冲器接收到数据把接收中断标志RI置位,或者发送缓冲器发送完数据把发送中断标志TI置位,CPU也不会响应这个中断请求。标志位RI和TI可以作为接收和发送结束的测试标志位。当ES=1时,允许串行口中断,RI和TI二者中只要有一个为1,即可向CPU请求中断。 MCS51单片机复位后,IE被清零,因此,复位后所有中断都是被禁止的。若需要允许中断,必须根据需要重新设置IE。 例5.1一个单片机应用系统要求外部事件INT1、定时器/计数器T0以及串行口具有中断功能,如何设定IE寄存器? 因为应用系统要求INT1、T0以及串行口具有中断功能,首先必须使CPU开放中断,因此,EA应设置为1,INT1、T0以及串行口对应的中断控制位EX1、ET0和ES也应为1。程序如下: IE=0x96; 或: EA=1;;CPU开放中断 EX=1;;允许INT1中断 ET=1;;允许定时器/计数器T0溢出中断 ES=1;;允许串行口中断 5.2.3MCS51单片机的中断优先级 当多个中断源同时请求中断,或者CPU正在处理一个中断,又有了新的中断请求,对于上述情形MCS51单片机该如何处理呢?MCS51单片机设置了一个中断优先级寄存器(Interrupt Priority Register,IP)用于设置中断源的优先级,每个中断源可以被设置为高优先级或者低优先级(见图5.3),可以实现两级中断嵌套。对于上述问题,MCS51单片机有以下处理原则。 (1) 多个中断源同时向CPU请求中断时,首先响应高优先级中断源的中断请求。 (2) 当CPU正在处理一个中断,又有新的中断请求时,如果新的中断请求的优先级高于正在处理的中断,则CPU暂停正在执行的中断处理,去响应新的中断请求,即高优先级中断请求可以中断低优先级的中断处理,从而实现 图5.7中断嵌套 中断嵌套,如图5.7所示。如果是新的中断请求的优先级与正在处理的中断相同,或者其优先级低于正在处理的中断,那么,CPU不会响应这个中断请求,将继续执行中断处理,待本次中断处理结束返回后,再对新的中断请求进行处理,也就是说,相同优先级和低优先级的中断请求不能中断高优先级或相同优先级的中断处理。 中断优先级寄存器IP寄存器的地址为0B8H,各位的位地址为0B8H~0BFH。IP寄存器的内容如图5.8所示。 D7D6D5D4D3D2D1D0 ———PSPT1PX1PT0PX0 图5.8IP寄存器的内容 (1) PX0为外部事件中断INT0的优先级设定位; PX0=0,该中断源为低优先级,PX0=1,该中断源为高优先级。 (2) PT0为定时器/计数器T0的中断优先级设定位; PT0=0,该中断源为低优先级,PT0=1,该中断源为高优先级。 (3) PX1为外部事件中断INT1的优先级设定位; PX1=0,该中断源为低优先级,PX1=1,该中断源为高优先级。 (4) PT1为定时器/计数器T1的中断优先级设定位; PT1=0,该中断源为低优先级,PT1=1,该中断源为高优先级。 (5) PS为串行口中断的优先级设定位。PS=0,该中断源为低优先级; PS=1,该中断源为高优先级。 单片机复位时,IP被清零,所有中断源被默认为低优先级中断。在应用系统设计时,可以根据需要把所用中断源设置为高优先级或低优先级中断。 例5.2把定时器/计数器T0和串行口中断源设置为高优先级。 设置优先级的程序如下: IP=0x12; 或: PT0=1;//设置定时器/计数器T0为高优先级中断源 PS=1;//设置串行口为高优先级中断源 如果有多个相同优先级的中断源同时向CPU请求中断,这时CPU该如何应对呢?如图5.3所示,MCS51单片机的中断系统设立了一个硬件查询电路,由中断系统内部的查询顺序来确定CPU优先响应哪一个中断请求。优先级相同时,5个中断源的优先级由高到低排列顺序见表5.1。 表5.1优先级相同时的中断优先级排列顺序 序号 中断源 中断请求标志 优先级 1 外部事件中断INT0 IE0 2 定时器/计数器T0溢出中断 TF0 3 外部事件中断INT1 IE1 4 定时器/计数器T1溢出中断 TF1 5 串行口接收和发送中断 RI和TI 最高 最低 5.2.4MCS51中断响应及处理过程 在程序中设置了CPU的中断控制位和中断允许控制位以后,当中断源触发中断时,相应的中断标志位被置1。MCS51单片机的中断系统在每一个机器周期对所有中断标志位的状态进行采样,并在随后的一个机器周期查询这些中断标志,以确定哪一个中断源请求中断。如果中断系统检测到某个中断标志为1,则表明该中断源向CPU发出了中断请求。但是,MCS51单片机的CPU响应中断请求是有条件的,如果此时不存在下列3种情形,CPU将响应这个中断请求,立即产生一个硬件调用,使程序转移到相应的中断处理程序入口地址处调用中断处理程序,进行中断处理。3种情形如下。 (1) CPU正在处理相同优先级或高优先级的中断。 (2) 当前的机器周期不是指令的最后一个机器周期。 (3) 正在执行的指令是中断返回指令RETI或者是访问特殊功能寄存器IE或IP的指令。 CPU响应中断时,必须是在一条指令执行结束之后。另外,CPU执行RETI指令和对寄存器IE和IP访问的指令时,即使指令执行结束也不会立即响应,必须至少再执行一条指令方可响应中断请求。 对于有的中断源,CPU在响应时会自动清除中断请求标志,如外部事件中断INT0和INT1跳变触发方式时的中断请求标志IE0和IE1,定时器/计数器溢出的中断标志TF0和TF1。 CPU响应中断请求时,中断系统会根据中断源的优先级把相应的高优先级触发器或低优先级触发器置1,以封锁相同优先级和低级优先级的中断请求; 然后由硬件自动把当前程序计数器PC的内容(即断点)压入堆栈保护,并且把相应的中断处理程序入口地址装入程序计数器PC,使程序转移到中断处理程序。 中断处理程序是根据处理中断事件的预案而设计的应用程序,即某个中断触发以后需要完成哪些任务。MCS51单片机各中断源的中断处理程序入口地址是固定的,见表5.2。一旦CPU响应了某个中断请求,就会直接转到相应的入口地址去执行程序。 表5.2各中断源的中断处理程序入口地址和编号 序号中断源入 口 地 址中 断 编 号 1外部事件中断INT00003H0 2定时器/计数器T0溢出中断000BH1 3外部事件中断INT1 0013H2 4定时器/计数器T1溢出中断001BH3 5串行口接收和发送中断0023H4 MCS51单片机CPU的中断响应过程可用图5.9描述。 图5.9MCS51单片机CPU的中断响应过程 应用系统中只包含一个优先级中断源时,中断处理程序结构如图5.10所示。 值得注意的是,虽然CPU响应中断时,自动进行了置位高或低优先级触发器、保护断点、装入中断入口地址到PC等操作,但并没有关中断的操作。因此,应用系统包含高低优先级中断源时,为了防止高优先级中断响应干扰现场保护和恢复,中断嵌套程序设计时低优先级中断处理程序如图5.10(b)所示,而高优先级中断处理程序的结构则无须考虑低中断处理的干扰,其结构图为图5.10(a)。 图5.10中断处理程序结构 当包含多个相同优先级的中断源时,高、低优先级中断处理可采用图5.10的两种结构,但必须保证各个中断处理程序使用的单元、寄存器不冲突,除非有必要。 由第4章可知,在C51语言中,中断处理程序被作为一种特殊的函数——中断函数。由于中断函数既不传递参数,又没有返回值,其常用格式为: void 函数名(void) interrupt n using m { 函数体; } interrupt n指出中断源的编号(见表5.2),using m用来指定该中断函数所用的工作寄存器组,m为0~3。 中断处理程序被编译器编译产生目标代码时,会做如下处理。 (1) 根据中断源编号,自动生成跳转中断入口地址的指令。 (2) 生成保护现场的代码,实现ACC、B、DPH、DPL和PSW的内容的入栈保护。 (3) 如果中断函数没有用using属性指定该函数要使用的工作寄存器组,则生成保护所有工作寄存器的代码,把工作寄存器内容保护在堆栈中。如果使用using属性指定,则不产生代码。 (4) 生成恢复现场的代码,在退出中断函数之前,需要恢复保护在堆栈中的工作寄存器和特殊寄存器内容。 (5) 生成中断返回指令(RETI)代码 下面用一个定时器/计数器T0中断处理程序的例子来说明生成目标代码的原理。该函数使用了工作寄存器组3。为了便于说明,把语句所在行的行号标记在其左侧。C51语言源文件如下: 1extern bit alarm; 2int alarm_count; 3 4 5void falarm(void) interrupt 1 using 3 { 6 alarm_count *= 2; 7 alarm = 1; 8 } 编译后产生的代码文件为: ; FUNCTION falarm(BEGIN) 0000 C0E0 PUSHACC 0002 C0D0 PUSHPSW ;SOURCE LINE # 5 ;SOURCE LINE # 6 0004 E500 MOVA,alarm_count+01H 0006 25E0 ADDA,ACC 0008 F500 MOValarm_count+01H,A 000A E500 MOVA,alarm_count 000C 33 RLCA 000D F500 MOValarm_count,A ;SOURCE LINE # 7 000F D200 SETBalarm ;SOURCE LINE # 8 0011 D0D0 POPPSW 0013 D0E0 POPACC 0015 32 RETI ; FUNCTION falarm(END) 从生成的代码文件可以看出,编译后的目标代码由保护现场、中断处理、恢复现场和中断返回RETI几部分构成,同时生成了跳转到中断入口地址的指令。另外,由于指定了工作寄存器组,在代码中没有保护工作寄存器的代码。 在应用中断函数时应注意以下几点。 (1) 中断函数不能传递参数。如果想要中断函数有返回值,则该函数不能使用using属性,因为要返回的值是存放在工作寄存器中的,返回时要恢复到函数调用之前工作寄存器组,会导致错误的返回值。如果中断函数用工作寄存器传递参数,同样也不能使用using属性,因为中断函数切换工作寄存器组会丢失这些参数。例如在一个中断函数ISR1中调用函数FUN1,程序如下: void ISR1(void) interrupt 0 using 1 { 函数体; } 函数FUN1声明如下: void FUN1(void) { 函数体; } ISR1被指定使用工作寄存器区1,假设FUN1在编译时被默认使用工作寄存器区0,由于8051单片机没有工作寄存器到工作寄存器的传送指令。因此,编译器只能对此生成工作寄存器到存储器单元的传送指令。编译器可根据所用的工作寄存器区计算出它的8个工作寄存器的单元地址。例如,计算得到函数FUN1使用的工作寄存器区0的8个工作寄存器是0x00~0x07。如果所选的工作寄存器区不是0区,则该函数编译时可能会覆盖这些单元,导致传递的数据丢失,函数的运行结果不正确。为了保证中断函数正确调用FUN1函数,可使用registerbank编译指令指定FUN1使用工作寄存器区1,这样编译时在函数中不生成切换工作寄存器区的代码。 (2) 中断函数不能作为普通的自定义函数调用。直接调用中断过程是无意义的,中断函数退出时CPU执行了RETI指令,意味着CPU响应了一次无中断请求的中断处理,可能导致不可预料的执行结果。另外,也不能通过函数指针调用中断函数。 (3) 如果中断函数调用了其他函数,则被调用的函数所用工作寄存器须与中断函数一致。另外,在这种情况下,被调用的函数最好设置为可重入的,这是由于中断是随机的,应用程序运行时有可能会出现中断函数所调用的函数被嵌套调用的情形。其次,中断函数最好写在应程序尾部,且禁止使用extern存储类型说明,以防其他程序调用。 (4) 编译器编译时,进入中断函数,寄存器ACC、B、PSW会入栈保护,中断处理结束退出时这些寄存器内容会被从堆栈中恢复。如果有属性using n,在中断处理程序中,先对PSW内容入栈保护,再修改PSW中寄存器选择位指定中断处理程序所用的工作寄存器组。 (5) 如果应用系统使用了多个中断源,这些中断源的优先级相同,那么它们的中断函数可以共享同一个工作寄存器组,因为这些中断函数执行时不会被其他中断源的中断请求所中断。以此类推,在应用系统中存在不同优先级的中断源时,可以给具有相同中断优先级的所有中断函数分配给相同的工作寄存器区,这样可减少应用程序所需的工作寄存器区和存储空间。 5.3外部事件中断及应用◆ 5.3.1外部事件中断的响应时间 1. 触发方式 MCS51单片机的外部事件中断请求是通过INT0和INT1引脚引入的,通过软件设置触发方式,中断触发方式既可以为电平触发方式,也可以为跳变触发方式, 在使用外部事件中断源时,中断触发信号必须与触发方式协调一致,使产生中断触发信号的电路满足以下要求。 (1) 电平触发方式时,由于中断请求标志完全由引脚INT0或INT1的电平控制,虽然在每个机器周期中断系统都采样中断标志位的状态,但由于单片机只能在执行完一个指令后响应中断请求,因此,INT0或INT1引脚上的中断请求信号必须保持足够长的时间,直到中断实际发生为止; 否则,会丢失中断请求。在系统存在多级中断时,必须重视触发信号的有效时间。另外,中断触发信号低电平的维持时间也不能太长,在CPU响应中断,进入子程序后,即可撤除本次中断请求信号。 (2) 跳变触发方式时,在INT0或INT1引脚上的高电平和低电平保持时间必须不少于1个机器周期。由于CPU响应中断时,自动把中断请求标志清零,撤除了本次中断请求,因此,在设计时一般不考虑中断请求信号的撤除问题。 2. 中断响应时间 中断响应时间是指从中断请求标志位置1到CPU开始执行中断服务程序的第一条指令所持续的时间。CPU并非每时每刻都对每一个中断请求予以响应; 另外,不同的中断请求其响应时间也是不同的,因此,中断响应时间形成的过程较为复杂。本节以外部事件中断为例,说明MCS51单片机的中断响应所需的时间,以便在程序设计时能合理地估算程序的运行时间,进一步提升程序的运行效率。 1) 中断请求立即被CPU响应 CPU在每个机器周期采样INT0和INT1引脚上的电平,如果中断请求有效,则把相应中断请求标志位置位,然后在下一个机器周期再查询中断请求标志位的状态,这就意味着中断请求信号的低电平至少应维持一个机器周期。这时,如果满足中断响应条件,则CPU响应中断请求,在下一个机器周期执行硬件调用,使程序转入中断入口地址处。该调用指令执行时间是两个机器周期,因此,外部中断响应时间至少需要三个机器周期,这是最短的中断响应时间。 2) 中断响应条件不满足,中断请求没有被CPU立即响应 虽然中断触发,中断请求标志位被置1,但是由于中断响应的3个条件不能满足,响应被阻断,中断响应时间被延长,假如以下几种情形。 (1) 如果此时一个相同优先级或高优先级的中断正在处理执行,则附加的等待时间取决于正在执行的中断处理程序的执行时间。 (2) 如果正在执行的一条指令还没有到最后一个机器周期,则附加的等待时间为1~3个机器周期(因为指令最长的执行时间为4个机器周期: 乘法、除法指令)。 (3) 如果正在执行的指令是RETI指令或访问IE、IP的指令,则附加的等待时间在5个机器周期之内(最多用一个机器周期完成当前指令,再加上最多4个机器周期完成下一条指令)。 综上所述,如果系统中只有一个中断源,中断响应时间为3~8个机器周期。如果有多个中断或多级中断处理嵌套时,中断响应时间与相同优先级或高优先级的中断处理程序的执行时间有关。 5.3.2外部事件中断源的应用 1. 外部事件中断方法的选择 单片机应用系统需要处理大量的输入信号,那么,对这些信号处理时是采用查询方式还是采用中断处理方式呢?所谓查询就是让计算机不断地对输入信号进行检测、判断和处理。针对这个问题,应该从系统本身的要求出发,考虑以下两方面的因素。 (1) 考察应用系统对输入信号状态变化的反应快慢程度,如果应用系统的最大响应时间较小,那么,对输入信号最好采用中断方法。不管应用系统对输入信号的查询速度有多么迅速,其平均响应时间一般大于中断方法的响应时间。 (2) 考察输入信号状态变化的最小持续时间; 如果信号触发频率接近指令周期频率的1/10,那么,最好采用中断方法; 否则,查询时需要采用较小的查询循环。 除此之外,应用系统中有多个输入信号,每一个输入都要求用中断方法处理。对于这种情况,要么采用中断源共享的方法,使它们共享MCS51单片机仅有的两个中断源,要么从整个系统的设计要求出发,把其中的一些相对不重要的输入采用查询方式处理。 2. 外部事件中断的初始化及中断处理程序编程步骤 1) 中断系统初始化 在主程序对中断系统初始化时,需完成以下设置。 (1) 设置外部事件中断请求信号的触发方式。 ① 电平触发: ITx=0,x=0,1。由于单片机复位后,IT1和IT0被清零,默认为电平触发方式,因此,有时可以在程序中被省略。 ② 跳变触发方式:ITz=1,x=0,1。 (2) 开放CPU中断: EA=1。 (3) 设置外部事件中断允许控制位: EX0=1或EX1=1。 (4) 如果有中断嵌套处理,设置中断源的优先级。 ① 设置外部事件中断源为高优先级: PX0=1或PX1=1。 ② 设置外部事件中断源为低优先级: PX0=0或PX1=0。由于单片机复位后,IP被清零,默认所有中断源为低优先级,因此,有时在程序中被省略。 在主程序中,对中断系统初始化时,也可以采用下列形式设置中断允许控制位和中断源的优先级: IE=0x81; //开中断,开外部事件0中断 IP=0x01; //设置外部事件0中断源为高优先级 2) 中断处理程序编程 中断处理程序是根据处理外部事件的具体要求而设计的程序。C51语言有专门的中断函数。程序设计时,可以参考图5.10的结构。 3. 外部事件采用跳变触发方式请求中断 例5.3单片机应用系统如图5.11所示,P1口为输出口,外接8个指示灯L0~L7。系统工作时,指示灯L0~L7逐个被点亮。在逐个点亮L0~L7的过程中,当开关K被扳动时,则暂停逐个点亮的操作,L0~L7全部点亮并闪烁10次。闪烁完成后,从暂停前的灯位开始继续逐个点亮的操作。 图5.11例4.1单片机应用系统 为了实现开关K扳动1次仅在INT0引脚产生1次高电平到低电平的负跳变,用RS触发器设计了消除开关触点机械抖动的电路。K每扳动1次,产生1次中断请求,根据题意,设计的程序如下: (1) 主程序: #include<reg51.h> //头文件 #define DataPort P1//定义端口P1 unsigned char codedofly_DuanMa[8]={0x01,0x03,0x07,0x0f, 0x1f,0x3f,0x7f,0xff}; //逐个点亮显示码 unsigned char code dofly_10[2]={0xff,0x00};//全亮、全灭显示码 void Delay(unsigned int t);//延时函数声明 void Display(unsigned char Num); /*------------------------------------------------ 主函数 ------------------------------------------------*/ void Main(void) { unsigned int j; EX0 = 1;//允许外部中断INT0中断 IT0 = 1; //设置INT0中断源为跳变触发 EA = 1;//开放CPU中断 while(1) {//正常工作状态,逐个点亮LED j++; if(j==8)//显示位置 { j=0; //显示位置复位 } Display(j);//显示 } } (2) 延时子程序: /*------------------------------------------------ 延时函数,含有输入参数 unsigned int t,无返回值 unsigned int 是定义无符号整形变量,其值的范围是0~65535 ------------------------------------------------*/ void Delay(unsigned int t) { while(t--); } (3) 显示子程序: /*------------------------------------------------ 显示函数,Num表示显示位置 ------------------------------------------------*/ void Display(unsigned char Num) { DataPort=0;//全灭,消隐,防止有交替重影 DataPort=dofly_DuanMa[Num]; //取显示码并显示 Delay(50000); //状态维持 } (4) 中断处理程序: /******************************************************************** * 名称 : Outside_Int1() * 功能 : 外部中断0 的中断处理 * 输入 : 无 * 输出 : 无 *********************************************************************/ void Outside_Int1(void) interrupt 0 { unsigned char i; Delay(2); for(i=0;i<10;i++) {DataPort=dofly_10[0]; //取显示码,全亮 Delay(50000); //状态维持 DataPort=dofly_10[1]; //取显示码,全灭 Delay(50000); //状态维持 } Delay(30); } 4. 外部事件采用电平触发方式请求中断 例5.4如图5.12所示,P1.0~P1.3为输出,外接指示灯L0~L3,P1.7~P1.4为输入,外接开关K0~K3,欲采用外部中断控制方式实现按钮开关K0~K3分别控制指示灯L0~L3,按钮开关S每闭合一次,外部中断触发一次,程序改变一次指示灯的显示状态。 图5.12例5.4应用系统图 在图5.12中,当按键S每按动一次,在D触发器的CLK端产生一个正脉冲,D触发器翻转,Q端输出低电平并锁存,产生中断请求信号。由于电平触发时,CPU响应中断后,中断标志IE0并不能自动清除,需要用外部手段撤除中断请求信号,因此,在进入中断处理程序后,应通过软件撤除本次的中断请求信号,程序中P3.1为0时,D触发器的置位端S为1,使D触发器的Q输出高电平,撤除了本次中断请求。这样,下一次按动S时,可以触发新的中断。根据题意,程序如下: (1) 主程序: #include<reg51.h> sbit KEY0=P1^4;//定义按键K0输入端口 sbit KEY1=P1^5;//定义按键K1输入端口 sbit KEY2=P1^6;//定义按键K2输入端口 sbit KEY3=P1^7;//定义按键K3输入端口 sbit LED0=P1^0;//定义led0输出端口 sbit LED1=P1^1;//定义led1输出端口 sbit LED2=P1^2;//定义led2输出端口 sbit LED3=P1^3;//定义led3输出端口 sbit SetQ1=P3^1;//定义D触发器的S端,清除中断请求 sbit SetQ2=P3^2;//定义INT0端口 /*主函数 */ void Main(void) { EX0 = 1;//允许外部中断INT0中断 IT0 = 0;//设置INT0中断源为电平触发方式 EA = 1;//开放CPU中断 PX0= 0; //设置INT0中断源为低优先级 SetQ1=1; SetQ2=1; while(1) //主循环 {} } (2) 中断处理程序: /* 外部中断INT0 的中断处理 */ void Outside_Int1(void) interrupt 0 { SetQ1=0; //清除外部中断请求信号 LED0=!KEY0;//读入K0状态,控制LED0 LED1=!KEY1;//读入K1状态,控制LED1 LED2=!KEY2;//读入K2状态,控制LED2 LED3=!KEY3;//读入K3状态,控制LED3 SetQ1=1; //复位D触发器 } 对于跳变触发的外部中断INT0或INT1,CPU在响应中断后由硬件自动清除其中断标志位IE0或IE1,无须采取其他措施。而采用电平触发时,中断请求撤除方法较复杂。因为电平触发时,CPU在响应中断后,硬件不会自动清除IE0或IE1,也不能用软件将其清除,它是由INT0或INT1引脚上外部中断请求信号直接决定的。所以,在CPU响应中断后,必须立即撤除INT0或INT1引脚上的低电平。否则,就会引起重复中断。 在图5.12中,用开关S闭合的事件触发外部中断,当S闭合时,在触发器的输入端CLK产生一个正脉冲,请求信号不直接加在INT0引脚上,而是加在D触发器的CLK端。由于D端接地,当外部中断请求的正脉冲信号出现在CLK端时,Q端输出为0并锁存,INT0为低,外部中断向单片机发出中断请求。CPU响应中断请求后,进行中断处理,在中断处理程序中用软件来撤除外部中断请求。“SetQ1=0”使P3.1为0,使D触发器输出置位,Q端输出为1,从而撤除中断请求。而“SetQ1=1”使P3.1变为1,其目的是使D触发器的输出Q受CLK控制,新的外部中断请求信号能够向CPU再次申请中断。语句“SetQ=1”是必不可少的; 否则,将无法再次形成新的外部中断。 5. 同时使用两个外部中断源 例5.5单片机应用系统如图5.13所示,P1口为输出口,外接8个指示灯L0~L7。要求实现下面的要求: 图5.13同时使用两个外部中断源的单片机应用系统 (1) 系统工作时,指示灯L0~L7以3个指示灯为一组循环显示。 (2) 当S1按下时,暂时中断3灯循环方式,熄灭全部指示灯,从指示灯L0开始逐个点亮并保持,直至L0~L7全部点亮,然后熄灭,重复上述过程5次后退出,继续3灯循环显示模式。 (3) 当S2按下时,暂时中断3灯循环方式,全部指示灯L0~L7闪烁显示10次后退出,继续3灯循环显示模式。 在本例中,S1和S2具有相同的中断优先级,当两个按钮同时按下时,优先响应S1的请求; 正在处理其中一个时,不会响应另外一个。根据题目要求,同时使用两个外部中断源的程序如下: (1) 主程序: #include<reg51.h> #define DataPort P1 //定义P1口代号为DataPort unsigned char code dofly_DuanMa[8]={0x07,0x0e,0x1c,0x38, 0x70,0xe0,0xc1,0x83};//正常工作方式时的LED显示控制码 unsigned char code dofly_S1[2]={0xff,0x00};//工作方式1的显示控制码 unsigned char code dofly_S0[9]={0x00,0x01,0x03,0x07, 0x0f,0x1f,0x3f,0x7f,0xff};//工作方式2的显示控制码 void Delay(unsigned int t); //函数声明 void Display(unsigned char Num); /*主函数 */ void Main(void) { unsigned int j=0; EX0 = 1;//允许外部中断INT0中断 EX1 = 1;//允许外部中断INT1中断 IT0 = 1;//设置INT0中断源为跳变触发方式 IT1 = 1;//设置INT1中断源为跳变触发方式 EA = 1;//开放CPU中断 IP=0; while(1) //正常工作方式 { j++; if(j==8)//LED显示位置 { j=0; //复位LED显示位置 } Display(j);//显示 } } (2) 延时子程序: /*延时函数,t——延时参数 */ void Delay(unsigned int t) { unsigned char t0; while(t--) { for(t0=0;t0<255;t0++); } } (3) 显示子程序: /* LED显示函数,Num为显示位置 */ void Display(unsigned char Num) { DataPort=0; //消隐 DataPort=dofly_DuanMa[Num]; //LED显示 Delay(100); //LED显示状态维持 } (4) INT0中断源的中断处理程序: /*外部中断INT0 的中断处理——工作方式1 */ void Outside_Int1(void) interrupt 0 { unsigned char i; unsigned char j; for(j=0;j<5;j++)//8个LED逐个点亮,循环5次 { for(i=0;i<9;i++) { DataPort=dofly_S0[i]; //取LED显示码显示 Delay(100); //LED显示状态维持 } } } (5) INT1中断源的中断处理程序: /* 外部中断INT1 的中断处理——工作方式2 */ void Outside_Int2(void) interrupt 2 { unsigned char i; for(i=0;i<10;i++); //亮、暗交替10次 { DataPort=dofly_S1[0]; //全亮 Delay(100); // DataPort=dofly_S1[1]; //全灭 Delay(100); // } } 6. 两级中断嵌套处理 例5.6单片机应用系统如图5.13所示,P1口为输出口,外接8个指示灯L0~L7。要求实现如下要求。 (1) 系统工作时,L0~L7以3个指示灯为一组循环显示。 (2) 当S1按下时,暂时中断3灯循环方式,熄灭全部指示灯,从L0开始逐个点亮并保持,直至L0~L7全部点亮,然后熄灭,重复上述过程5次后退出,继续3灯循环显示模式。 (3) 不论在(1)和(2)哪种运行方式下,只要S2按下,暂时中断当前的显示方式,全部指示灯闪烁显示10次后退出,继续运行以前的显示方式。 在本例中,设置按钮S2产生的中断请求为高优先级的,任何时候只要S2按下,必须立即响应这个中断请求,此时需要设置INT1中断源的优先级为高优先级,即PX1=1。因此,将例5.5程序中的IP=0语句改为IP=0x04,其他代码不变,就可实现两级中断嵌套处理的要求。 5.3.3外部事件中断源的扩展 如果系统中有多个外部事件,可以采用中断源共享的方法,使多个中断源共同使用MCS51单片机的两个外部事件中断源。 例5.7电梯是大型建筑不可缺少的运输工具。在运行过程中,有以下几种情况需要控制系统立即处理。 (1) 当测速传感器检测到电梯超过额定运行速度时,控制系统应立即切断控制回路电源。 (2) 当电梯运行到接近底层和顶层时,安装在电梯轿箱上的撞弓装置撞击到强迫减速开关时,控制系统应强制电梯减速运行。 (3) 强制减速后仍然不能停车,当上限或下限限位开关有效时,应切断整个系统的电源。 (4) 当发生意外情况时,按下紧急停止按钮,电梯紧急制动停车。 (5) 当电路欠压时或电网电压波动时,为了避免控制回路误动作,应切断控制回路电源。 (6) 曳引电机过载时,应进行过载保护,切断控制回路电源。 因为电梯是载人和运货的工具,从(1)~(6)的紧急程度和事故后果来看,(3)的紧急程度最高,(2)次之,其他情况的紧急程度排列顺序依次为: (1),(5),(6),(4)。若采用中断方式处理这些事件,必须进行中断源的扩展以共享单片机的两个外部中断源,中断源扩展电路如图5.14所示。图5.14中,所有中断采用电平触发形式,中断请求信号一直保持,以确保中断处理的实现,除非控制系统自行撤除中断请求信号,中断处理才会终止。上/下限限位开关闭合触发的事件中断由INT0引入,该中断源的优先级最高,不论在何种情况下,只要上/下限限位开关闭合,CPU立即响应。其余几个中断源由INT1引入,通过与门把它们综合,共享MCS51单片机的外部事件中断INT1,它们的状态分别由P1.0~P1.4反馈到单片机,通过程序查询它们的状态来判别哪一个事件触发了中断,然后再进行相应的中断处理。程序查询的先后顺序由这些事件的紧急程度(即优先级)确定,其中优先级最高的,程序首先查询,优先级最低的,程序最后查询。 图5.14外部事件中断源的扩展电路 根据上述要求和分析,给出电梯控制系统多中断处理的主要程序的实现方法如下: EX0 = 1;// EX1 = 1;// IT0 = 1;//设置INT0中断源为跳变触发方式 IT1 = 1;//设置INT1中断源为跳变触发方式 EA = 1;// IP=0x04;// (1) 主程序: #include<reg51.h> sbitP14=P1^4 sbitP13=P1^3 sbitP12=P1^2 sbitP11=P1^1 sbitP10=P1^0 /*---------------------------主函数---------------------------------*/ void main(void) { IT0 =0;//设置INT0中断源为电平触发方式 IT1 =0;//设置INT1中断源为电平触发方式 EA = 1;//开放CPU中断 EX0 = 1;//允许外部中断INT0中断 EX1 = 1;//允许外部中断INT1中断 PX0 = 1;//设置INT0中断源优先级为高优先级 PX1 =0;//设置INT1中断源优先级为高优先级 while(1)//正常工作方式 { 主处理程序; } } (2) INT0中断处理程序: /* 外部中断INT0 的中断处理*/ void Outside_Int1(void) interrupt 0 { 切断系统电源控制程序; } (3) INT1中断处理程序: /* 外部中断INT0 的中断处理*/ void Outside_Int2(void) interrupt 2 { if(P14==0){转强制换速处理程序;} else if(P13==0){失速处理程序;} else if(P12==0){电源故障处理程序;} else if(P11==0){电机过载处理程序;} else if(P10==0){急停按钮处理程序;} } 5.4本章小结◆ 在CPU执行程序的过程中,由于某种原因要求CPU暂时停止正在执行的程序,转去执行相应的处理程序,待处理结束后,再返回到暂停处继续执行,这个过程称为中断。 CPU响应中断请求调用中断处理程序的过程与主程序调用子程序的主要区别在于: 子程序调用是用户设计程序时事先安排好的,采用子程序调用指令实现的; 而中断事件发生是随机的,调用中断处理程序的过程是由硬件自动完成的。 MCS51单片机具有5个中断源: 两个外部事件中断(INT0和INT1)、两个定时器/计数器中断和一个串行口中断。它们可以设为两个中断优先级,实现两级中断嵌套。CPU对中断采用两级管理,用户可以根据需要来设定CPU是否开放中断,而且每个中断源都可以独立地设定为允许和禁止中断请求。另外,中断源的优先级也可以独立地设定为高或低优先级。 MCS51单片机的CPU响应中断请求是有条件的,如果此时不存在下列3种情形。 (1) CPU正在处理相同优先级或高优先级的中断。 (2) 当前的机器周期不是指令的最后一个机器周期。 (3) 正在执行的指令是中断返回RETI或者是对寄存器IE或IP的写入操作指令。 那么,CPU立即响应这个中断请求,直接转移到相应的中断处理程序入口地址处,进行中断处理。 MCS51单片机的外部事件中断的请求(触发)信号由INTx(INT0或INT1)引脚引入单片机的中断系统,中断触发方式可以为电平触发方式或跳变触发方式,通过编程设置TCON中的控制位IT0和IT1实现。 若外部事件中断为电平触发方式时,INTx引脚的低电平必须保持到CPU响应该中断时为止,并且必须在本次中断处理返回以前变为高电平,以撤除本次中断请求信号; 否则,如果中断请求信号没有撤除,中断返回后又再次响应该中断,CPU将陷入无休止的中断响应和中断处理当中。外部事件中断为跳变触发方式时,在INTx引脚上出现负跳变,则硬件把中断请求标志IE0或IE1置位,发出中断请求。CPU响应中断时,自动把中断请求标志清零,撤除本次中断请求。 中断系统应用时,必须对中断系统初始化,设置中断请求信号的触发方式、中断允许控制位、中断源的优先级等。中断处理程序是根据处理外部事件的具体要求而设计的程序,实现中断嵌套处理时,虽然高优先级中断源可以中断低优先级的中断处理,但不能干扰低优先级的现场保护和恢复。 5.5复习思考题◆ 一、 选择题 1. 在计算机系统中,中断系统是指()。 A. 实现中断处理的硬件电路B. 实现中断处理的程序 C. A和BD. 触发中断的事件 2. 中断处理程序是()。 A. 用户编写的处理事件的应用程序B. CPU内部嵌入的硬件程序 C. 被中断停止执行的程序D. 查询中断是否触发的程序 3. MCS51单片机的中断系统的中断源有()。 A. 5个B. 6个C. 2个D. 3个 4. MCS51单片机禁止和允许中断源中断使用的寄存器是()。 A. TCONB. PSWC. IPD. IE 5. MCS51单片机设定中断源优先级使用的寄存器是()。 A. TCONB. PSWC. IPD. IE 6. 外部事件中断源INT0请求中断时,登记该中断请求标志的寄存器是()。 A. SCONB. PSWC. TCOND. EX0 7. 下面哪种设置,可以使中断源INT1以跳变方式触发中断?() A. IT0=1B. IT0=0C. IT1=1D. IT1=0 8.单片机的串行口接收到一帧数据后,登记标志位TI=1的寄存器是()。 A. SCONB. PSWC. TCOND. SBUF 9. 在电平触发方式下,中断系统把标志位IE1置1的前提是: 在INT1引脚上采集到的有效信号是()。 A. 高电平B. 低电平 C. 高电平变为低电平D. 低电平变为高电平 10. 在跳变触发方式下,中断系统把标志位IE0置1的前提是: 在INT0引脚上采集到的有效信号是()。 A. 高电平B. 低电平 C. 高电平变为低电平D. 低电平变为高电平 11. MCS51单片机定时器/计数器T0溢出时,被置1的标志位是()。 A. IE0B. RIC. TF0D. TF1 12. 下列中断源请求中断被响应后,其中断请求标志位被自动清零的是()。 A. INT0以电平方式触发中断B. INT0以跳变方式触发中断 C. 串行口发送完一帧数据D. 定时器/计数器T0计数溢出 13. 在MCS51单片机中,CPU响应中断后,需要外电路实现中断请求清除的是()。 A. 定时器/计数器T1溢出触发的中断 B. INT0以跳变方式触发的中断 C. 串行口接收到一帧数据触发的中断 D. INT1以电平方式触发的中断 14. 在MCS51单片机中,CPU响应中断后,需要用软件清除中断请求标志的是()。 A. 定时器/计数器T1溢出触发的中断 B. INT0以跳变方式触发的中断 C. 串行口接收到一帧数据触发的中断 D. INT1以电平方式触发的中断 15. 如果IP内容为0010100B,则中断源优先级最高的是()。 A. INT0B. 串行口 C. 定时器/计数器T1D. INT1 16. 外部事件1对应的中断处理程序入口地址为()。 A. 0003HB. 000BHC. 0013HD. 001BH 17. 单片机应用系统使用了外部事件中断源INT0,拟采用跳变触发方式,下面设置指令不正确的是()。 A. IT0=0B. IT0=1 C. TCON=0x11D. TCON=0x01 18. 在单片机应用系统中,拟用外部事件中断源INT0和定时器/计数器溢出T1中断源,下面设置不正确的是()。 A. IE=0x89B. IP=0x89 C. IE=0x9bD. EA=1, EX0=1, ET1=1; 19. 应用系统使用了3个中断源: INT0、定时器/计数器T1和串行口,优先级顺序为定时器/计数器T1、串行口、INT0,下面设置正确的是()。 A. IP=0x11B. IP=0x18C. IE=0x01D. IP=0x08 20. 初始化时,禁止CPU中断和INT1程序是: A. EA=0;B. IE=0x84;C. IP=0x81;D. PX1=0; 二、 思考题 1. 在计算机系统中,什么是中断、中断源、断点和中断处理? 2. 在计算机系统中,中断处理和子程序调用有什么不同? 3. MCS51单片机提供了哪几种中断源?在中断管理上如何控制?各个中断源中断优先级的高低如何确定? 4. MCS51单片机响应中断的条件是什么? 5. MCS51单片机的CPU响应多个中断请求时,如何处理多个中断同时请求的问题? 6. MCS51单片机是如何分配中断处理程序入口地址的? 7. 简述MCS51单片机的中断响应过程。 8. 在应用系统中只包含一个优先级的中断处理时,给出中断处理程序的一般结构。 9. 如果应用系统包含了两个优先级的中断处理,高、低优先级的中断处理程序结构有什么不同? 10. 对于输入信号检测来说,中断处理方式和程序查询方式有什么不同? 三、 程序设计 1. 在图5.11电路中,通常情况下,L0~L7依次循环显示,每扳动一次开关K,L0~L7以两灯为1组循环显示1次。用中断方式实现上述要求。 2. 如图5.15所示,P1.0~P1.3为输出,外接指示灯L0~L3,P1.7~P1.4为输入,外接开关K0~K3,欲采用外部中断控制方式实现按开关K0~K3闭合状态分别控制指示灯L0~L3的状态,外部中断每触发一次,程序改变1次指示灯的显示状态。要求用跳变触发方式。 图5.15习题2应用系统原理图 3. 如图5.16为一个应用系统,单片机通过P1口与智能传感器相连,STB为传感器输出的选通信号,传感器每从DB输出一个7位二进制数据后(最高位是0),就从STB输出一个负脉冲,8051单片机读取的数据存储在内部RAM中,如果读取的数据超过7位(最高位为1)的次数超过20次,则终止从传感器读数。采用中断方式实现数据接收功能。 4. 路灯控制器如图5.17所示,夜晚路灯L1自动启动,白天路灯L1自动熄灭。采用中断方式实现路灯的自动控制。图5.17中,VL为光敏三极管,有光照射时,VL导通,无光照射时,VL截止。 图5.16习题3应用系统原理图 图5.17习题4的路灯控制器图 5. 图5.18为单片机应用系统,4个外部扩展中断源EXINT0~EXINT3共享外部事件中断INT0,当其中有一个或几个出现高电平时向单片机发出中断请求。设它们的优先级顺序为EXINT0→EXINT3,中断源EXINT0~EXINT3的中断处理程序分别为PREX0,PREX1,PREX2和PREX3,请用中断方式实现上述要求。 图5.18习题5的单片机应用系统原理图 6. 一个控制系统中有5台外围设备需要集中监控,出现故障时需要立即处理,设备1~5的故障状态信号分别为EX1~EX5,其中,设备1和设备2的故障危害性大,设备3~设备5的故障为一般性故障,危害较小。请用MCS51单片机中断方式实现上述设备的监控,设计电路并编程,设相应的中断处理子程序为Ex1Pro~Ex5Pro。 7. 单片机应用系统如图5.19所示,P1口外接8个指示灯L0~L7。要求实现下面的要求。 (1) 一般情况下,指示灯L0~L7以100ms的间隔闪烁。 (2) S0,S1,S2为3种显示模式,当S0,S1,S2被按下时,暂时中断闪烁方式,熄灭全部指示灯,进入相应的显示模式: ① 当按下S0时,从指示灯L0开始逐个点亮并保持200ms,直至L0~L7全部点亮,然后熄灭,重复上述过程10次后退出。 ② 当按下S1时,从指示灯L0开始,每个点亮200ms后熄灭,重复上述过程10次后退出。 ③ 当按下S2时,从指示灯L7开始以3个为一组点亮并保持,直至L7~L0全部点亮,然后熄灭,重复上述过程10次后退出。 图5.19习题7的单片机应用系统原理图 8. 在图5.20单片机应用系统中,A,B两路检测信号分别从P3.2(INT0)和P3.3(INT1)引入单片机,通常情况下,当A,B为高电平时,表示系统工作正常,指示灯L1亮; 当A出现低电平时,指示灯L1灭,L2以500ms的间隔闪烁,除非A再次变为高电平,系统恢复正常。无论在什么情况下,只要B出现低电平,关闭指示灯L1,L2以200ms的间隔闪烁,同时蜂鸣器BUZ以200ms的间隔鸣叫,除非B再次变为高电平,系统恢复正常。采用中断方式实现以上监控功能。 图5.20单片机应用系统原理图