实时时钟DS12C887调试
实时时钟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)
{
}
}
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。