电平触发 边沿触发 TCON是定时器/计数器0和1(T0、T1)的控制寄存器,同时用于锁存T0、T1的溢出中断请求标志和外部中断请求标志。 TCON(88H)D7D6D5D4D3D2D1D0TF1TF0IE1IT1IE0IT0 定时器/计数器1 定时器/计数器0溢出中断请求标志,由硬件置位。 INT1、INT0请求标志,由硬件置位。 INT1、INT0触发方式控制位,由软件置位或清零。当IT1=0时,INT1为电平触发,IT1=1为边沿触发;IT0同理(与INT0对应)。 SCON为串口控制寄存器,低2位作为串口中断请求标志。 在MCS-51单片机中断系统中,通过片上中断使能寄存器IE来允许或禁止中断 IE(A8H)D7D6D5D4D3D2D1D0EAESET1EX1ET0EX0CPU中断使能标志。当EA=0时,禁止中断;当EA=1时,允许中断。 串口中断使能标志。当EA=0时,禁止串口中断;当EA=1时,允许串口中断。 T1、T0溢出中断使能标志。当ET1=0时,禁止T1中断;当ET1=1时,允许T1中断。ET0(对应T0)同理。 外部中断使能标志。当EX1=0时,禁止INT1中断;当EX1=1时,允许INT1中断。
EX0(对应INT0)同样如此。 例:假设允许片内定时器/计数器中断,禁止其它中断,并设置相应的IE值。 MOVIE,#8AHSETBET0SETBET1SETBEAM CS-51系列单片机的中断优先级控制由中断优先级寄存器IP控制。 IP(B8H)D7D6D5D4D3D2D1D0PSPT1PX1PT0PX0 串口中断 T1中断 外部中断1 T0中断 外部中断0 优先级可以通过软件设置,单片机复位后,IP中所有位被清除为0。 例:设置8031的片外中断为高优先级,片内中断为低优先级,并设置IP相应值。 MOVIP,#05HSETBPX0SETBPX1CLRPSCLRPT0CLRPT1 MCS-51 单片机的中断系统应遵循的原则: 1、低优先级的中断可以被高优先级的中断请求打断,反之则不行。 2、同级的中断请求不能打断已经执行过的同级中断 中断源自然优先级 外部中断0 最高 定时器/计数器0 外部中断1 定时器/计数器1 串口 最低中断 响应条件:中断源的中断允许位为1(即IE中的总允许位EA=1,IE对应的中断允许位也为1) 4.3 中断响应过程 CPU在每个机器周期的S5P2时刻采样各中断源的中断请求信号,并锁存到TCON或SCON中的相应位中。
在下一个机器周期查询采样到的中断请求标志,若查询到中断请求标志则根据优先级别处理该中断,中断系统会自动通过硬件把相应的中断向量地址加载到PC中,进入相应的中断服务程序。 4.4 中断响应时间 以外部中断为例,在每个机器周期的S5P2时刻,INT0、INT1引脚的电平被反转并锁存到TCON的IE0、IE1标志位中。CPU会在下一个机器周期查询新放置的IE0、IE1,若满足响应条件,则CPU在响应中断时会用两个机器周期执行一次硬件长调用指令“LCALL”,硬件完成将中断向量地址加载到程序指针PC中,使程序进入中断向量表项。因此,从外部中断产生到开始执行中断程序至少需要三个完整的机器周期。 4.5 中断响应后清除中断请求 中断源发出中断请求,CPU 响应此中断请求后,应在中断返回前清除中断源的中断请求,避免造成重复中断,重新响应。对于边沿触发的外部中断,CPU 响应中断后会自动硬件清除相应的中断请求标志 IE0 和 IE1。对于电平触发的外部中断,必须加外部硬件取消中断请求。对于定时器溢出中断,CPU 响应中断后会自动硬件清除相应的中断请求标志 TF0 和 TF1。对于串口中断,CPU 响应中断后不会自动清除中断请求标志 RI 或 TI,必须在中断服务程序中使用软件清除。
中断系统应用实例: 外部中断源INT0的扩展设备1设备2设备3设备48051P1.4P1.5P1.6P1.7ORG0003HLJMPINT0INT0:PUSHPSWPUSHACCJBP1.7,DV1JBP1.6,DV2JBP1.5,DV3JBP1.4,DV4GB:POPACCPOPPSWRETIDV1:AJMPGBDV2:AJMPGBDV3:AJMPGBDV4:AJMPGB 设计一个程序,可以实时显示INT0引脚上出现的负跳变信号累计次数。主程序: ORG0000HAJMPMAINORG0003HAJMPIP0ORG0030HMAIN:MOVSP,#60HSETBIT0SETBEASETBEX0MOVR7,#00HLP:ACALLDISPAJMPLP 中断服务子程序:IP0:INCR7RETI 中断程序示例: X1、X2、X3 为三个故障输入端,当系统没有故障时,均为低电平,三个灯灭;当某个部件发生故障时,其对应的输入端由低电平变为高电平,引起单片机产生中断,点亮对应的灯2 主程序: ORG0000HAJMPMAINORG0003HAJMPSERVEMAIN:ORLP1,#0FFH;设置 P1 口初值,灯全部熄灭 SETBIT0;选择边沿触发方式 SETBEX0;允许 INT0 中断 SETBEA;打开 CPU 中断 SJMP 中断服务子程序: SERVE:JNBP1.0,L1;若 X1 没有故障(P1.0=0),则跳转到 L1CLRP1.3;点亮 LED1L1:JNBP1.1,L2;若 X2 没有故障,则跳转到 L2 CLR P1.4; 点亮LED2 L2:JNB P1.2,L3;若X3无故障,跳转L3 CLR P1.5;点亮LED3 L3:RETI