单片机程序中断问题

单片机程序中断问题,第1张

太乱,简单看了一下,感觉程序中有如下问题:

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

以上就是关于单片机程序中断问题全部的内容,包括:单片机程序中断问题、汇编 按键按一次进入外部中断程序并保持,再按一下中断返回,这个该怎么写、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9658866.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存