51单片机有5个中断源(忽略定时/计数器2),分2个优先级,这个5个中断源按照自然优先级从高到低依次为:

    外部中断0:INT0

    定时/计数器0:TF0

    外部中断1:INT1

    定时/计数器1:TF1

    串口中断:RI/TI

    每个中断源都对应着一个固定的入口地址,也就是中断向量,它们依次是:

    0 0x0003: INT0

    1 0x000B: TF0

    2 0x0013: INT1

    3 0x001B: TF1

    4 0x0023: RI/TI
    1581944165667-f9233b16-eadd-4a01-82fb-788e898f60b8.jpeg
    也就是说,不管主程序执行到什么地方,只要外部中断1产生请求,内核要响应该中断,就会到0x0013这个地址去执行代码。如果你是在使用汇编语言进行程序开发的时候,你需要记住每个中断源对应的地址;如果你使用的是C语言,你只需要记住中断源的顺序就可以了,也就是最左0边的中断号。中断相关的寄存器

    中断相关的寄存器有4个,每个寄存器都是可以位寻址的,这该编程带来了方便。 其中2个为控制寄存器:IE寄存器与IP寄存器:

    另外2个为中断请求标志:TCON寄存器与SCON寄存器:

    4、关于中断服务函数程序的编写

    一般情况下,中断的处理函数有两个,其一为中断初始化函数,其二为中断服务函数。初始化函数就是一个普通的函数,而中断服务函数却有特殊的格式要求:

    <1> 中断函数没有返回值,也不能带参数。

    <2> 函数名后面要跟一个关键字interrupt,说明这是一个中断服务函数。

    <3> 在关键字interrupt后面要跟上中断号,说明这个中断服务函数是为那个中断服务的。

    中断服务函数的格式为:

    void 函数名() interrupt 中断号

    { ——函数体—— }