关于单片机中断问题(汇编程序)

本人初学单片机,请各位高手们帮我分析一下这段程序。
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INT_0
MAIN: SETB EA
SETB EX0
SETB IT0
JB P3.6,$
LCALL T20MS
JB P3.6,MAIN
MOV P0,#11111110B
LCALL T05S
MOV P0,#11111111B
BJQD:MOV R0,P1
CJNE R0,#0FFH,MJ
JMP BJQD
MJ:MOV R3,#3
XL:MOV P0,#11111110B
MOV R1,#2
LOOP1:LCALL T1MIN
DJNZ R1,LOOP1
SETB P0.0
MOV R2,#2
LOOP2:LCALL T1MIN
DJNZ R2,LOOP2
DJNZ R3,XL
LJMP 0000H
INT_0: MOV P0,#11111111B
ACALL T05S
MOV P0,#11111110B
ACALL T05S
MOV P0,#11111111B
ACALL T05S
MOV P0,#11111110B
ACALL T05S
MOV P0,#11111111B
CLR A
PUSH ACC
PUSH ACC
RETI
LJMP 0000H
T1MIN:MOV R4,#120
LOOP3:ACALL T05S
DJNZ R4,LOOP3
RET
T05S:MOV R5,#25
LOOP4:ACALL T20MS
DJNZ R5,LOOP4
RET
T20MS:MOV R6 ,#38
MOV R7,#232
LOOP5:DJNZ R7,$
DJNZ R6,LOOP5
RET
END
主要是中断这段程序,我明明写着P0.0口闪烁2次(时间间隔为0.5S),可是当我中断响应后它有时候它会闪烁4次 ,有时候闪烁2次,请各位高手帮我看一下错在那里? 我是自学的,没有老师教,所以不知道问谁才好,只好在网上请教各位高手们。

INT_0: MOV P0,#11111111B
ACALL T05S
MOV P0,#11111110B
ACALL T05S
MOV P0,#11111111B
ACALL T05S
MOV P0,#11111110B
ACALL T05S
MOV P0,#11111111B
CLR A
PUSH ACC
PUSH ACC
RETI

这里你用了两个push,然后没有pop,每次经过这里sp都会增加2,那么reti就无法根据sp指向的ram地址保存的值返回到原来的位置了。一般push是在一进入中断时将acc和psw压栈保护现场,reti之前出栈还原现场的,你在reti之前用两个push是完全不需要的。追问

其实我想要的结果是:进入中断后,把P0.0口闪烁2下,然后返回到程序的开始处(中断结束后,我不需要返回到中断的开始处),您应该有看到我在RETI的后面还有一条LJMP,我这个程序不知道为什么中断响应后,有时候会闪烁2下,有时候会闪烁4下。如果要达到我想要的结果又如何写程序呢?希望能帮我解决一下。非常谢谢!!

追答

你在主程序MAIN里加上一句mov sp,#007h,主程序变成
main:
MOV SP,#007H
SETB EA
SETB EX0
SETB IT0
JB P3.6,$

每次经过main时将sp重新设置一个固定的值,就可以了。

追问

按照您的方法去做还是不行。不过还是谢谢你!而且您写的这条程序有好像有点错误:mov sp,#007H.好像应该写成:mov sp,#70H.

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-07-13
雨过晴天二世,你好:
1.设低电平触发与边沿触发有什么不同?
答:外部中断INT0 和INT1 可根据寄存器TCON 中的IT0 和IT1 位状态分别设置为电平或者边沿触发实际产生的中断标志是TCON 中的位IE0 和IE1 当产生外部中断时如果是边沿触发进入中断服务程序后由硬件清除中断标志位如果中断是电平触发由外部请求源而不是由片内硬件控制请求标志.

2.设低电平触发有什么要注意的地方?
答:电平触发,你要及时撤销外部中断源,简单说,就是在中断服务程序执行期间,让INT1上的电压重新变高.防止"刚从中断程序出来,又进入中断服务程序".

3.硬件外围电路,外部中断IC脚要不要加上拉电阻?
答:一般不用,因为因为INT1在P3口上,内部有上拉电阻.但是仍然建议加一个10K的上拉电阻,万一需要可以焊接上,不会乱飞线了.
第2个回答  2011-07-13
主程序中也有让LED闪烁的,可能中断返回后干好与主程序的地方相一致。还有就是有入栈没有出栈,有可能也有影响,例外,入栈一般在进入中断后就做,中断返回前出栈。追问

中断返回后刚好与主程序的地方一致,这个应该太可能,因为中断程序结束后,我是直接跳转到程序的开始处(RETI的后面有一条LJMP),而不是返回断点处继续执行主程序。我不知道这样写正不正解,我想要的结果是:中断响应后P0.0闪烁2下就返回到程序的开始处,可是现在它有时候会闪烁2下,有时候会闪烁4下,所以还得烦请您再帮我分析一下,非常感谢!!

追答

是不会进入你说的LJMP的,倒是会进入前一个LJMP,中断返回后是不可能还会执行他的,RETI返回后在主程序中顺序执行,到主程序的LJMP返回再次执行。永远是不会执行你说的LJMP处的。

如何用汇编语言编写单片机试验中的定时中断实验?
第一、设置定时器工作模式;第二、给TLX、THX赋初值;第三、开中断;第四、启动定时器。当然你要编好中断服务程序了。下面给一个简单的示范例程:程序运行后将在P1.0上产生1K的方波信号输出。ORG 0000H LJMP START ORG 000BH LJMP TM0 ORG 0100H START:CLR EA MOV SP,#60H MOV TMOD,#01H...

单片机中断函数问题?
在编写单片机程序时,是否在中断函数中执行长时间复杂的计算,是一个需要谨慎考虑的问题。通常,不建议在中断函数内部进行此类操作。原因在于,中断处理程序的执行时间需要尽可能短,以避免影响其他中断请求的响应时间。长时间的计算可能导致中断响应延迟,影响系统稳定性。推荐的方法是使用全局变量作为前后台(...

单片机定时器中断实验 程序(汇编语言)不要c语言的
MAIN:MOV TMOD, #01H ;T0定时方式1 MOV TH0, #(65536-50000) \/ 256 ;定时50ms@12MHz MOV TL0, #(65536-50000) MOD 256 ;SETB TR0 ;启动T0 MOV IE, #82H ;开中断 ;第一秒钟L0,L2亮,第二秒钟L1,L3亮,第三秒L4,L6亮,第四秒钟L5,L7亮,;第五秒L0,...

单片机C语言中断问题
你有个地方没弄清楚。单片机执行的是机器码,机器码对应的是汇编指令。而C语言表述的句子,会编译成若干汇编指令。就是说没有C指令这一说,以51举例,_nop_()对应汇编的NOP,但是一个简单的a*b,编译后可能长度就有好几百字节。每条指令执行的周期不同。有些只要一个周期,有些需要几个周期。中断...

单片机中关于中断的问题
你的理解没有错,中断是在你的主程序开始运行时同时进行的,并且定时器、计数器或者是外部中断都是独立工作的,当定时器溢出时,TF由硬件自动置1,并且向cpu发送中断请求,当cpu响应中断时,TF又由硬件自动清0.。并且不管定时器溢不溢出,它都会不断计数,因此在响应完中断程序时,需要对定时器重新装...

单片机中的中断问题,
程序一直在while(1)里面,直到定时器计满产生中断;产生中断后,执行中断服务程序,定时器重新赋值,tt自加1;回到while(1),等待下一次中断,定时器继续计数;定时器产生中断,...反复20次,P10取反。所以你的问题:1.中断函数是只执行一次吗 不是,每次执行完之后,由于中断未关,并且T0继续计数...

为什么汇编程序中断过程中需要把中断程序放到一个特定的位置,例如中 ...
而51系列单片机的中断服务程序入口地址,则是固定对应不同的预留地址空间。而预留空间很小,通常不足以放下一段中断服务程序,因此多是在入口地址安排一条转移指令,转到真正的中断处理程序。早期的Z80是一种8位CPU,则在CPU内部设有一个8位的中断向量寄存器,当产生中断时,是由申请中断的设备提供低8...

汇编单片机中断程序只运行一次,再按就没反应了,帮忙看看是怎么回事_百 ...
你这中断分明是INT0,中断入口地址是 0003H,所以,这入口地址错了。应该是这样 org 0000h LJMP START ORG 0003H LJMP IN0

为什么单片机一直执行中断程序?
1、一般来说单片机的中断发生有两个条件,一是中断标志位置位,二是中断允许,如果这两个条件都满足则进入中断,因为正常情况下中断一直是允许的,那么只能通过标志位来区分是否有中断挂起,2、如果进入中断不清除标志位,那么这一中断服务程序结束后由于标志位还是置位的并且中断是允许的,那么还会再次进入...

关于单片机的中断问题,请教各位
1、尽可能的精炼、短小,花费最少的时间。2、不要再中断服务程序里出现循环、延时等程序段。3、中断优先级设置要合理,保证最高优先级给最需要及时性的事件。至于你说的中断程序时间最多多长,当然是越短越好,溢出的问题可能出现在定时中断上,定时中断服务程序执行时间不要超过设置的定时时间。

相似回答