首页 理论教育中断服务函数与寄存器组定义

中断服务函数与寄存器组定义

【摘要】:2)中断函数没有返回值。7)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明,以防止其他程序调用。编写一个用于统计外部中断0的中断次数的中断服务程序,具体程序如下:2.using n修饰符MCS-51单片机有4组工作寄存器,每组8个寄存器,分别用R0~R7表示。修饰符using n用于指定本函数内部使用的工作寄存器组,其中n的取值为0~3,表示寄存器组号。

Keil Cx51编译器支持在C语言源程序中直接编写8051单片机的中断服务程序。Keil Cx51编译器对函数的定义进行了扩展,增加了一个扩展关键词interrupt,它是函数定义时的一个选项,加上这个选项即可将一个函数定义成中断服务函数。

定义中断服务函数的一般形式如下:

函数类型 函数名(形式参数表)[interrupt m][using n]

1.interrupt m修饰符

interrupt m是C51函数中一个非常重要的修饰符,这是因为中断函数必须通过它进行修饰。在C51程序设计中经常用到中断函数用于实现系统的实时性,从而提高程序的处理效率

在C51程序设计中,当函数定义时用了interrupt m修饰符,系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按MCS-51系统中断的处理方式自动地把它安排在程序存储器中的相应位置。在该修饰符中,m的取值为0~31,对应的中断情况如下:0——外部中断0;1——定时器/计数器T0;2——外部中断1;3——定时器/计数器T1;4——串行口中断;5——定时器/计数器T2(52系列单片机具有);其他值预留。

编写MCS-51中断函数时应注意如下7项内容:

1)中断函数不能进行参数传递,如果中断函数中包含任何参数声明,都将导致编译出错。

2)中断函数没有返回值。如果试图定义一个返回值,将得不到正确的结果,建议在定义中断函数时将其定义为void类型,以明确说明没有返回值。

3)在任何情况下都不能直接调用中断函数,否则会产生编译错误。因为中断函数的返回是由8051单片机的RETI指令完成的,RETI指令影响8051单片机的硬件中断系统。若在没有实际中断情况下直接调用中断函数,RETI指令的操作结果会产生一个致命的错误。(www.chuimin.cn)

4)如果在中断函数中调用了其他函数,则被调用函数所使用的寄存器必须与中断函数相同,否则会输出不正确的结果。

5)编译器对中断函数编译时,会自动在程序开始和结束处加上相应的内容。具体如下:在程序开始处ACC,B,DPH,DPL和PSW入栈,结束时出栈;中断函数未加using n修饰符的,开始时还要将R0~R1入栈,结束时出栈;如中断函数加using n修饰符,则在开始PSW将入栈后还要修改PSW中的工作寄存器组选择位。

6)C51编译器从绝对地址8×m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。

7)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明,以防止其他程序调用。

编写一个用于统计外部中断0的中断次数的中断服务程序,具体程序如下:

2.using n修饰符

MCS-51单片机有4组工作寄存器,每组8个寄存器,分别用R0~R7表示。修饰符using n用于指定本函数内部使用的工作寄存器组,其中n的取值为0~3,表示寄存器组号。对于using n修饰符的使用,要注意以下两点:

1)加入using n后,C51编译时自动在函数的开始处和结束处加入以下指令:

2)using n修饰符不能用于有返回值的函数,因为C51函数的返回值是放在寄存器中的。如果寄存器组改变了,返回值就会出错。