为直接使用C51编写中断服务程序,C51中定义了中断函数。由于C51编译器在编译时对声明为中断服务程序的函数自动添加了响应的现场保护、阻断其它中断、返回时自动恢复现场等处理的程序段,因而在编写中断函数时可不必考虑这些问题,减小了用户编写中断服务程序的繁琐程度。
中断服务函数在第四章已作了简要介绍。定义中断服务函数语法格式如下:
函数类型 函数名([参数])interrupt n [using n]
void中断服务程序的名称(void)interrupt中断号码using寄存器组号码
对于51而言,其中断号码可以是从0到4的数字,为了方便起见,在包含文件reg51.h中定义了这些常量,如下所示:
#define IE0_VECTOR 0/*0x03 External Interrupt 0*/
#define TF0_VECTOR 1/*0x0B Timer 0*/
#define IE1_VECTOR 2/*0x13 External Interrupt 1*/
#define TF1_VECTOR 3/*0x1B Timer 1*/
#define SIO_VECTOR 4/*0x23 Serial port*/
因此用户只要使用以上所定义的常量即可,下面的范例是设置Timer0的溢出中断服务程序。其中中断服务程序的名称是用户自行定义,但是最好能用比较有意义的名称。以下是T0中断服务函数结构。
static void timer0_isr(void)interrupt TF0_VECTOR using 1
{(www.xing528.com)
...
...
}
T0中断函数名也可以简写为void timer0_isr(void)interrupt 1。对于增强型51而言,由于多出了一个定时器T2,其中断号码是从0~5的数字,为了方便起见,在包含文件reg52.h中定义了这些常量,其内容为
#define IE0_VECTOR 0/*0x03 External Interrupt 0*/
#define TF0_VECTOR 1/*0x0B Timer 0*/
#define IE1_VECTOR 2/*0x13 External Interrupt1*/
#define TF1_VECTOR 3/*0x1B Timer 1*/
#define SIO_VECTOR 4/*0x23 Serial port*/
#define TF@_VECTOR 5/*0x2B Timer 2*/
#define EX2_VECTOR 5/*0x2B External Interrupt 2*/
中断函数只能用void说明,表示没有返回值,同时也没有形式参数,即不能传递参数。格式中的interrupt和using都是C51的关键字,interrupt表示此函数是一个中断函数,整数n是与中断源对应的中断号,对于51单片机,n=0~4,分别对应外中断0、定时器0中断、外中断1、定时器1中断和串行口中断。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。