久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3075|回復: 13
打印 上一主題 下一主題
收起左側

51單片機中斷系統如何返回時不回當時離開時的主函數

  [復制鏈接]
跳轉到指定樓層
樓主
ID:1094287 發表于 2023-9-22 20:32 來自觸屏版 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
求大佬解惑

mmexport1695385900628.png (213.58 KB, 下載次數: 63)

mmexport1695385900628.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:883242 發表于 2023-9-22 22:38 | 只看該作者
你不知道在哪里發生中斷,不返回原地址肯定亂套了,這個問題你永遠解決不了。
回復

使用道具 舉報

板凳
ID:624769 發表于 2023-9-23 20:49 | 只看該作者
你通過 SP 找到棧 再到 棧里面  把 入棧的 PC指針 改成 你希望跳轉到的地址。 就能不返回 原函數了。
不過,看你用的是 C51 而不是 A51 估計,做到這點 夠嗆……

回復

使用道具 舉報

地板
ID:1094287 發表于 2023-9-23 21:21 來自觸屏版 | 只看該作者
188610329 發表于 2023-9-23 20:49
你通過 SP 找到棧 再到 棧里面  把 入棧的 PC指針 改成 你希望跳轉到的地址。 就能不返回 原函數了。
不過 ...

感謝,我純小白真看不出懂,哈哈看看以后能不能解決了,
回復

使用道具 舉報

5#
ID:883242 發表于 2023-9-23 21:50 | 只看該作者
188610329 發表于 2023-9-23 20:49
你通過 SP 找到棧 再到 棧里面  把 入棧的 PC指針 改成 你希望跳轉到的地址。 就能不返回 原函數了。
不過 ...

那你用A51實現下讓我也樂一樂。
回復

使用道具 舉報

6#
ID:83553 發表于 2023-9-24 12:48 | 只看該作者
Hephaestus 發表于 2023-9-22 22:38
你不知道在哪里發生中斷,不返回原地址肯定亂套了,這個問題你永遠解決不了。

這個問題早年51流行的時候就解決了,就是三樓的思路,不過還要加上清除相關標記等操作才能正常跳轉。
回復

使用道具 舉報

7#
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


復制代碼



回復

使用道具 舉報

8#
ID:161164 發表于 2023-9-25 09:03 | 只看該作者
各位大佬不用想的太深
這問題想達到的目的只是
"如何在有長時間阻塞式延時的請況下,用外中斷來快速切換模式"
最簡單的方法就是在delay里加跳出判斷
回復

使用道具 舉報

9#
ID:1065084 發表于 2023-9-25 09:38 | 只看該作者
這個問題是屁股決定腦袋,不返回當時的函數要返回到哪里去?那么多現場變量保存了有啥意義?每跳轉一次棧就廢棄一堆空間,幾次你棧就溢出了。

問問題就是仔仔細細說,你一句話沒有人能理解你的用意。我用通俗的方式描述你的問題:如何把胳膊卸下來,然后進這個洞離去
回復

使用道具 舉報

10#
ID:485350 發表于 2023-9-25 10:23 | 只看該作者
yuxuesuixing 發表于 2023-9-25 09:38
這個問題是屁股決定腦袋,不返回當時的函數要返回到哪里去?那么多現場變量保存了有啥意義?每跳轉一次棧就 ...

多任務就是不能返回到之前的函數
回復

使用道具 舉報

11#
ID:384109 發表于 2023-9-25 10:35 | 只看該作者
多任務應該還是回到分配任務的函數,否則代碼是會跑飛的,樓主這是想要做類似操作系統的東西,但是又似乎是不要受到任何約束,任何代碼的跳轉本身就是因為約束條件而跳轉的,這等于是吃著大米長大,然后說從未吃過大米
回復

使用道具 舉報

12#
ID:624769 發表于 2023-9-25 19:34 | 只看該作者
Hephaestus 發表于 2023-9-22 22:38
你不知道在哪里發生中斷,不返回原地址肯定亂套了,這個問題你永遠解決不了。

本次不返回,不代表永遠不返回,你覺得肯定會亂套,是因為局限于你的能力,你要是有掌握和規劃全局的能力,就能讓它亂不起來,那么也就不會這么以為了……
先給自己充充電,再來捉摸這個問題吧。這么武斷用上 永遠   絕對  這些詞的習慣,你該改改了,除了暴露你知識的局限性,給你帶不來任何好處。
回復

使用道具 舉報

13#
ID:624769 發表于 2023-9-25 19:40 | 只看該作者
Hephaestus 發表于 2023-9-23 21:50
那你用A51實現下讓我也樂一樂。

我能說出A51能實現,自然是可以實現的,但是……,憑什么給你看? 還是讓你“樂一樂”?
俗話說得好,教你是把錢塞你口袋里,你早就把我得罪死了。你覺得我是圣人么? 以德報怨?
有些白眼狼養不熟的,我相信我就算把錢賽你口袋里,你不但不記好,還會變本加厲,所以……  呵呵,長得不怎么樣,就不要想得美了。
回復

使用道具 舉報

14#
ID:1094287 發表于 2023-10-5 18:12 來自觸屏版 | 只看該作者
lkc8210 發表于 2023-9-25 09:03
各位大佬不用想的太深
這問題想達到的目的只是
"如何在有長時間阻塞式延時的請況下,用外中斷來快速切換 ...

知己難得
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线天堂免费中文字幕视频 | 欧美 日韩 国产 一区 | a黄在线观看 | 桃花av在线| 成人欧美一区二区三区在线播放 | 久久久涩 | 成人三级影院 | 成人小视频在线免费观看 | 国产乱码一二三区精品 | 久久激情五月丁香伊人 | 国产三级 | 日韩一区二区在线观看 | 一区精品在线观看 | 91在线视频免费观看 | 国产婷婷色一区二区三区 | 亚洲成人精选 | 曰韩一二三区 | 欧美5区| 色噜噜亚洲男人的天堂 | 日韩精品视频在线 | av在线一区二区三区 | 成人在线视频免费观看 | 夜夜干夜夜操 | 超碰人人91 | 久久国产精品一区 | 殴美成人在线视频 | 精品久久久久久久久久久下田 | 美女高潮网站 | 久久av网站 | 91中文字幕在线 | 亚洲视频免费在线看 | 日本久久视频 | 嫩草视频入口 | 欧美日韩亚 | 久久国产精品视频 | h片在线播放| 久久6| 久久伊人亚洲 | 亚洲国产精品久久久久秋霞不卡 | 国产成人高清成人av片在线看 | 黑人巨大精品欧美黑白配亚洲 |