找回密码
 立即注册
查看: 39|回复: 3

关于IO口的中断问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-09-29 06:50:58
已绑定手机

6

主题

25

回帖

120

积分

注册会员

积分
120
发表于 4 天前 | 显示全部楼层 |阅读模式
用13号中断入口。下面的ASM文件写法对吗?P2,P4,P7口都有中断

CSEG AT 013BH//P2口中断地址
JMP ISR_PROG
CSEG AT 014BH//P4口中断地址
JMP ISR_PROG
CSEG AT 0163H//P7口中断地址
JMP ISR_PROG
ISR_PROG: JMP 006BH//13号中断地址
END

回复

使用道具 举报 送花

3

主题

1928

回帖

704

积分

等待验证会员

积分
704
发表于 4 天前 | 显示全部楼层
您的ASM文件写法存在几个关键性问题,下面我将从以下几个方面进行专业分析和纠正:

一、中断向量地址的理解

首先,您提到使用“13号中断入口”,需要明确以下几点:
中断号与中断向量地址的对应关系:在8051系列单片机中,每个中断源都有其固定的中断向量地址。例如:
外部中断0(INT0):0003H
定时器0溢出中断(TF0):000BH
外部中断1(INT1):0013H
定时器1溢出中断(TF1):001BH
串口中断(RI/TI):0023H
定时器2中断(TF2/EXF2):002BH
外部中断2(INT2):0033H
外部中断3(INT3):003BH
...

由此可以看出,“13号中断”并不存在于标准8051中断体系中,您所指的“13号中断”可能是指外部中断1(INT1)的中断向量地址0013H,这与您代码中跳转到013BH的写法并不一致。

二、中断服务入口地址的正确性

在标准8051架构中,中断向量地址是固定的。例如:

| 中断源 | 向量地址 |
|--------|----------|
| INT0   | 0003H    |
| TF0    | 000BH    |
| INT1   | 0013H    |
| TF1    | 001BH    |
| RI/TI  | 0023H    |

如果您的目标是为多个IO口(如P2、P4、P7)配置中断服务程序,那么这些中断必须映射到有效的中断向量地址上。

然而,在标准8051架构中,P2、P4、P7本身并不是中断源。它们可以作为通用IO口,但在没有额外硬件支持的情况下,不能直接产生中断。也就是说,您需要确认以下几点:

1. 是否使用了带有多IO中断功能的增强型8051内核(如C8051F系列)?
2. 是否将P2/P4/P7配置为外部中断输入?例如,是否将它们连接到INT1、INT2等外部中断引脚?
3. 是否使用了GPIO中断控制器?

否则,您当前的代码逻辑是无法在标准8051平台上运行的。

三、代码分析与问题点

我们逐段分析您提供的ASM代码:
  1. asm
  2. CSEG AT 013BH
  3. JMP ISRPROG
复制代码
问题1:地址013BH并非标准中断向量地址,在8051中,中断向量表位于0000H~0030H左右。将中断服务程序放置在013BH是不规范的,除非您使用的是带有扩展中断向量表的增强型8051(如某些C8051型号)。
  1. asm
  2. CSEG AT 014BH
  3. JMP ISRPROG
复制代码
问题2:014BH同样不是标准中断向量地址,这种做法不符合标准8051架构。
  1. asm
  2. CSEG AT 0163H
  3. JMP ISRPROG
复制代码
问题3:0163H也不是任何标准中断向量地址,这进一步说明代码逻辑可能存在误解。
  1. asm
  2. ISRPROG: JMP 006BH
复制代码
问题4:跳转到006BH,这个地址也未在标准中断向量表中出现。通常,中断服务程序应直接在此地址开始执行,而不是再跳转一次。

四、正确做法建议

1. 确定中断源和向量地址

请确认您使用的单片机型号,查阅其数据手册,明确哪些中断源可用于IO口中断。例如:
C8051F系列支持GPIO中断,每个端口可配置为边沿触发中断。
某些MCU支持将P2、P4等端口映射为外部中断线。

2. 正确设置中断向量地址

假设您使用的是标准8051,并希望使用外部中断1(INT1)来处理某个IO口的中断请求,代码应如下:
  1. asm
  2. ORG 0000H
  3.     LJMP MAIN
  4. ORG 0013H       ; 外部中断1(INT1)的向量地址
  5.     LJMP ISRINT1
  6. ORG 0030H
  7. MAIN:
  8.     ; 初始化代码
  9.     SETB EX1      ; 使能外部中断1
  10.     SETB EA       ; 使能全局中断
  11.     SJMP $
  12. ISRINT1:
  13.     ; 中断服务程序
  14.     ; 可以在这里处理P2、P4、P7的状态
  15.     RETI
复制代码

3. 若使用多IO中断(如C8051F系列)

C8051F系列支持GPIO中断,每个端口可以配置为中断源。此时,中断服务程序统一进入GPIO中断向量地址(如0043H),然后在中断服务程序中通过读取中断标志寄存器判断是哪个IO口触发了中断。

示例代码片段如下:
  1. asm
  2. ORG 0000H
  3.     LJMP MAIN
  4. ORG 0043H       ; GPIO中断向量地址
  5.     LJMP GPIOISR
  6. ORG 0030H
  7. MAIN:
  8.     ; 初始化GPIO中断,允许P2、P4、P7中断
  9.     ; 设置中断触发方式(上升沿/下降沿)
  10.     SETB EIE1     ; 使能GPIO中断
  11.     SETB EA       ; 使能全局中断
  12.     SJMP $
  13. GPIOISR:
  14.     ; 读取中断标志寄存器判断是哪个端口触发
  15.     ; 如读取P2IF、P4IF、P7IF等寄存器
  16.     ; 清除中断标志
  17.     ; 执行相应操作
  18.     RETI
复制代码

五、结论

综上所述,您提供的ASM代码存在以下主要问题:

1. 中断向量地址选择错误(013BH、014BH、0163H不是标准8051中断地址);
2. P2、P4、P7不能直接作为中断源,除非使用支持GPIO中断的增强型MCU;
3. 多次跳转无意义,中断服务程序应直接放置在中断向量地址后;
4. 未明确单片机型号,导致无法判断是否支持多IO中断功能。

六、建议

1. 明确所使用的单片机型号;
2. 查阅其技术手册,确认中断向量地址和中断源;
3. 根据手册编写符合规范的中断服务程序;
4. 若使用增强型MCU,注意配置GPIO中断使能和触发方式;
5. 不建议使用“JMP 006BH”这种间接跳转方式,除非有特殊需求。

如需进一步帮助,请提供具体使用的MCU型号和开发环境,我可以为您提供更详细的代码示例和配置说明。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:315
  • 最近打卡:2025-10-02 12:32:59
已绑定手机

83

主题

3209

回帖

7092

积分

荣誉版主

无情的代码机器

积分
7092
发表于 4 天前 | 显示全部楼层
为什么不直接跳转13号中断,另外13号中断的实现呢?


截图202509291139243618.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-09-29 06:50:58
已绑定手机

6

主题

25

回帖

120

积分

注册会员

积分
120
发表于 4 天前 | 显示全部楼层
我是在问,P2、P4、P7口都有中断,哪个ASM文件中的跳转程序怎么写?
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-3 08:51 , Processed in 0.151663 second(s), 70 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表