关于AT89c51单片机定时器实现延时子程序的问题

用汇编代码设计程序,完成8个LED灯的循环闪烁:
LED1亮,其余灭->LED2亮,其余灭……,如此循环5次后,进行全灭->全亮闪烁,时间间隔为500ms用p0口控制
org 0000h
RESET: LJMP MAIN
ORG 000BH
LJMP IT0P
ORG 1000H MAIN: MOV A,#01H
MOV R1,#28H LOOP: MOV P0,A
RLC A
ACALL DELAY
DJNZ R1,LOOP
MOV A,#0FFH LOOP1: MOV P0,A
CPL A
ACALL DELAY
LJMP LOOP1 DELAY: MOV SP,#60H
MOV B,#1AH
MOV TMOD,#01H
MOV TL0,#0B0H
MOV TH0,#3CH
SETB TR0
SETB ET0
SETB EA
HERE: SJMP HERE IT0P: MOV TL0,#0B0H
DJNZ B,LOOP2
CLR TR0
LOOP2: RETI
END
这是我的代码,为什么起不到延时的作用

;用汇编代码设计程序,完成8个LED灯的循环闪烁:
;LED1亮,其余灭->LED2亮,其余灭……,如此循环5次后,
;进行全灭->全亮闪烁,时间间隔为500ms用p0口控制

下列程序已经测试通过
;----------------------
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0_INT
MAIN:
SETB TR0 ;T0定时方式0
MOV SP, #60H
MOV IE, #82H
MOV B, #61 ;定时500ms,500 000 / 8192 = 61
;-----------------------
MOV A, #127
MOV R1, #40
LP0:MOV P0, A
JBC F0, $ + 5
SJMP $ - 3
RR A
DJNZ R1, LP0
;-----------------------
CLR A
LP1:MOV P0, A
JBC F0, $ + 5
SJMP $ - 3
CPL A
LJMP LP1
;-----------------------
T0_INT: ;自动重新装入0
DJNZ B, T0_END
MOV B, #61
SETB F0
T0_END:
RETI
;-----------------------
END
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-23
你在定时中断里执行了CLR TR0,把定时器停下了,一次中断后,不会再有中断了追问

如何更改呀,如何反复调用定时器延时程序,再跳转至主程序中执行 SETB TR0
为何定时器没有再次启动

追答

可以把这条指令删了

追问

能个我一个改正后的正确代码吗,我已经试了一上午了。谢谢了

本回答被网友采纳
第2个回答  2012-03-23
楼上说对哈