急~!!用数码管显示60秒的秒表设计(单片机AT89C51)

1.要求从0-60秒计时,到60秒后LED发光,当从新计时时LED熄灭。 到60秒后数码管显示60不动,不继续循环,除非按键复位了。
2.用定时计数器定时,用按键控制启停。
3.若启动后计时没到60秒,按键停止后,则重新计时。
4.刚开机时是停止的,按键启动开始计时。
附上图,希望能按图用汇编语言写,谢谢

;程序如下:

;fosc = 11.0592MHz

SP1 BIT P3.2
LED BIT P3.4
;-------------------------------
ORG 0000H
SJMP START
ORG 000BH
MOV TH0, #4CH
JNB F0, T0_END
DJNZ R5, T0_END
MOV R5, #20
INC R4
CJNE R4, #60, T0_E1 ;最大为59
MOV R4, #0
CLR LED
T0_E1:
CALL DISP
CJNE R4, #5, T0_END ;LED亮5s
SETB LED
T0_END:
RETI
;-------------------------------
DISP:
PUSH ACC
PUSH B
MOV A, R4
MOV B, #10
DIV AB
MOV DPTR, #TABLE
MOVC A, @A + DPTR
MOV P1, A
MOV A, B
MOVC A, @A + DPTR
MOV P2, A
POP B
POP ACC
RET
TABLE:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
;-------------------------------
START:
MOV TMOD, #01H
MOV TH0, #4CH
SETB TR0
SETB ET0
SETB EA
M_LOOP:
MOV R4, #0
MOV R5, #20
CALL DISP
WT: JB SP1, $
CALL DELAY
JB SP1, WT
JNB SP1, $
CPL F0
JNB F0, WT
SJMP M_LOOP
DELAY:
MOV R6, #40
DJNZ R7, $
DJNZ R6, $ - 2
RET

END追问

这个程序有如下缺陷:1。计时到60秒的时候停止计时,显示60,而不是继续循环下去的。
2.计时到60秒时LED亮,一直保持亮,重新开始计时时才熄灭,而不是两5秒。

追答

呵呵,自己试试改改吧,不难的。

追问

就是不会改呀~希望你能帮我改好吧~谢谢

追答

比原来的简单了,试试看:

;fosc = 11.0592MHz

SP1 BIT P3.2
LED BIT P3.4
;-------------------------------
ORG 0000H
SJMP START
ORG 000BH
MOV TH0, #4CH
JNB F0, T0_END
DJNZ R5, T0_END
MOV R5, #20
INC R4
CJNE R4, #61, T0_E1 ;最大为60
MOV R4, #60
CLR LED
CALL DISP
RET
T0_E1:
SETB LED
CALL DISP
T0_END:
RETI
;-------------------------------
DISP:
PUSH ACC
PUSH B
MOV A, R4
MOV B, #10
DIV AB
MOV DPTR, #TABLE
MOVC A, @A + DPTR
MOV P1, A
MOV A, B
MOVC A, @A + DPTR
MOV P2, A
POP B
POP ACC
RET
TABLE:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
;-------------------------------
START:
MOV TMOD, #01H
MOV TH0, #4CH
SETB TR0
SETB ET0
SETB EA
M_LOOP:
MOV R4, #0
MOV R5, #20
CALL DISP
WT: JB SP1, $
CALL DELAY
JB SP1, WT
JNB SP1, $
CPL F0
JNB F0, WT
SJMP M_LOOP
DELAY:
MOV R6, #40
DJNZ R7, $
DJNZ R6, $ - 2
RET

END

追问

到60秒后确实停止了,但是按开关却没反应?不能重新开始计时。

追答

SP1 BIT P3.7
LED BIT P3.4
;-------------------------------
ORG 0000H
SJMP START
ORG 000BH
MOV TH0, #4CH
JNB F0, T0_END
DJNZ R5, T0_END
MOV R5, #20
INC R4
CJNE R4, #61, T0_E1 ;最大为60
MOV R4, #60
CLR F0
CLR LED
CALL DISP
RETI ;刚才,这里写成了:RET,所以就不走了.
T0_E1:
SETB LED
CALL DISP
T0_END:
RETI
;-------------------------------
DISP:
PUSH ACC
PUSH B
MOV A, R4
MOV B, #10
DIV AB
MOV DPTR, #TABLE
MOVC A, @A + DPTR
MOV P1, A
MOV A, B
MOVC A, @A + DPTR
MOV P2, A
POP B
POP ACC
RET
TABLE:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
;-------------------------------
START:
MOV TMOD, #01H
MOV TH0, #4CH
SETB TR0
SETB ET0
SETB EA
M_LOOP:
MOV R4, #0
MOV R5, #20
CALL DISP
WT: JB SP1, $
CALL DELAY
JB SP1, WT
JNB SP1, $
CPL F0
JNB F0, WT
SJMP M_LOOP
DELAY:
MOV R6, #40
DJNZ R7, $
DJNZ R6, $ - 2
RET
;-------------------------------
END
;-------------------------------

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-30
1.要求从0-60秒计时,到60后LED发光,当从新计时是LED熄灭。--60,保持--是不是保持显示,等待再次按键,再重新计时?--否则,按键的作用,就C追问

就是保持显示60,再次再重新计时,重新计时时,LED熄灭,求程序

相似回答