51单片机中断系统结构
地址只间隔了8个单元,如0003-000B,在如此少的空间中如何完成中断程序呢?很简单,你在中断处安排一个LJMP指令,不就能把中断程序跳转到任何地方了吗?一个完整的主程序看起来应该是这样的: ORG 0000HLJMP START ORG 0003H LJMP INT0 ;转外中断0ORG 000BH RETI ;没有用定时器0中断,在此放一条RETI,万一 “不小心“产生了中断,也不会有太大的后果。。 中断程序完成后,一定要执行一条RETI指令,执行这条指令后,CPU将会把堆栈中保存着的地址取出,送回PC,那么程序就会从主程序的中断处继续往下执行了。注意:CPU所做的保护工作是很有限的,只保护了一个地址,而其它的所有东西都不保护,所以如果你在主程序中用到了如A、PSW等,在中断程序中又要用它们,还要保证回到主程序后这里面的数据还是没执行中断以前的数据,就得自己保护起来。 中断系统的控制寄存器: 中断系统有两个控制寄存器IE和IP,它们分别用来设定各个中断源的打开/关闭和中断优先级。此外,在TCON中另有4位用于选择引起外部中断的条件并作为标志位。 1.中断允许寄存器--IE IE在特殊功能寄存器中,字节地址为A8H,位地址(由低位到高位)分别是A8H-AFH。 IE用来打开或关断各中断源的中断请求,基本格式如下图二所示: EA:全局中断允许位。EA=0,关闭全部中断;EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。 ×:无效位。 ES:串行I/O中断允许位。ES=1,打开串行I/O中断;ES=0,关闭串行I/O中断。 ETl;定时器/计数器1中断允许位。ETl=1,打开T1中断;ETl=O,关闭T1中断。 EXl:外部中断l中断允许位。EXl=1,打开INT1;EXl=0,关闭INT1。 ET0:定时器/计数器0中断允许位。ET0=1,打开T0中断;ET0=0,关闭TO中断。 EXO:外部中断0中断允许位。Ex0=1,打开INT0;EX0=0,关闭INT0. 中断优先寄存器--IP: IP在特殊功能寄存器中,字节地址为B8H,位地址(由低位到高位)分别是B8H一BFH,IP用来设定各个中断源属于两级中断中的哪一级,IP的基本格式如下图三所示: ×:无效位。 PS:串行I/O中断优先级控制位。PS=1,高优先级;PS=0,低优先级。 PTl:定时器/计数器1中断优先级控制位。PTl=1,高优先级;PTl=0,低优先级。 Pxl:外部中断1中断优先级控制位。Pxl=1,高优先级;PXl=O,低优先级。 PT0:定时器/计数器o中断优先级控制位。PT0=1,高优先级;PTO=0,低优先级。 Px0:外部中断0中断优先级控制位。Px0=1,高优先级;Px0=0,伤优先级。 在MCS-51单片机系列中,高级中断能够打断低级中断以形成中断嵌套;同级中断之间,或低级对高级中断则不能形成中断嵌套。若几个同级中断同时向CPU请求中断响应,则CPU按如下顺序确定响应的先后顺序: INT0一T0---INT1一T1一RI/T1. 中断的响应过程 若某个中断源通过编程设置,处于被打开的状态,并满足中断响应的条件,而且①当前正在执行的那条指令已被执行完 1、当前末响应同级或高级中断 2、不是在操作IE,IP中断控制寄存器或执行REH指令则单片机响应此中断。 在正常的情况下,从中断请求信号有效开始,到中断得到响应,通常需要3个机器周期到8个机器周期。中断得到响应后,自动清除中断请求标志(对串行I/O端口的中断标志,要用软件清除),将断点即程序计数器之值(PC)压入堆栈(以备恢复用);然后把相应的中断入口地址装入PC,使程序转入到相应的中断服务程序中去执行。 各个中断源在程序存储器中的中断入口地址如下: 中断源 入口地址 INT0(外部中断0) 0003H TF0(TO中断) 000BH INT1(外部中断1) 0013H TFl(T1中断) 001BH RI/TI(串行口中断) 0023H 由于各个中断入口地址相隔甚近,不便于存放各个较长的中断服务程序,故通常在中断入口地址开始的二三个单元中,安排一条转移类指令,以转入到安排在那儿的中断服务程序。以T1中断为例,其过程下如图四所示。 由于5个中断源各有其中断请求标志0,TF0,IEl,TFl以及RI/TI,在中断源满足中断请求的条件下,各标志自动置1,以向CPU请求中断。如果某一中断源提出中断请求后,CPU不能立即响应,只要该中断请求标志不被软件人为清除,中断请求的状态就将一直保持,直到CPU响应了中断为止,对串行口中断而言,这一过程与其它4个中断的不同之处在于;即使CPU响应了中断,其中断标志RI/TI也不会自动清零,必须在中断服务程序中设置清除RI/TI的指令后,才会再一次地提出中断请求。 CPU的现场保护和恢复必须由被响应的相应中断服务程序去完成,当执行RETI中断返回指令后,断点值自动从栈顶2字节弹出,并
- 关于RTX51 TINY的分析与探讨(05-30)
- 浅析8051模块化编程技巧(05-28)
- 基于DSP和单片机通信的液晶显示设计方案(07-20)
- 锁相环控制及初始化简析(08-27)
- 基于MSP430自动胀管控制器的研究(09-07)
- 嵌入式C实现延时程序的不同变量的区别(03-01)