;///////////////////////////////////////////
;本程序实现实时时钟模块 时钟芯片型号:DS1302
;/////////////////////////////////////////// T_CLK Bit P1.4 ;实时时钟时钟线引脚 T_IO Bit P1.5 ;实时时钟数据线引脚 T_RST Bit P1.6 ;实时时钟复位线引脚 ;40h--46h 存放 "秒 分 时 日 月 星期 年 " second equ 40h org 0000h ajmp main org 0030h main: mov dptr,#tab mov 40h,#00 ;秒 mov 41h,#05 ;分 mov 42h,#11 ;时 mov 43h,#23 ;日 mov 44h,#05 ;月 mov 45h,#00 ;星期 mov 46h,#04 ;年 lcall set1302 loop: lcall get1302 lcall exchange mov r4,#3 tt1: lcall display djnz r4,tt1 ajmp loop exchange: mov a,41h mov b,#10h div ab mov 33h,a mov a,b mov 32h,a mov a,40h mov b,#10h div ab mov 31h,a mov a,b mov 30h,a ret display: mov r7,#100 dd1: mov a,30h movc a,@a+dptr mov p0,a clr p2.0 lcall delay100us setb p2.0 mov a,31h movc a,@a+dptr mov p0,a clr p2.1 lcall delay100us setb p2.1 mov a,32h movc a,@a+dptr mov p0,a clr p2.2 lcall delay100us setb p2.2 mov a,33h movc a,@a+dptr mov p0,a clr p2.3 lcall delay100us setb p2.3 djnz r7,dd1 ret delay100us: mov r5,#50 djnz r5,$ ret tab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h,86h,8eh ;********************************************************** ;子程序名:Set1302 ;功 能:设置DS1302 初始时间,并启动计时。 ;调 用:RTInputByte ;入口参数:初始时间在:Second,Minute,Hour,Day,Month,Week.YearL(地址连续) ;出口参数:无 ;影响资源:A B R0 R1 R4 R7 ;********************************************************** Set1302: CLR T_RST CLR T_CLK SETB T_RST MOV B,#8EH ;控制寄存器 LCALL RTInputByte MOV B,#00H;写操作前WP=0 LCALL RTInputByte SETB T_CLK CLR T_RST MOV R0,#Second; MOV R7,#7;秒 分 时 日 月 星期 年 MOV R1,#80H;秒写地址 S13021: CLR T_RST CLR T_CLK SETB T_RST MOV B,R1;写秒 分 时 日 月 星期 年 地址 LCALL RTInputByte MOV A,@R0;写秒数据 MOV B,A LCALL RTInputByte INC R0 INC R1 INC R1 SETB T_CLK CLR T_RST DJNZ R7,S13021 CLR T_RST CLR T_CLK SETB T_RST MOV B,#8EH;控制寄存器 LCALL RTInputByte MOV B,#80H;控制,WP=1,写保护 LCALL RTInputByte SETB T_CLK CLR T_RST RET ;********************************************************** ;子程序名:Get1302 ;功 能:从DS1302 读时间 ;调 用:RTInputByte,RTOutputByte ;入口参数:时间保存在:Second,Minute,Hour,Day,Month,Week.YearL ;出口参数:无 ;影响资源:A B R0 R1 R4 R7 ;********************************************************** Get1302: MOV R0,#Second; MOV R7,#7 MOV R1,#81H;秒地址 G13021: CLRT_RST CLR T_CLK SETB T_RST MOV B,R1;秒 分 时 日 月 星期 年 地址 LCALL RTInputByte LCALL RTOutputByte MOV @R0,A;秒 INC R0 INC R1 INC R1 SETB T_CLK CLR T_RST DJNZ 7,G13021 RET ;********************************************************** ;功 能:写1302一字节(内部子程序) ;********************************************************** RTInputByte: MOV R4,#8 Inbit1: MOV A,B RRC A MOV B,A MOV T_IO,C SETB T_CLK CLR T_CLK DJNZ R4,Inbit1 RET ;********************************************************** ;功 能:读1302一字节(内部子程序) ;********************************************************** RTOutputByte: MOV R4,#8 Outbit1: MOV C,T_IO RRC A SETB T_CLK CLR T_CLK DJNZ R4,Outbit1 RET ;///////////////////////////////////////////////////////////////////////////// end
|