找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1630|回复: 13
打印 上一主题 下一主题
收起左侧

51单片机中断系统如何返回时不回当时离开时的主函数

  [复制链接]
跳转到指定楼层
#
ID:1094287 发表于 2023-9-22 20:32 来自手机 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
求大佬解惑

mmexport1695385900628.png (213.58 KB, 下载次数: 30)

mmexport1695385900628.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

13#
ID:1094287 发表于 2023-10-5 18:12 来自手机 | 只看该作者
lkc8210 发表于 2023-9-25 09:03
各位大佬不用想的太深
这问题想达到的目的只是
"如何在有长时间阻塞式延时的请况下,用外中断来快速切换 ...

知己难得
回复

使用道具 举报

12#
ID:624769 发表于 2023-9-25 19:40 | 只看该作者
Hephaestus 发表于 2023-9-23 21:50
那你用A51实现下让我也乐一乐。

我能说出A51能实现,自然是可以实现的,但是……,凭什么给你看? 还是让你“乐一乐”?
俗话说得好,教你是把钱塞你口袋里,你早就把我得罪死了。你觉得我是圣人么? 以德报怨?
有些白眼狼养不熟的,我相信我就算把钱赛你口袋里,你不但不记好,还会变本加厉,所以……  呵呵,长得不怎么样,就不要想得美了。
回复

使用道具 举报

11#
ID:624769 发表于 2023-9-25 19:34 | 只看该作者
Hephaestus 发表于 2023-9-22 22:38
你不知道在哪里发生中断,不返回原地址肯定乱套了,这个问题你永远解决不了。

本次不返回,不代表永远不返回,你觉得肯定会乱套,是因为局限于你的能力,你要是有掌握和规划全局的能力,就能让它乱不起来,那么也就不会这么以为了……
先给自己充充电,再来捉摸这个问题吧。这么武断用上 永远   绝对  这些词的习惯,你该改改了,除了暴露你知识的局限性,给你带不来任何好处。
回复

使用道具 举报

10#
ID:384109 发表于 2023-9-25 10:35 | 只看该作者
多任务应该还是回到分配任务的函数,否则代码是会跑飞的,楼主这是想要做类似操作系统的东西,但是又似乎是不要受到任何约束,任何代码的跳转本身就是因为约束条件而跳转的,这等于是吃着大米长大,然后说从未吃过大米
回复

使用道具 举报

9#
ID:485350 发表于 2023-9-25 10:23 | 只看该作者
yuxuesuixing 发表于 2023-9-25 09:38
这个问题是屁股决定脑袋,不返回当时的函数要返回到哪里去?那么多现场变量保存了有啥意义?每跳转一次栈就 ...

多任务就是不能返回到之前的函数
回复

使用道具 举报

8#
ID:1065084 发表于 2023-9-25 09:38 | 只看该作者
这个问题是屁股决定脑袋,不返回当时的函数要返回到哪里去?那么多现场变量保存了有啥意义?每跳转一次栈就废弃一堆空间,几次你栈就溢出了。

问问题就是仔仔细细说,你一句话没有人能理解你的用意。我用通俗的方式描述你的问题:如何把胳膊卸下来,然后进这个洞离去
回复

使用道具 举报

7#
ID:161164 发表于 2023-9-25 09:03 | 只看该作者
各位大佬不用想的太深
这问题想达到的目的只是
"如何在有长时间阻塞式延时的请况下,用外中断来快速切换模式"
最简单的方法就是在delay里加跳出判断
回复

使用道具 举报

6#
ID:155507 发表于 2023-9-24 13:35 | 只看该作者
我给你来个程序试试。




  1. ;====================================================================
  2. ; Main.asm file generated by New Project wizard
  3. ; Compiler:  ASEM-51 (Proteus)
  4. ;====================================================================

  5. $NOMOD51
  6. $INCLUDE (8051.MCU)

  7. ;====================================================================
  8. ; DEFINITIONS
  9. ;====================================================================

  10. LED1                BIT P1.0
  11. LED2                BIT P1.1
  12. LED3                BIT P1.2
  13. LED4                BIT P1.3

  14. ;====================================================================
  15. ; VARIABLES
  16. ;====================================================================
  17. CNT1                DATA        60H                ;储存器的绝对地址。
  18. ADDR1                DATA        62H
  19. ADDR2                DATA        64H
  20. ADDR3                DATA        66H
  21. ADDR4                DATA        68H

  22. ;====================================================================
  23. ; RESET and INTERRUPT VECTORS
  24. ;====================================================================

  25.       ; Reset Vector
  26.       org   0000h
  27.       jmp   Start
  28.       ; Timer 0 Vector
  29.       org   000Bh
  30.       jmp   Tim0

  31. ;====================================================================
  32. ; CODE SEGMENT
  33. ;====================================================================

  34.         org   0100h
  35. Start:       
  36.                 USING 0
  37.                 MOV                SP, #40H                ;堆栈指针指向内部数据存储器的堆栈区。
  38. TIMER0_INIT:                                        ;1毫秒@12.000MHz
  39. ;                ANL                AUXR,#7FH                ;定时器时钟12T模式
  40.                 ANL                TMOD,#0F0H                ;设置定时器模式
  41.                 ORL                TMOD,#01H                ;设置定时器模式
  42.                 MOV                TL0,#018H                ;设置定时初始值
  43.                 MOV                TH0,#0FCH                ;设置定时初始值
  44.                 CLR                TF0                                ;清除TF0标志
  45.                 SETB        TR0                                ;定时器0开始计时
  46.                 SETB         ET0                                ;使能定时器0中断。
  47.                 SETB         EA                                ;使能中断总开关。
  48.                 MOV         DPTR, #L1                ;16位的地址复制到数据指针DPTR寄存器中。
  49.                 MOV         ADDR1, DPH                ;将高八位的地址,复制到 ADDR1 内部RAM的地址。
  50.                 MOV         ADDR1+1, DPL        ;将低八位的地址,复制到 ADDR1 内部RAM的地址。
  51.                 MOV         DPTR, #L2                ;16位的地址复制到数据指针DPTR寄存器中。
  52.                 MOV         ADDR2, DPH                ;将高八位的地址,复制到 ADDR2 内部RAM的地址。
  53.                 MOV         ADDR2+1, DPL        ;将低八位的地址,复制到 ADDR2 内部RAM的地址。
  54.                 MOV         DPTR, #L3                ;16位的地址复制到数据指针DPTR寄存器中。
  55.                 MOV         ADDR3, DPH                ;将高八位的地址,复制到 ADDR3 内部RAM的地址。
  56.                 MOV         ADDR3+1, DPL        ;将低八位的地址,复制到 ADDR3 内部RAM的地址。
  57.                 MOV         DPTR, #L4                ;16位的地址复制到数据指针DPTR寄存器中。
  58.                 MOV         ADDR4, DPH                ;将高八位的地址,复制到 ADDR4 内部RAM的地址。
  59.                 MOV         ADDR4+1, DPL        ;将低八位的地址,复制到 ADDR4 内部RAM的地址。

  60.       ; Write your code here
  61. Loop:
  62.         jmp Loop
  63. L1:                                        ;测试子程序
  64.                 CPL LED1
  65.                 NOP
  66.                 NOP
  67.                 SJMP L1
  68. L2:                                        ;测试子程序
  69.                 CPL LED2
  70.                 NOP
  71.                 NOP
  72.                 NOP
  73.                 SJMP L2

  74. L3:                                        ;测试子程序
  75.                 CPL LED3
  76.                 NOP
  77.                 NOP
  78.                 NOP
  79.                 NOP
  80.                 SJMP L3

  81. L4:                                        ;测试子程序
  82.                 CPL LED4
  83.                 NOP
  84.                 NOP
  85.                 NOP
  86.                 NOP
  87.                 NOP
  88.                 SJMP L4
  89. Tim0:
  90.                 MOV                TL0,#018H                ;设置定时初始值
  91.                 MOV                TH0,#0FCH                ;设置定时初始值

  92.                 POP         ACC                                ;之前的调入地址出栈
  93.                 POP         ACC                                ;丢掉之前的调入地址
  94.                 MOV         A, CNT1                        ;
  95.                 MOV         R0, #ADDR1+1        ;
  96.                 ADD         A, R0                        ;计算下一个调入地址。
  97.                 MOV         R0, A                        ;
  98.                 MOV         A, @R0                        ;
  99.                 PUSH         ACC                                ;装载低位地址入栈
  100.                 MOV         A, CNT1                        ;
  101.                 MOV         R0, #ADDR1                ;
  102.                 ADD         A, R0                        ;
  103.                 MOV         R0, A                        ;
  104.                 MOV         A, @R0                        ;
  105.                 PUSH         ACC                                ;装载高位地址入栈

  106.                
  107.                 INC         CNT1                        ;计速器递增
  108.                 INC         CNT1                        ;
  109.                 ANL         CNT1, #07H                ;不要超过7

  110.                 RETI                                        ;中断返回
  111. ;====================================================================
  112.       END


复制代码



回复

使用道具 举报

5#
ID:83553 发表于 2023-9-24 12:48 | 只看该作者
Hephaestus 发表于 2023-9-22 22:38
你不知道在哪里发生中断,不返回原地址肯定乱套了,这个问题你永远解决不了。

这个问题早年51流行的时候就解决了,就是三楼的思路,不过还要加上清除相关标记等操作才能正常跳转。
回复

使用道具 举报

地板
ID:883242 发表于 2023-9-23 21:50 | 只看该作者
188610329 发表于 2023-9-23 20:49
你通过 SP 找到栈 再到 栈里面  把 入栈的 PC指针 改成 你希望跳转到的地址。 就能不返回 原函数了。
不过 ...

那你用A51实现下让我也乐一乐。
回复

使用道具 举报

板凳
ID:1094287 发表于 2023-9-23 21:21 来自手机 | 只看该作者
188610329 发表于 2023-9-23 20:49
你通过 SP 找到栈 再到 栈里面  把 入栈的 PC指针 改成 你希望跳转到的地址。 就能不返回 原函数了。
不过 ...

感谢,我纯小白真看不出懂,哈哈看看以后能不能解决了,
回复

使用道具 举报

沙发
ID:624769 发表于 2023-9-23 20:49 | 只看该作者
你通过 SP 找到栈 再到 栈里面  把 入栈的 PC指针 改成 你希望跳转到的地址。 就能不返回 原函数了。
不过,看你用的是 C51 而不是 A51 估计,做到这点 够呛……

回复

使用道具 举报

楼主
ID:883242 发表于 2023-9-22 22:38 | 只看该作者
你不知道在哪里发生中断,不返回原地址肯定乱套了,这个问题你永远解决不了。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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