新闻  |   论坛  |   博客  |   在线研讨会
实时时钟DS12C887调试
yanqin | 2009-04-17 11:21:47    阅读:2845   发布文章

实时时钟DS12C887 调试

1.        实时时钟DS12C887 寄存器介绍:
DS12C887是带114字节RAM的实时时钟接口器件。它有MOTOROLA和
INTEL总线时序选择端。特殊寄存器有14个。从00H到09H单元为时钟、日历、闹钟单元。0AH、0BH、0CH、0DH是功能、状态寄存器。
闹钟单元:01H、03H、05H分别是秒、分、时闹钟设置寄存器。闹钟调协有
种用法:根据写入到三个闹钟寄存器的值产生中断;在各闹钟单元写入自由码(=0CH――0FFH)可产生周期性的闹钟中断。
   时钟、日历单元:00H、02H、04H、06H、07H、08H、09H分别是秒、分、时、星期、日、月、年设置寄存器。设置值有两种:二进制和BCD码。
   功能、状态寄存器:0AH、0BH、0CH、0DH是功能、状态寄存器。
   0AH:提供时间更新标志、确定在何时正确读出时间;提供分频控制功能;可选择输出的方波频率及周期中断频率。
   0BH:具有初始化设置功能,初始化时必需把相关位置1才能初始化时钟、日历寄存器;对相关位设置可使系统具有闹钟中断、周期中断、更新结束中断功能;可控制方波的输出;可控制时间的显示模式,并可自动执行夏令时制。
   0CH:提供中断请求及中断标志以供CPU查询。
   0DH:提供有效的RAM和时间标志。只可读不可写。应总读出为1,若为零表示内部锂电池耗尽。
2.        芯片地址:DFxx选中芯片。
3.        附调试程序:
汇编程序:
;该程序为设置DS12C887的时间为05年02月24日15时04分00秒并分别把秒、分、时、日、月、年送到片内RAM的30H至35H处显示。
显示
                         ORG     0000H
                         SJMP    MAIN
                         ORG     0040H
MAIN:                      LCALL   INI
WAIT:           MOV     DPTR,#0DF0AH    ;读秒送到片内RAM的30H
                MOVX    A,@DPTR
                JB      ACC.7,WAIT
                MOV     DPL,#00H
                MOV     R0,#30H
                MOVX    A,@DPTR
                MOV     @R0,A
                
                MOV     DPL,#02H          ;读分送到片内RAM的31H
                MOV     R0,#31H
                MOVX    A,@DPTR
                MOV     @R0,A
                
                MOV     DPL,#04H        ;读时送到片内RAM的32H
                MOV     R0,#32H
                MOVX    A,@DPTR
                MOV     @R0,A
                
                MOV     DPL,#07H       ;读日送到片内RAM的33H
                MOV     R0,#33H
                MOVX    A,@DPTR
                MOV     @R0,A
                
                MOV     DPL,#08H       ;读月送到片内RAM的34H
                MOV     R0,#34H
                MOVX    A,@DPTR
                MOV     @R0,A
                
                MOV     DPL,#09H        ;读年送到片内RAM的35H
                MOV     R0,#35H
                MOVX    A,@DPTR
                MOV     @R0,A
                
STOP:           NOP
                SJMP    STOP
              
INI:             MOV     DPTR,#0DF0AH       ;DS12C887参数设置
                MOV     A,#70H
                MOVX    @DPTR,A
                
                INC     DPTR
                MOV     A,#8AH
                MOVX    @DPTR,A
                
                MOV     DPL,#00H
                CLR     A
                MOVX    @DPTR,A
                
                MOV     DPL,#02H
                MOV     A,#04H
                MOVX    @DPTR,A
                
                MOV     DPL,#04H
                MOV     A,#15H
                MOVX    @DPTR,A
                
                MOV     DPL,#07H
                MOV     A,#24H
                MOVX    @DPTR,A    
                
                MOV     DPL,#08H
                MOV     A,#02H
                MOVX    @DPTR,A
                
                MOV     DPL,#09H
                MOV     A,#05H
                MOVX    @DPTR,A  
                
                MOV     DPTR,#0DF0AH
                MOV     A,#26H
                MOVX    @DPTR,A
                
                MOV     DPL,#0BH
                MOV     A,#1AH
                MOVX    @DPTR,A
                RET
                
                END
                  

上图为运行了上述程序后过10分钟后将LCALL INI指令屏蔽(即不再设置时间直接读取时间)后运行程序所得到的结果。可以看到片内RAM的30H至35H单元为27、15、15、24、02、05。这表示该时刻读出的时间为05年02月24日15时15分27秒。
C51程序:
#include <reg52.h>
      #include <math.h>
      #include <stdio.h>
           #include <absacc.h>
           #include <intrins.h>
          
           #define  SECOND XBYTE [0XDF00]
           #define  SECALM XBYTE [0XDF01]
           #define  MINUTE XBYTE [0XDF02]
           #define  MINALM XBYTE [0XDF03]
           #define  HOUR   XBYTE [0XDF04]
           #define  HOUALM XBYTE [0XDF05]
           #define  WEEK   XBYTE [0XDF06]
           #define  DAY    XBYTE [0XDF07]
           #define  MONTH  XBYTE [0XDF08]
           #define  YEAR   XBYTE [0XDF09]
           #define  AREG   XBYTE [0XDF0A]
           #define  BREG   XBYTE [0XDF0B]
           #define  CREG   XBYTE [0XDF0C]
           #define  DREG   XBYTE [0XDF0D]
          
           main()
           {      bit busy=0;
             wait:busy=AREG^7;
                  if (busy)
                 {
                   DBYTE [0X30]=SECOND;
                   DBYTE [0X31]=MINUTE;
                   DBYTE [0X32]=HOUR;
                   DBYTE [0X33]=DAY;
                   DBYTE [0X34]=MONTH;
                   DBYTE [0X35]=YEAR;
                 }
                 else goto wait;
               while(1)
               {
               }
           }

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客