DS1302是Dallas公司生产的一种实时时钟芯片。它通过串行方式与单片机进行数据传送,能够向单片机提供包括秒、分、时、日、月、年等在内的实时时间信息,并可对月末日期、闰年天数自动进行调整;它还拥有用于主电源和备份电源的双电源引脚,在主电源关闭的情况下,也能保持时钟的连续运行。另外,它还能提供31字节的用于高速数据暂存的RAM。鉴于上述特点,DS1302已在许多单片机系统中得到应用,为系统提供所需的实时时钟信息。
一、 DS1302的主要特性
1. 引脚排列
500)this.width=500 border=0>
图1 DS1302引脚排列图
DS1302的引脚排列如图1所示,各引脚的功能如下:
X1,X2——32768Hz晶振引脚端;
RST——复位端;
I/O——数据输入/输出端;
SCLK——串行时钟端;
GND——地;
VCC2,VCC1——主电源与后备电源引脚端。
2. 主要功能
DS1302时钟芯片内主要包括移位寄存器、控制逻辑电路、振荡器、实时时钟电路以及用于高速暂存的31字节RAM。DS1302与单片机系统的数据传送依靠RST,I/O,SCLK三根端线即可完成。其工作过程可概括为:首先系统RST引脚驱动至高电平,然后在作用于SCLK时钟脉冲的作用下,通过I/O引脚向DS1302输入地址/命令字节,随后再在SCLK时钟脉冲的配合下,从I/O引脚写入或读出相应的数据字节。因此,其与单片机之间的数据传送是十分容易实现的。
二、 时钟的产生及存在的问题
(1) 在实际使用中,我们发现DS1302的工作情况不够稳定,主要表现在实时时间的传送有时会出现误差,有时甚至整个芯片停止工作。我们对DS1302的工作电路进行了分析,其与单片机系统的连接如图2所示。从图中可以看出,DS1302的外部电路十分简单,惟一外接的元件是32768Hz的晶振。通过实验我们发现:当外接晶振电路振荡时,DS1302计时正确;当外接晶振电路停振时,DS1302计时停止。因此,我们认为32768Hz晶振是造成 DS1302工作不稳定的主要原因。
500)this.width=500 border=0>
图2 DS1302与单片机系统的连接图
(2) DS1302时钟的产生基于外接的晶体振荡器,振荡器的频率为32768Hz。该晶振通过引脚X1、X2直接连接至DS1302,即DS1302是依靠外部晶振与其内部的电容配合来产生时钟脉冲的。由于DS1302在芯片本身已经集成了6pF的电容,所以,为了获得稳定可靠的时钟,必须选用具有6pF负载电容的晶振。
然而,许多人在选用晶振时仅仅注意了晶振的额定频率值,而忽视了晶振的负载电容大小,甚至连许多经销商也不能提供所售晶振的负载电容。所以即使在使用中选用了符合32768Hz的晶振,但如果该晶振的负载电容与DS1302提供的6pF不一致时,就会影响晶振的起振或导致振荡频率的偏移,出现上述在应用中的问题。
三、 利用辅助电容实现负载匹配
(1) 当所选的晶振负载电容不是6pF时,可以采用增加辅助电容的方法提高或降低DS1302振荡器的电容性负载,使之与晶体所需的电容值匹配。如果已知晶体的负载电容为CI,若CI<6pF,则可以增加一个并联电容CS以产生所需的总负载电容CI,即CI=6pF+CS;若CI>6pF,则可以在晶体的一端增加一个串联电容CS,以产生所需的负载电容CI,即1/CI=1/6pF+1/CS,通过计算即可得出应增加的辅助电容大小。辅助电容的接法如图3所示。
500)this.width=500 border=0>
图3 CS连接电路图
(2) 在使用前对晶体的负载电容并不知道的情况下,通过测定晶体振荡频率的方法可以确定该晶体的负载电容。
对于晶体振荡器来说,其振荡频率与负载电容之间的关系是确定的。以本文讨论的DS1302使用的32768Hz晶振为例:当它工作于所要求的负载电容时,能较准确地产生 32768Hz的频率;当它的负载电容小于6pF时,其振荡频率会正向偏移;当它的负载电容大于6pF时,其振荡频率就会负向偏移。因此,对于未知负载电容的晶体应首先采用实验的方法,在其两端加入辅助电容使晶体起振,然后用频率计测出振荡频率。若测得频率大于32768Hz,说明负载电容偏小;若测得频率小于32768Hz,说明负载电容偏大。对辅助电容逐步调整,最终使振荡频率尽可能接近32768Hz,则此时晶体端所接负载电容的总和就是适合该晶体的负载电容。
结论
以上方法经我们在实际工作中多次使用,证明确实有效。它放宽了DS1302在使用中对晶振的条件要求,增强了DS1302在工作中的稳定性,对DS1302更广泛地应用具有积极的意义。
SECL EQU 30H;;;定义(时。分。秒)
SECH EQU 31H
MINL EQU 32H
MINH EQU 33H
HOURL EQU 34H
HOURH EQU 35H
ORG 0000H
LJMP MAIN
ORG 000BH;中断入口
LJMP TNTT0
ORG 0100H
MAIN:
MOV SECL ,#00H
MOV SECH ,#00H
MOV MINL ,#00H
MOV MINH ,#00H
MOV HOURL,#00H
MOV HOURH,#00H
;;;;;;;;;;;;;;;;;
MOV 36H,#0BH
MOV 37H,#00H
MOV 38H,#00H
MOV 39H,#00H
;;;;;;;;;;;;;;;;
MOV 40H,#00H
;;;;;;;;;;;;;;;;;
;;定时开关的地址;
;;;;;;;;;;;;;;;;;
MOV 60H,#00H
MOV 61H,#00H
MOV 62H,#00H
MOV 63H,#00H
MOV 64H,#00H
MOV 65H,#00H
MOV 66H,#00H
MOV 67H,#00H
;;;;;;;;
MOV R5,#00H
MOV R1,#00H
MOV R2,#00H
MOV R3,#02H
MOV R4,#00H
MOV R6,#00H
;;;;;;;;;;;;;;;;;;;;
;数码管的共公端地址;
;;;;;;;;;;;;;;;;;;;;
MOV 41H,#0FEH
MOV 42H,#0FDH
MOV 43H,#0FBH
MOV 44H,#0F7H
MOV 45H,#0EFH
MOV 46H,#0DFH
SETB P2.7
;;;;;;;;;;;;;;;;;;;;;;;;;;;
LOOP:
SETB EA
SETB ET0
MOV TMOD,#01H
MOV TL0,#0BH
MOV TH0,#38H
SETB TR0
MOV R0,#18
LJMP CS
CS:
LCALL DIS
LJMP CS
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;
;;;加1子程序;;;
;;;;;;;;;;;;;;;
DIAY1:
MOV TL0,#0BH
MOV TH0,#38H
RETI
TNTT0:;中断入口;;
DJNZ R0,DIAY1
MOV R0,#18
;;;;;;;;;;
; 秒加1; ;
;;;;;;;;;;
;;低位;;;
MOV A,SECL
SS:INC A
MOV SECL,A
JNB P3.2,AS;;;设置分
JNB P3.1,HH1;;;设置时
WWQ:CJNE A,#0AH,DIAY1
MOV SECL,#00H
;;高位;;;;
MOV A,SECH
INC A
MOV SECH,A
CJNE A,#06H,DIAY1
MOV SECH,#00H
;;;;;;;;;;
; 分加1 ;;
;;;;;;;;;;
;;低位;;;
MOV A,MINL
INC A
MOV MINL,A
CJNE A,#0AH,DIAY1
MOV MINL,#00H
;;高位;;;;
MOV A,MINH
INC A
MOV MINH,A
CJNE A,#06H,DIAY1
MOV MINH,#00H
;;;;;;;;;;
; 时加1; ;
;;;;;;;;;;
;;低位;;;
MOV A,HOURL
INC A
INC R1
MOV HOURL,A
CJNE R1,#24,D1
LCALL D2
D1:CJNE A,#0AH,DIAY1
MOV HOURL,#00H
;;高位;;;;
MOV A,HOURH
INC A
MOV HOURH,A
CJNE A,#03H,DIAY1
MOV HOURH,#00H
RET
HH1:LCALL HH
RET
AS:LCALL MM
RET
;;;;;;;;;;;;;;
;;;24小时清0;;
;;;;;;;;;;;;;;
D2:
MOV A,#0AH
MOV R1,#00H
RET;;;结束加1子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;动态扫描时间显示;
;;;;;;;;;;;;;;;;;;;
KK:LCALL ONF7
RET
ONOFF1:LCALL ONOFF
RET
DDD1:JNB P3.3,$
LCALL NUOL1
RET
DIS:;;;秒;;;
JNB P3.0,ONOFF1;;直开关机
JNB P3.3,ddd1;;;进入闹钟设置
JNB P3.4,KK;;;定时开关机
MOV DPTR,#TAB
MOV A,SECL
MOVC A,@A+DPTR
MOV P0,A
MOV P2,41H
LCALL DIAY
MOV A,SECH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,42H
LCALL DIAY
;;;;分;;;
MOV A,MINL
MOVC A,@A+DPTR
MOV P0,A
MOV P2,43H
SETB P0.2
LCALL DIAY
MOV A,MINH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,44H
LCALL DIAY
;;;;时;;;;;
MOV A,HOURL
MOVC A,@A+DPTR
MOV P0,A
MOV P2,45H
SETB P0.2
LCALL DIAY
MOV A,HOURH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,46H
LCALL DIAY
MOV A,MINL
LCCG:;;铃声比较;;;;;;;
CJNE A,36H,DF
MOV A,MINH
CJNE A,37H,DF
MOV A,HOURL
CJNE A,38H,DF
MOV A,HOURH
CJNE A,39H,DF
LCALL LC
DF:;;定时开机比较;;;;;;;
MOV A,MINL
CJNE A,60H,DG
MOV A,MINH
CJNE A,61H,DG
MOV A,HOURL
CJNE A,62H,DG
MOV A,HOURH
CJNE A,63H,DG
LCALL OON
DG:;;定时关机比较;;;;;;;
MOV A,SECL
CJNE A,#00H,TT
MOV A,SECH
CJNE A,#00H,TT
MOV A,MINL
CJNE A,64H,TT
MOV A,MINH
CJNE A,65H,TT
MOV A,HOURL
CJNE A,66H,TT
MOV A,HOURH
CJNE A,67H,TT
LCALL OFF
TT:RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;
;设置时钟,分&时;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;
MM:;;;设置分;;;;
MOV 30H,#00H
MOV 31H,#00H
MOV A,MINL
INC A
MOV MINL,A
CJNE A,#0AH,DD
MOV MINL,#00H
MOV A,MINH
INC A
MOV MINH,A
CJNE A,#06H,DD
MOV MINH,#00H
HH:;;设置时;;;
MOV 30H,#00H
MOV 31H,#00H
MOV A,HOURL
INC A
INC R1
MOV HOURL,A
CJNE R1,#24,D4
LCALL D2
D4:CJNE A,#0AH,DD
MOV HOURL,#00H
MOV A,HOURH
INC A
MOV HOURH,A
CJNE A,#03H,DD
MOV HOURH,#00H
DD:LCALL WWQ
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;铃声;;;
;;;;;;;;;;;;;;
LC:LCALL DIAY
CLR P2.7
LCALL DELAY
RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;
;;;按键直开关机子程序;;
;;;;;;;;;;;;;;;;;;;;;;
ONOFF:;;
JNB P3.0,$
LCALL DELAY1
LCALL MN
LCALL DELAY
MOV 41H,#0FFH
MOV 42H,#0FFH
MOV 43H,#0FFH
MOV 44H,#0FFH
MOV 45H,#0FFH
MOV 46H,#0FFH
DJNZ R3,END1
LCALL DELAY1
MOV 41H,#0FEH
MOV 42H,#0FDH
MOV 43H,#0FBH
MOV 44H,#0F7H
MOV 45H,#0EFH
MOV 46H,#0DFH
MOV R3,#02H
END1:LJMP SS
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;按键响声;;
;;;;;;;;;;;;
MN:CLR P2.7
LCALL DIAY
RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;
;;;定时开关机子程序;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;
ONF7:JNB P3.4,$
LCALL MN
LCALL DELAY
ONF:;;;开设置;;;;;
JNB P3.0,ONF3;跳到关设置
JNB P3.4,ON1;分设置
JNB P3.3,ON2;时设置
LCALL ON5;;显示分
LCALL ON6;;显示时
LJMP ONF
ONF3:;;关设置;;;;
JNB P3.0,$
LCALL MN
ONF1:
JNB P3.0,EE;;返回;;
JNB P3.4,ON3;分设置
JNB P3.3,ON4;时设置
LCALL ON7;;显示分
LCALL ON8;;显示时
LJMP ONF1
EE:JNB P3.0,$
LCALL MN
LJMP CS
RET
ON1:;;;开机分设置加1;;
JNB P3.4,$
LCALL MN
MOV A,60H
INC A
MOV 60H,A
CJNE A,#0AH,ONF5
MOV 60H,#00H
MOV A,61H
INC A
MOV 61H,A
CJNE A,#06H,ONF5
MOV 61H,#00H
ONF5:LJMP ONF
ON2:;;;开机时设置加1;;
JNB P3.3,$
LCALL MN
MOV A,62H
INC A
INC R4
MOV 62H,A
CJNE R4,#24,FF
LCALL ON69
FF:CJNE A,#0AH,ONF5
MOV 62H,#00H
MOV A,63H
INC A
MOV 63H,A
CJNE A,#03H,ONF5
MOV 63H,#00H
LJMP ONF
ON69:;24小时清0
MOV A,#0AH
MOV R4,#00H
RET
ON3:;;关机分设置加1;;
JNB P3.4,$
LCALL MN
MOV A,64H
INC A
MOV 64H,A
CJNE A,#0AH,ONF6
MOV 64H,#00H
MOV A,65H
INC A
MOV 65H,A
CJNE A,#06H,ONF6
MOV 65H,#00H
ONF6:LJMP ONF1
ON4:;;关机时设置加1;;
JNB P3.3,$
LCALL MN
MOV A,66H
INC A
INC R5
MOV 66H,A
CJNE R5,#24,FF11
LCALL FF22
FF11:CJNE A,#0AH,ONF0
MOV 66H,#00H
MOV A,67H
INC A
MOV 67H,A
CJNE A,#03H,ONF0
MOV 67H,#00H
ONF0:LJMP ONF1
FF22:;24小时清0
MOV A,#0AH
MOV R5,#00H
RET
ON5:;;开机显示分 ;
MOV DPTR,#TAB
MOV A,60H
MOVC A,@A+DPTR
MOV P0,A
MOV P2,43H
LCALL DIAY
MOV A,61H
MOVC A,@A+DPTR
MOV P0,A
MOV P2,44H
LCALL DIAY
RET
ON6:;;开机显示时 ;
MOV DPTR,#TAB
MOV A,62H
MOVC A,@A+DPTR
MOV P0,A
SETB P0.2
MOV P2,45H
LCALL DIAY
MOV A,63H
MOVC A,@A+DPTR
MOV P0,A
SETB P0.2
MOV P2,46H
LCALL DIAY
RET
ON7:;;关机显示分 ;
MOV DPTR,#TAB
MOV A,64H
MOVC A,@A+DPTR
MOV P0,A
SETB P0.2
MOV P2,43H
LCALL DIAY
MOV A,65H
MOVC A,@A+DPTR
MOV P0,A
SETB P0.2
MOV P2,44H
LCALL DIAY
RET
ON8:;;关机显示时 ;
MOV DPTR,#TAB
MOV A,66H
MOVC A,@A+DPTR
MOV P0,A
SETB P0.2
MOV P2,45H
LCALL DIAY
MOV A,67H
MOVC A,@A+DPTR
MOV P0,A
SETB P0.2
MOV P2,46H
LCALL DIAY
RET
OFF:;;定时关机
MOV 41H,#0FFH
MOV 42H,#0FFH
MOV 43H,#0FFH
MOV 44H,#0FFH
MOV 45H,#0FFH
MOV 46H,#0FFH
RET
OON:;;定时开机
MOV 41H,#0FEH
MOV 42H,#0FDH
MOV 43H,#0FBH
MOV 44H,#0F7H
MOV 45H,#0EFH
MOV 46H,#0DFH
RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;
;铃声设置;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;
DDD:
JNB P3.0,$
LCALL MN
LJMP CS;;返回;;
RET
NUOL1:
MOV 36H,#0BH
NUOL:
JNB P3.0,DDD;;返回;;
JNB P3.4,WW1;跳设置分
JNB P3.3,WW2;跳设置时
LCALL NUOL2;;跳显示分
LCALL NUOL3;;跳显示时
LJMP NUOL
WW1: ;;设置分
JNB P3.4,$
LCALL MN
MOV A,36H
INC A
MOV 36H,A
CJNE A,#0AH,NUOL
MOV 36H,#00H
MOV A,37H
INC A
MOV 37H,A
CJNE A,#06H,NUOL
MOV 37H,#00H
LJMP NUOL
WW2:;;设置时
JNB P3.3,$
LCALL MN
MOV A,38H
INC A
INC R2
MOV 38H,A
CJNE R2,#24,D0
LCALL D9
D0:CJNE A,#0AH,NUOL
MOV 38H,#00H
MOV A,39H
INC A
MOV 39H,A
CJNE A,#03H,NUOL
MOV 39H,#00H
LJMP NUOL
D9:;24小时清0
MOV A,#0AH
MOV R2,#00H
MOV 36H,#00H
MOV 37H,#00H
RET
NUOL2:;;显示分
MOV DPTR,#TAB
MOV A,36H
MOVC A,@A+DPTR
MOV P0,A
MOV P2,43H
LCALL DIAY
MOV A,37H
MOVC A,@A+DPTR
MOV P0,A
MOV P2,44H
LCALL DIAY
RET
NUOL3:;;显示分
MOV DPTR,#TAB
MOV A,38H
MOVC A,@A+DPTR
MOV P0,A
MOV P2,45H
LCALL DIAY
MOV A,39H
MOVC A,@A+DPTR
MOV P0,A
MOV P2,46H
LCALL DIAY
RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;
;延时& ;;;;;;
;;;;;;;;;;;;
DELAY:;延时子程序.
MOV R7,#0AH
D7:MOV R6,#0FFH;
Dp:DJNZ R6,Dp
DJNZ R7,D7;
RET;
DIAY:
MOV R6,#05H
T2:MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,T2
RET
DELAY1:;延时子程序.
MOV R7,#0FFH
D71:MOV R6,#0FFH;
Dp1:DJNZ R6,Dp1
DJNZ R7,D71;
RET;
TAB:
DB 0EBH,081H,0DAH,0D9H,0B1H
DB 079H,07BH,0C1H,0FBH,0F9H
RET
END