发 帖  
原厂入驻New

求助 电子时钟

2008-10-18 19:12:51  3009
分享

做了个电子时钟,不知哪里出了错误,仿真时只显示开机设定时间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

[此贴子已经被作者于2008-10-18 19:15:29编辑过]
0
2008-10-18 19:12:51   评论 分享淘帖
3 个讨论
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地址的数据      

[此贴子已经被作者于2008-10-19 15:25:08编辑过]
2008-10-19 15:18:41 评论

举报

呵呵,感激涕零!

2008-10-21 17:36:15 评论

举报

不知你写的是什么?
2013-3-18 11:37:29 评论

举报

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发表新帖
快速回复 返回顶部 返回列表