
太乱,简单看了一下,感觉程序中有如下问题:
1 ANL TMOD,#0F0H
ORL TMOD,#01H
在程序中相当于MOV TMOD,#0F1H
这样,你把定时器1设了,没有必要,虽然程序中没有出现SETB TR1,但外部INT0和INT1信号不确定,有可能误触发T1,会引起中断混乱这点我没有仔细看,因为我很少把GATE设为1建议直接改为MOV TMOD, #01H
2 入口地址为0BH,即是定时器0,所以用SETB TR0是对,但为什么却出现了MOV TH1,#68H MOV TL1,#00H 这是给定时器0赋值呀,所以,这两句在这里是没用的。是否应改为TH0和TL0
3 程序中最致命的问题在:
djnz r5,NEXT
ljmp start
你的意思是一个循环已经完成,需要对一些寄存器复位,所以直接跳到START上了,可是,这是正在中断呀,中断是必须靠RETId出堆栈地址的,你这样一搞,运行一次之后,就再也没有中断了,成死循环,停在SJMP $处,因为没有RETI,单片机认为中断中的程序还没有完成,所以下一个中断被屏蔽
4 程序中还有一个常识性的问题,不是你是故意的,还是漏写了,就是每次中断后,都应该给定时器复位,即给TH0和TL0重新赋值,如果不赋值,他们中的数值就是#0FFH了建议在INTTO:后直接加上
我做了简单修改:
org 0000h
ljmp start
org 000bh
ljmp intto
org 0030h
start:
mov dptr,#tab
mov r5 ,#10h
mov r4,#00H
MOV TMOD,#01H
MOV TH0,#68H
MOV TL0,#00H
SETB EA
SETB ET0
SETB TR0
SJMP $
intto:
MOV TH0,#68H
MOV TL0,#00H
mov a,r4
movc a,@a+dptr
mov p1,a
inc r4
djnz r5,NEXT
mov r5 ,#10h
mov r4,#00H
NEXT:
RETI
tab:
db 3fh,06h,5bh,4fH,66H,6dH,7dH,07h
db 7fh,67h,77h,7ch,39h,5eh,79h,71h
end
如我修改的有错误,请提出来,也学习一下
回答完后才发现楼上已经有人这样改过了,哈哈,雷同
比如说按键接在p32,用外部中断0实现键按一次进入外部中断程序并保持,再按一下中断返回
ORG 0000H
LJMP MAIN
ORG 000BH ;外部中断0的入口地址
LJMP IN0
ORG 0030H ;主程序的开始
MAIN:MOV SP,#60H
SETB EA ;开中断总允许
SETB EX0 ;开外部中断0允许
SETB IT0 ;外部中断0触发方式
SJMP $ ;原地踏步,可以用你自己的具体程序替代
IN0:JB P32,$ ;判断按键(p32)是否按下
JNB P32,$ ;判断按键(p32)是否释放
RETI ;中断返回断点处
END
以上就是关于单片机程序中断问题全部的内容,包括:单片机程序中断问题、汇编 按键按一次进入外部中断程序并保持,再按一下中断返回,这个该怎么写、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)