中止体系的运转有必要与子程序合作才干正确运用。规划中止服务子程序需求首要清晰以下几个问题。
中止服务子程序规划的使命
中止服务子程序规划的根本使命有下列4条:
(1)设置中止答应操控寄存器IE,答应相应的中止恳求源中止。
(2)设置中止优先级寄存器IP,确认并分配所运用的中止源的优先级。
(3)若是外部中止源,还要设置中止恳求的触发方法IT1或IT0,以决议选用电平触发方法仍是跳沿触发方法。
(4)编写中止服务子程序,处理中止恳求。
前3条一般放在主程序的初始化程序段中。
举例如下:例1、假定答应外部中止0中止,并设定它为高优先级中止,其他中止源为低优先级中止,选用跳沿触发方法。在主程序中可编写如下初始化程序段:
选用中止时的主程序结构
因为各中止人口地址是固定的,而程序又有必要先从主程序开始地址OOOOH履行。所以,在OOOOH开始地址的几个字节中,要用无条件搬运指令,跳转到主程序。别的,各中止人口地址之间顺次相差8字节,中止服务子程序稍长就超越8字节,这样中止服务子程序就占用了其他的中止进口地址,影响其他中止源的中止处理。为此,一般在进入中止后,运用一条无条件搬运指令,把中止服务子程序跳转到远离其他中止进口的人口地址处。
常用的主程序结构如下:
留意:在以上的主程序结构中,假如有多个中止源,就对应有多个“ORG XlX2X3X4H”的中止进口地址,多个“中止进口地址”有必要顺次由小到大摆放。主程序MAIN的开始地址Y1Y2Y3 Y4H依据详细情况来组织。
中止服务子程序的流程
呼应中止后,就进入中止服务子程序。中止服务子程序的根本流程如右图所示。
下面临有关中止服务子程序履行进程中的一些问题进行阐明。
(1)现场维护和现场康复 所谓现场是指进人中止时,单片机中某些寄存器和存储器单元中的数据或状况。为了使中止服务子程序的履行不损坏这些数据或状况,防止在中止回来后影响主程序的运转,因而要把它们送入仓库保存起来,这便是现场维护。
现场维护一定要坐落现场中止处理程序的前面。中止处理完毕后,在回来主程序前,则需求把保存的现场内容从仓库中弹出,以康复那些寄存器和存储器单元中的原有内容,这便是现场康复。
现场康复一定要坐落中止处理的后边。AT89S51的仓库操作指令“PUSH direct”和“POP direct”,主要是供现场维护和现场康复运用的。至于要维护哪些内容,应该由用户依据中止处理程序的详细情况来决议。
(2)关中止和开中止 右图中现场维护前和现场康复前关中止是为了防止此刻有高一级的中止进入,防止现场被损坏;在现场维护和现场康复之后的开中止是为下一次的中止做好预备,也为了答应有更高档的中止进入。这样做的结果是,中止处理能够被打断,但本来的现场维护和现场康复不答应更改,除了现场维护和现场康复的顷刻外,依然保持着中止嵌套的功用。
但有的时分,关于一个重要的中止,有必要履行完毕,不答应被其他的中止嵌套。对此可在现场维护之前先封闭总中止开关位,完全封闭其他中止恳求,待中止处理完毕后再开总中止开关位中止。这样,就需求把图5-9中的“中止处理”进程前后的“开中止”和“关中止”两个进程去掉。
(3)中止处理 中止处理是中止源恳求中止的详细意图。使用规划者应依据使命的详细要求来编写中止处理部分的程序。
(4)中止回来 中止服务子程序的最终一条指令有必要是回来指令RETI,它是中止服务程序完毕的标志。CPU履行完这条指令后,把呼应中止时所置l的不行寻址的优先级状况触发器清O,然后从仓库中弹出栈顶上的两个字节的断点地址送到程序计数器PC,弹出的第一个字节送入PCH,弹出的第二个字节送入PCL,CPU从断点处从头履行被中止的主程序。
例2、依据下图的中止服务子程序流程,编写中止服务程序。假定现场维护只需求将PSW寄存器和累加器A的内容压人仓库中维护起来。
一个典型的中止服务子程序如下:
上述程序有几点需求阐明:
(1)本例的现场维护假定只是触及PSW和A的内容,假如还有其他需求维护的内容,只需求在相应的方位再加几条PUSH和POP指令即可。留意,对仓库的操作是先进后出,次第不行倒置。
(2)中止服务子程序中的“中止处理程序段”,使用规划者应依据中止使命的详细要求来编写这部分中止处理程序。
(3)假如该中止服务子程序不答应被其他中止所中止,可将“中止处理程序段”前后的“SETB EA”和“CLR EA”两条指令去掉。
(4)中止服务子程序的最终一条指令有必要是回来指令RETI,千万不行短少,它是中止服务子程序完毕的标志。CPU履行完这条指令后,回来断点处,从头履行被中止的主程序。