基于51单片机的数显秒表

这程序运行时如果在第二次按键没按的情况下,时间到了10秒,它该怎样进行的。

SECOND EQU 30H

TCOUNT EQU 31H

KCOUNT EQU 32H

KEY BIT P3.7

  ORG 00H

  SJMP START

  ORG 0BH

  LJMP INT_T0

START: MOV DPTR,#TABLE

  MOV P0,#3FH

  MOV P2,#3FH ;开始,数码管显示"00"

  MOV SECOND,#00H

  MOV TCOUNT,#00H

  MOV KCOUNT,#00H

  MOV TMOD,#01H ;定时器0工作在方式1

  MOV TL0,#(65536-50000)/256

  MOV TH0,#(65536-50000) MOD 256

 K1: JB KEY,$ ;等待按键

  LCALL DELAY

  JB KEY,$

  MOV A,KCOUNT

  CJNE A,#00H,K2 ;判断按键次数

  SETB TR0 ;第1次按键,启动定时器

  MOV IE,#82H

  JNB KEY,$

  INC KCOUNT ;按键抬起,按键次数值加1

  LJMP K1

 K2: CJNE A,#01H,K3

  CLR TR0 ;第2次按键,关闭定时器

  MOV IE,#00H

  JNB KEY,$

  INC KCOUNT ;按键抬起,按键次数值加1

  LJMP K1

 K3: CJNE A,#02H,K1 ;第3次按键,返回初始状态

  JNB KEY,$

  LJMP START

INT_T0: MOV TH0,#(65536-50000)/256

  MOV TL0,#(65536-50000) MOD 256

  INC TCOUNT

  MOV A,TCOUNT

  CJNE A,#2,I2 ;是否计够0.1秒

  MOV TCOUNT,#00H 

  INC SECOND

  MOV A,SECOND

  CJNE A,#100,I1 ;是否计够10秒

  MOV SECOND,#00H

 I1: MOV A,SECOND

  MOV B,#10

  DIV AB

  MOVC A,@A+DPTR ;显示时间

  MOV P0,A

  MOV A,B

  MOVC A,@A+DPTR

  MOV P2,A

 I2: RETI    

TABLE: DB 3FH,06H,5BH,4FH,66H

  DB 6DH,7DH,07H,7FH,6FH

DELAY: MOV R6,#20

D1: MOV R7,#250

  DJNZ R7,$

  DJNZ R6,D1

  RET

  END

参考GPT和自己的思路:

如果程序运行在第二次按键没按的情况下,当时间到了10秒,定时器0中断会正常触发,但是TCOUNT、SECOND不会被更新,因此不会判断是否计够0.1秒或者10秒,程序会一直停留在INT_T0中断函数中,而不会执行到显示时间的代码。因此数码管上的数字会一直停留在9.9秒,不会继续增加到10.0秒。如果再次按下按键,程序会回到START标签处重新开始计时。

参考GPT和自己的思路:

如果在第二次按键没按的情况下,时间到了10秒,秒表会继续计时,直到按下第二次按键来停止计时。因为在程序中,定时器每隔0.1秒会自动加1,当计到10秒时只是将秒数显示为"10",但定时器和计数器还在继续工作。如果不按下第二次按键关闭定时器,则秒表会一直计时下去,直到重新按下第一次按键来重新开始计时。

参考GPT和自己的思路:如果在第二次按键未按下的情况下,时间到了10秒,程序会继续显示10秒并计时,因为定时器中断每0.1秒会自动加1到秒数计数TCOUNT和显示秒数SECOND的变量中。在程序显示秒数的部分会判断是否已经达到10秒,如果达到了10秒,会将SECOND变量重新设置为0,继续计时。所以程序不会停止,而是会一直继续计时。