聊聊 8051单片机的中断优先级寄存器(IP)

中断优先级寄存器(IP)

IP寄存器结构

IP寄存器是一个8位寄存器,每个位控制一个中断源的优先级:

  • IP.0: 外部中断0(PX0)
  • IP.1: 定时/计数器0(PT0)
  • IP.2: 外部中断1(PX1)
  • IP.3: 定时/计数器1(PT1)
  • IP.4: 串行口中断(PS)

当某位设置为1时,表示对应的中断源为高优先级;当设置为0时,表示低优先级。

当IP设置为0AH(0000 1010二进制)时,表示:

IP.3 (ET1) = 1:定时/计数器1高优先级
IP.2 (EX1) = 0:外部中断1低优先级
IP.1 (ET0) = 1:定时/计数器0高优先级
IP.0 (EX0) = 0:外部中断0低优先级

在这种情况下,定时/计数器0和定时/计数器1都是高优先级。根据中断优先级规则,如果两个中断有相同的优先级,则根据它们在硬件中的排列顺序,优先处理较早的中断。因此,定时/计数器0的优先级最高。

实例分析

假设我们有一个系统需要处理定时任务和串行通信。定时任务要求严格的实时性,因此我们将定时/计数器0设置为高优先级,而串行通信为低优先级。

示例代码

以下是一个简单的示例程序,演示如何设置和使用中断优先级:

ORG 0000H       ; 程序起始地址
AJMP MAIN       ; 跳转到主程序

ORG 0003H       ; 外部中断0服务程序地址
AJMP EXT_INT0

ORG 000BH       ; 定时/计数器0中断服务程序地址
AJMP TIMER0_ISR

ORG 0023H       ; 串行口中断服务程序地址
AJMP SERIAL_ISR

MAIN: 
MOV IE, #82H    ; 使能外部中断0和全局中断
MOV IP, #02H    ; 设置定时/计数器0为高优先级
MOV TMOD, #01H  ; 定时器0模式1(16位定时器)
MOV TH0, #0FCH  ; 定时初值高字节
MOV TL0, #18H   ; 定时初值低字节
SETB TR0        ; 启动定时器0
SJMP $          ; 主程序进入无限循环

EXT_INT0: 
; 外部中断0处理代码
RETI

TIMER0_ISR:
; 定时/计数器0中断处理代码
MOV TH0, #0FCH  ; 重新加载初值
MOV TL0, #18H
CLR TF0         ; 清除定时器0溢出标志
RETI

SERIAL_ISR:
; 串行口中断处理代码
RETI

解释

  1. MAIN程序中,首先使能外部中断0和全局中断(MOV IE, #82H)。
  2. 设置定时/计数器0为高优先级(MOV IP, #02H)。
  3. 配置定时器0为16位定时器模式,并加载初始值。
  4. 启动定时器0,并进入无限循环。

在中断处理程序中,定时/计数器0中断服务程序(TIMER0_ISR)优先级高于串行口中断服务程序(SERIAL_ISR)。因此,当定时/计数器0和串行口同时触发中断时,CPU会优先处理定时/计数器0中断。

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值