1、6-1,中断的应用,第六章,6-2,6-3,6-4,本章内容,6-5,6.1 认识8051的中断,中断(interrupt)是暂时放下目前所执行的程序,先去执行特定的程序(即中断子程序),待完成特定程序后,再返回执行刚才放下的程序。比如说,老师正在讲课,而同学有疑问,随时可以举手发问,老师将立即停止讲课,先为同学解惑,再继续刚才暂停的课程,这样的动作就是“中断”。,6-6,好端端的干嘛中断?就是为了提高效率!中断能提高效率?试想若不立即提出问题并立即得到解答,待老师下课,这位同学早就忘光了,同时也失去了兴趣!当然,老师也不能整天待在教室,课也不上,大家大眼瞪小眼,等待同学提问题!所以,以“中断
2、”的方式,既能保证上课进度,又能兼顾同学的需求,当然效率比较高!,6-7,6.1.1 MCS-51的中断,8051提供5个中断服务,即外部中断INT0、外部中断INT1、定时器/计数器中断T0、定时器/计数器中断T1、串口中断UART(RI/TI),如下图所示。,MCS-51中断控制系统,6-8,8052提供6个中断服务,除了8051提供的5个中断外,还包括第三个定时器/计数器(Timer 2)中断。中断大致可分为以下三类: 外部中断 定时器/计数器中断 串行口中断,6-9,6-10,Port 3 的其它功能,6-11,外部中断 外部中断有INT0与INT1两个,CPU通过INT0引脚(即12
3、脚,也就是P3.2复用引脚)及INT1引脚(即13脚,也就是P3.3复用引脚)即可接受外部中断的请求。 外部中断信号的采样方式可分为电平触发(低电平触发)及边沿触发(负边沿触发)两种。若要采用电平触发,需要将TCON寄存器中的IT0(或IT1)设定为0,则只要INT0引脚(INT1引脚)为低电平,即视为外部中断请求。若要采用边沿触发,需要将TCON寄存器中的IT0(或IT1)设定为1,则只要INT0引脚(INT1引脚)的信号由高电平转为低电平,即视为外部中断请求。,6-12,外部中断 这些中断请求将反应在IE0(或IE1)里,若IE寄存器的EX0(或EX1)=1,且EA=1,CPU将进入该中断
4、的服务。至于中断优先级寄存器(IP寄存器),只是安排多个中断发生时中断服务执行的顺序而已,若只有一个中断,将不会有所影响。,6-13,定时器/计数器中断 定时器/计数器中断有T0与T1两个(8052则还有T2)。若是定时器,CPU将对内部的时钟脉冲计数,而提出内部中断;若是计数器,CPU将对外部的脉冲计数,而提出内部中断。 至于外部脉冲的输入,则是通过T0引脚(即14脚,也就是P3.4复用引脚)及T1引脚(即15脚,也就是P3.5复用引脚) 。 关于定时器/计数器,将在下一章进行详细介绍。,6-14,串行口中断 串行口中断(UART)有RI与TI两个,CPU通过RxD引脚(即10脚,也就是P3
5、.0复用引脚)及TxD引脚(即11脚,也就是P3.1复用引脚)要求接收(RI) 中断请求或传送(TI) 中断请求。 关于串行口,将在后续章节进行详细介绍。,6-15,中断工作过程 当中断发生时,CPU将暂停当时所执行的程序,立即按中断的种类执行其中断向量。例如INT0中断时,程序将跳到03H地址(INT0的中断向量),而03H地址可能只有一个命令,也就是跳到该中断的服务程序的地址。当中断子程序执行完毕后,即可返回主程序,继续执行刚才中断时的下一个指令,如下图所示。,6-16,中断流程,6-17,6.1.2 中断启用寄存器IE,如下图所示,我们可将中断启用寄存器IE看作开闭中断功能的开关。实际上
6、,IE寄存器是一个8位的可位寻址的寄存器。,MCS-51中断控制系统,6-18,IE寄存器,6-19,6.1.3 中断优先级寄存器IP,中断优先级寄存器IP是判断各中断优先级的开关。实际上,IP寄存器是一个8位的可位寻址的寄存器,其中各位如下图所示。,6-20,IP寄存器,6-21,在此特将IE寄存器也放在上面,直接与IP寄存器比较,我们将可以发现其中各位几乎是相对应的!所以记住了IE寄存器,也就记住了IP寄存器!,MCS-51中断控制系统,6-22,自然优先等级,很明显,上图中IP寄存器只是决定中断属“高优先级”族群,还是“低优先级”族群而已。 原本各个中断已有先后之分,其顺序如右图所示。,
7、6-23,如上图所示,若都没有在IP寄存器里设定优先级,则中断的优先级为“INT0T0INT1T1RI/TIT2”;若将其中任何一个中断设为高优先级,例如让T1=1,则中断优先级变为“T1 INT0T0INT1RI/TIT2”;若让T1=1,INT1=1,则中断优先级变为“INT1T1 INT0T0RI/TIT2”,以此类推。 简单讲,就是“优先级较低者站一边等”。,6-24,在不同优先等级下,程序执行的流程,6-25,在不同优先等级下,程序执行的流程,6-26,6.1.4 定时器/计数器控制寄存器TCON,在定时器/计数器控制寄存器TCON里,有部分设定与外部中断信号的采样方式有关。实际上,
8、TCON寄存器是一个8位的可位寻址的寄存器,其中各位如下图所示。 其中IT0与IT1分别为INT0与INT1的采样信号设置位,若要采用负边沿触发信号,则可将它设定为1;若要采用低电平触发信号,则可将它设定为0。IE0与IE1两个位是由CPU所操作的中断标志位,当中断发生时,将被设定为1;结束中断时,将恢复为0。,6-27,TCON寄存器,6-28,6.1.5 中断向量,当发生中断时,程序将跳至其对应的中断向量地址,执行该位置上的程序。对于C语言程序,可以不必知道其真实地址,程序设计者只要知道发生中断时,将会执行其中的中断子程序即可。 当然,在中断子程序的定义上,必须明确定义该中断子程序属于哪个
9、中断的中断子程序。,6-29,8x51/8x52中断向量表,6-30,6.1.6 中断的应用,中断的应用,包括中断向量的设置以及中断子程序的编写,说明如下。 中断设置中断的设置包括开启中断开关(即IE寄存器的设定)、中断优先级的设定(即IP寄存器的设定)、中断信号的设定(即TCON寄存器的设定)等。我们可在程序里直接设定IE寄存器、IP寄存器及TCON寄存器,例如要开启“总开关”、“INT0开关”,可以使用以下命令。,6-31,中断设置,6-32,中断子程序,中断子程序与子函数的结构类似,不过中断子程序不能传入自变量或传出自变量。而且使用中断子程序之前不需要声明,但需要在主程序中进行中断的相关
10、设置。 从中断子程序的第一行就可以看出它与一般子函数程序的不同,其格式如下所示:,6-33,对其中的各项说明如下: 由于中断子程序并不能传入自变量或传出自变量。所以在其左边标识“void”,在中断子程序名称右边括号里也标识“void” 。 中断子程序的命名只要是符合规定的字符串即可。 interrupt右边标示中断编号,Keil C提供031等32个中断编号,8051只使用04, 8051则使用05。,6-34,using右边标示中断子程序里所使用的寄存器组。8051内部有4组寄存器组,即RB0RB3。通常主程序使用RB0,根据需要在子程序里使用其他寄存器组,以避免数据的冲突。若不指定寄存器组
11、,则可省略本项目。 然后在接下来的一对大括号内,编写中断子程序的内容。,6-35,寄存器组,6-36,中断子程序,6-37,函数程序基本结构,6-38,子函数程序基本结构,传入自变量,6-39,函数与中断子程序区别,函数(function)、中断子程序都属于子程序。 函数使用前需要声明,中断子程序不需要声明。 函数能传入自变量,传出自变量。 中断子程序并不传递参数,也不返回值。,6-40,确定对话框,6.2 中断子程序的仿真,6-41,中断系统对话框,6-42,外部中断INT0控制LED,6-43,用外部中断INT0测量负脉冲计数,试题2:P1口接八个共阳的LED,初始为全灭,要求当按键按下时
12、(P3.2下降沿时),8只LED显示按键被按下次数的二进制值。 (要求用中断法实现),6-44,用外部中断INT0控制数码管加计数,6-45,用两个外部中断控制7段LED数码管,实现加减计数,6-46,实例演练6-4-1,INT0实验,6-47,6-3-1 目 标,主程序正常执行时,P1所连接的八个LED将闪烁。 按INT0按钮开关,则进入中断状态,P1所连接的八个LED将变成单灯左移,而左移3圈(从最左边到最右边为1圈)后,恢复中断前的状态,程序将继续执行八灯闪烁的功能。,6-48,INT0实验电路图,6-49,流程图,6-50,ch06-3-1.c_1,6-51,ch06-3-1.c_2,
13、6-52,思考一下!,在本实验里,若希望中断时,这八个LED变成是霹雳灯,来回各三圈,才返回主程序,程序应如何更改?,6-53,实例演练6-4-2,INT1实验,6-54,6-3-2 目 标,主程序正常执行时,七段显示器将从0开始正数到9(循环),每0.5秒增加1。 按INT1按钮开关,则进入中断状态,则七段显示器将从9开始闪烁倒数到0(一圈后结束中断),每0.5秒减少1。,6-55,INT1实验电路图,6-56,流程图,6-57,ch06-3-2.c_1,6-58,ch06-3-2.c_2,6-59,切换为INT1中断,6-60,思考一下!,在本实验的仿真中,若要在输出口里看到0、1、29的
14、变化,而非09的七段显示器驱动信号,应如何修改程序? 若在本实验的电路里,将原本的共阳极七段显示器,改采用共阴极七段显示器,则程序应如何更改?,6-61,实例演练6-4-3,两个外部中断实验,6-62,6-3-3 目 标,主程序正常执行时,P1所连接的八LED将闪烁。 按INT0按钮开关,则进入INT0中断状态,P1所连接的八个LED将变成单灯左移,而左移3圈(从最左边到最右边为1圈)后,恢复中断前的状态,程序将继续执行八灯闪烁的功能。 按INT1按钮开关,则进入INT1中断状态,P1所连接的八个LED将变成单灯右移,而右移3圈(从最左边到最右边为1圈)后,恢复中断前的状态,程序将继续执行八灯
15、闪烁的功能。 单灯左移(INT0)中断的优先级较单灯右移(INT1)中断的优先级高。,6-63,两个外部中断实验电路图,6-64,流程图,6-65,ch06-3-3.c_1,6-66,ch06-3-3.c_2,6-67,ch06-3-3.c_3,6-68,思考一下!,在本实验里,“IP=0x01”表示之中断优先级较高,则进行调试/仿真时,先中断,LED由右而左3圈;若还没结束之前,启动INT1中断,将会有么变化?同样地,先INT1中断,LED由左而右3圈;若还没结束INT1之前,启动中断,将会有么变化?请记录在实习报告里。 若希望INT1中断的优先等级高于程序中断的优先等级,应如何修改?修改完成后,再进行一次第1题的实验,并记录在实习报告里。,6-69,实例演练6-4-4,键盘中断实验,6-70,键盘中断实验电路图,6-71,流程图,6-72,ch6-3-4.c_1,6-73,ch6-3-4.c_2,6-74,思考一下!,在本实验里,有没有“抖动”的困扰? 在本实验里,若按住按键不放,会怎样?,例說89S51-C語言,6-75,2019/3/21,中断的应用,Bye Bye,