微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助 电子时钟

求助 电子时钟

时间:10-02 整理:3721RD 点击:

做了个电子时钟,不知哪里出了错误,仿真时只显示开机设定时间12:00:00,中断程序不能计时,请高手指教。

程序代码如下:
 

DISSEC EQU 20H      ;定义秒显示单元

          DISMIN EQU 21H       ;定义分钟显示单元

          DISHOR EQU 22H       ;定义小时显示单元

          CLKSEC EQU 23H       ;定义秒走时单元

          CLKMIN EQU 24H        ;定义分钟走时单元

          CLKHOR EQU 25H         ;定义小时走时单元

          SECSIG EQU 29H       ;定义一秒钟到标志位

          ORG 000H

          LJMP START

          ORG 000BH

          LJMP INT_B

          ORG 0030H

   START: MOV SP ,#70H    ;堆栈指针赋初值

          MOV SECSIG,#2          ;2*500ms=1s

          MOV TMOD,#01H           ;使用定时器1定时500ms

          MOV TH0,#3CH            ;对定时器赋初值

          MOV TL0,#0B0H

          SETB EA                  ;开总中断

          SETB ET0                 ;开定时器0中断

          SETB TR0                 ;启动定时器0

          CLR A                    ;将开机时钟显示设置为12:00:00

          MOV CLKSEC,A

          MOV CLKMIN,A

          MOV CLKHOR,#12

DISPLY:                  ;显示程序

          MOV DISSEC,CLKSEC        ;将走时单元数据传送到显示单元

          MOV DISMIN,CLKMIN

          MOV DISHOR,CLKHOR

          MOV A,DISSEC              ;转换显示程序

          MOV B,#10

          div AB

          MOV 42H,B    ;秒位转换

          MOV 43H,A

          MOV A,DISMIN

          MOV B,#10

          div AB

          MOV 44H,B    ;分钟转换

          MOV 45H,A

          MOV A,DISHOR

          MOV B,#10

          div AB

          MOV 46H,B      ;小时转换

          MOV 47H,A

          MOV DPTR,#TABLE

          MOV A,42H        ;秒位显示

          MOV P2,#0FEH      ;将位选码送P2

          MOVC A,@A+DPTR

          MOV P0,A

          LCALL DELAY2ms

          MOV A,43H

          MOVC A,@A+DPTR

          MOV P2,#0FDH     ;将位选码送P2

          MOV P0,A

          LCALL DELAY2ms

          MOV A,44H         ;分钟显示

          MOVC A,@A+DPTR

          MOV P2,#0FBH     ;将位选码送P2

          MOV P0,A

          LCALL DELAY2ms

          MOV A,45H

          MOVC A,@A+DPTR

          MOV P2,#0F7H      ;将位选码送P2

          MOV P0,A

          LCALL DELAY2ms

          MOV A,46H         ;小时显示

          MOVC A,@A+DPTR

          MOV P2,#0EFH     ;将位选码送P2

          MOV P0,A

          LCALL DELAY2ms

          MOV A,47H

          MOVC A,@A+DPTR

          MOV P2,#0DFH      ;将位选码送P2

          MOV P0,A

          LCALL DELAY2ms

          LJMP DISPLY

 

    INT_B:PUSH  PSW          ;中断程序

          PUSH  ACC          ;入栈保护现场

          MOV TH0,#3CH          ;对计数器重新赋值

          MOV TL0,#0B0H               

          DJNZ SECSIG,TT    ;判断 1秒时间到否,不到转向TT

          MOV SECSIG,#2     ;一秒到时对标志位重新赋值

          MOV A,CLKSEC      ;对秒数据进行加一处理

          ADD A,#1

          CJNE A,#60,TT

          MOV A,#0

          MOV CLKSEC,A

          MOV A,CLKMIN      ;对分钟数据进行加一处理

          ADD A,#1

          CJNE A,#60,TT

          MOV A,#0

          MOV CLKMIN,A

          MOV A,CLKHOR      ;对小时数据进行加以处理

          ADD A,#1

          CJNE A,#24,TT

          MOV A,#0

          MOV CLKHOR,A

       TT:POP ACC           ;TT为恢复现场中断返回

          POP PSW

          RETI

 DELAY2ms:MOV 40H,#4   ;2MS延时程序

          D1:MOV 41H,#248

          DJNZ 41H,$

          DJNZ 40H,D1

          RET

   TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH    ;显示数码表0~9

 

          END

INT_B:PUSH  PSW          ;中断程序

          PUSH  ACC          ;入栈保护现场

          MOV TH0,#3CH          ;对计数器重新赋值

          MOV TL0,#0B0H               

          DJNZ SECSIG,TT    ;判断 1秒时间到否,不到转向TT

          MOV SECSIG,#2     ;一秒到时对标志位重新赋值

          MOV A,CLKSEC      ;对秒数据进行加一处理

          ADD A,#1
; 这里的错误,你加1以后没有将A再传回CLKSEC,所以CLKSEC一直为0,肯定不能显示阿,后面的分,时都是这样的,加上MOV CLKSEC,A

   还有MOV A,#CLKSEC才是传入的CLKSEC地址的数据      

呵呵,感激涕零!

不知你写的是什么?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top