关于中断返回的问题,新手求教。。搞不明白了
ORG 0000H
AJMP START
ORG 000BH
AJMP TIME0
ORG 0030H
START: MOV P1,#0FFH
MOV TMOD,01H
MOV TH0,#15H
MOV TL0,#0A0H
SETB EA
SETB TR0
SETB ET0
SJMP $
LOOP: AJMP LOOP
TIME0: PUSH ACC
PUSH PSW
CPL P1.0
MOV TH0,#15H
MOV TL0,#0A0H
POP PSW
POP ACC
RETI
END
困惑的问题就是 当RETI中断返回后,它返回的是哪个语句,返回到哪里。
这段代码中RETI是定时器中断返回,他是定时器溢出触发的中断,它返回的不是固定语句。他返回的是触发中断的下一跳语句。例如主程序运行到一条语句LOOP1的时候,定时器刚好溢出了,触发中断,那么他返回的就是这条语句的下一条语句。至于每次返回在什么地方就要看他每次运行到哪里刚好定时器触发中断。
还是不太明白,可不可以拿我写出来的程序讲解一下
你还有有点不理解中断的概念,他和函数返回是不一样的,函数返回是返回到调用它的地方,而中断是不确定在什么时候时候触发的。主程序运行到哪里刚好中断,那个执行完中断后就返回到哪里。你程序因为SJMP $这条语句,程序一直运行在这里,因此中断返回都返回到这里。例外LOOP: AJMP LOOP这条语句不要,他和SJMP $是一样的意思,运行不到这里的。
我写的那个例子,如果中断结束后,程序又重新计时开始了么?定时计数器自动重新开始的么?
小编还是对中断的概念有点不理解。首先单片机CPU是执行程序的指令,而定时器计数是不占用CPU的,也就是只要有时钟脉冲定时器计数就加1.说定时器计数是不需要通过运行程序的,只要有时钟脉冲他就自动计数。定时器计数的时候主程序就一步步运行,定时器对他没有影响。
例如CPU在看电影,定时器就是闹钟,当定时器计数满了的时候他就向CPU发送一个中断请求,就是闹钟响了,对CPU说“嘿,该吃药了”,然后定时器又重新计数。等到下一次溢出。CPU接收到定时器的中断请求后,也就是说CPU“知道了,真烦”,于是CPU暂停主函数去执行中断函数,就是CPU按了一下暂停按钮去吃药了(药不能停)。主程序程序执行在哪里接收到中断,断结束后返回到哪里。也是就说CPU刚才看电影看到哪里他吃完药后回去就在哪里接着看。CPU回去按了一下开始按钮继续看电影,等到下一次闹钟响起。
也就说你想问我CPU吃完药后回去看电影从第几分钟开始看,我只能说“鬼知道他刚才看到哪里了,他看到第几分钟闹钟响,那他就从第几分钟接着看啊”。
希望你对定时器中断有个深入的了解。我是不是可以写小说了?
看电影和吃药有趣,看完之后茅塞顿开!
还是论坛牛人多!
