5.4.3  中断服务函数

5.4.3 中断服务函数

51子系列单片机内部有5个中断源,其中2个外部中断、2个定时器/计数器中断和1个串行口中断,52子系列单片机再多1个定时器/计数器中断,共有6个中断源,这些中断可以分为2个优先等级,受IE、IP、TCON、SCON、TMOD等特殊功能寄存器管理和控制。在C51里,可以直接编写中断服务函数的程序,定义中断服务函数的一般形式为:

978-7-111-46831-8-Chapter05-31.jpg

其中:interrupt后面的n是中断号,取值范围为0~31。using后面的m为片内RAM的工作寄存器组选择,取值范围为0~3,分别对应4个工作寄存器组。如果没有using选项,则由编译器自动进行选择。

中断服务函数由系统自动调用,在中断允许的条件下,当有相应的中断请求时,系统即自动执行对应的中断矢量的程序。其他函数不能直接调用中断服务函数,否则会产生编译错误。而中断服务函数可以调用一般函数,但要保证使用的工作寄存器组一致,否则也可能产生结果错误。

例1:发光二极管接在AT89C51的P1.0引脚上,编程实现当外部中断0来一个中断时,发光二极管的亮灭状态发生变化。

C51语言实现程序如下:

978-7-111-46831-8-Chapter05-32.jpg

例2:利用串口输出的跑马灯电路如图5-8所示,使用74LS164的并行输出端接8只发光二极管,利用它的串入并出功能,把发光二极管从左向右依次点亮,并不断循环。

978-7-111-46831-8-Chapter05-33.jpg

图5-8 利用串口输出的跑马灯电路

978-7-111-46831-8-Chapter05-34.jpg

978-7-111-46831-8-Chapter05-35.jpg