汇编程序:
ORG 0000H
AJMP START
START:
ACALL SETTIME;设置初始时间
LOOP: ACALL GETTIME;循环读取当前时间
AJMP LOOP;
SETTIME:
MOV DPTR,#7D0AH;DS12C887的A寄存器
MOV A,#20H
MOVX @DPTR,A;打开DS12C887的内部晶振并使RTC(实时时钟)记录时间
INC DPTR;DS12C887的B寄存器
MOV A,#08H
MOVX @DPTR,A;设十进制BCD码,24小时制,不定时
MOV DPTR,#7D0DH;DS12C887的D寄存器
MOVX A,@DPTR;如果D寄存器的第7位为0,表示电池耗尽
JNB ACC.7,ERROR
MOV DPTR,#7D00H;DS12C887的秒单元
MOV A,#00H
MOVX @DPTR,A;写入秒
MOV DPTR,#7D02H;DS12C887分单元
MOV A,#21H
MOVX @DPTR,A;写入分
MOV DPTR,#7D04H;DS12C887时单元
MOV A,#03H
MOVX @DPTR,A;写入时
MOV DPTR,#7D06H;DS12C887星期单元
MOV A,#03H
MOVX @DPTR,A;写入星期
MOV DPTR,#7D07H;DS12C887日单元
MOV A,#20H
MOVX @DPTR,A;写入日
MOV DPTR,#7D08H;DS12C887月单元
MOV A,#07H
MOVX @DPTR,A;写入月
MOV DPTR,#7D09H;DS12C887年单元
MOV A,#05H
MOVX @DPTR,A;写入年时间
ERROR:RET
GETTIME:
MOV DPTR,#7D0AH
MOVX A,@DPTR
JB ACC.7,GETTIME ;REGISTER A的UIP位=0时才可以读数据
MOV DPTR,#7D00H
MOVX A,@DPTR
MOV R2,A ;SECONDS
ACALL DISPLAY
MOV DPTR,#7D02H
MOVX A,@DPTR
MOV R1,A
ACALL DISPLAY ;MINUTES
MOV DPTR,#7D04H
MOVX A,@DPTR
MOV R0,A ;HOURS
ACALL DISPLAY
ACALL DELAY
RET
DISPLAY:
MOV DPTR,#TAB
MOV SCON,#00H
MOV R3,A
ANL A,#0FH
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,R3
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI,$
CLR TI
RET
DELAY:
MOV R4,#0FH
DE1:MOV R5,#0FFH
DJNZ R5,$
DJNZ R4,DE1
RET
TAB: DB 03H,9FH,25H,0DH,99H,49H,41H,1FH,01H,09H,11H,0C1H,63H,85H,61H,71H
END
C语言源程序:
#include "reg52.h"
#include "absacc.h"
#define DSA XBYTE[0x7F0A]//12c887寄存器A地址
#define DSB XBYTE[0x7F0B]//B地址
#def