C51语言允许用户自己编写中断服务程序,即中断服务函数。为了在C语言源程序中直接编写中断服务函数的需要,Keil Cx51编译器对函数的定义进行了扩展,增加了一个扩展关键字interrupt,它是函数定义时的一个选项,加上这个选项,即可以将一个函数定义成中断服务函数。
定义中断服务函数的一般形式如下:
函数类型 函数名(形式参数表)[interrupt n][using n]关键字interrupt后面的n是中断号,n的取值范围为0~31。编译器从8n+3处产生中断向量,具体的中断号n和中断向量取决于51系列单片机芯片型号,常用中断源和中断向量如表6-1所示。
51系列单片机可以在片内RAM中使用4个不同的工作寄存器组,每个寄存器组中包含8个工作寄存器(R0~R7)。Keil Cx51编译器扩展了一个关键字using,专门用来选择51单片机中不同的工作寄存器组。using后面的n是一个0~3的常整数,分别选中4个不同的工作寄存器组。在定义一个函数时using是一个选项,如果不用该选项,则由编译器自动选择一个寄存器组作绝对寄存器组访问。需要注意的是,关键字using和interrupt的后面都不允许跟带运算符的表达式。
编写51单片机中断函数时应遵循以下规则。
①中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。
②中断函数没有返回值,如果企图定义一个返回值,将不会得到正确的结果。因此,建议在定义中断函数时将其定义为void类型,以明确说明没有返回值。
③在任何情况下都不能直接调用中断函数,否则会产生编译错误。
④如果在中断函数中调用了其他函数,则被调用函数所使用的寄存器组必须与中断函数相同。用户必须保证按要求使用相同的寄存器组,否则会产生不正确的结果,这一点必须引起足够的注意。如果定义中断函数时没有使用using选项,则由编译器自动选择一个寄存器组作绝对寄存器组访问。另外,由于中断的产生不可预测,中断函数对其他函数的调用可能形成递归调用,需要时可将被中断函数所调用的其他函数定义成再入函数。(www.xing528.com)
⑤Keil Cx51编译器从绝对地址8n+3处产生一个中断向量,其中n为中断号。该向量包含一个到中断函数入口地址的绝对跳转。在对源程序编译时,可用编译控制命令NOINTVECTOR抑制中断向量的产生,从而使用户有能力从独立的汇编程序模块中提供中断向量。
例6-1 若P1口的低4位接开关,P1口的高4位接发光二极管,P3.2接开关,P3.2开关每产生一个负跳变状态,读P1口的低4位开关状态,使开关状态反映在P1口的高4位发光二极管上。
源程序如下:
主函数执行“while(1);”,语句进入死循环等待中断,当拨动INT0的开关后进入中断函数,读入P1.0~P1.3的开关状态,并将状态数据右移四位到P1.4~P1.7的位置上输出,控制LED点亮,执行完中断,返回到等待中断的while(1)语句,等待下一次的中断。
例6-2 P1口接一个共阴极的LED,用LED显示中断的次数。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。