单片机电子时钟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,即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 31HMINL EQU 32HMINH EQU 33HHOURL EQU 34HHOURH EQU 35HORG 0000HLJMP MAINORG 000BH;中断入口LJMP TNTT0ORG 0100HMAIN:MOV SECL ,#00HMOV SECH ,#00HMOVMINL ,#00HMOV MINH ,#00HMOV HOURL,#00HMOV HOURH,#00H;;;;;;;;;;;;;;;;;MOV 36H,#0BHMOV37H,#00HMOV 38H,#00HMOV39H,#00H;;;;;;;;;;;;;;;;MOV40H,#00H;;;;;;;;;;;;;;;;;;;定时开关的地址;;;;;;;;;;;;;;;;;;MOV 60H,#00HMOV 61H,#00HMOV 62H,#00HMOV 63H,#00HMOV 64H,#00HMOV 65H,#00HMOV 66H,#00HMOV 67H,#00H;;;;;;;;MOV R5,#00HMOVR1,#00HMOV R2,#00HMOV R3,#02HMOV R4,#00HMOVR6,#00H;;;;;;;;;;;;;;;;;;;;;数码管的共公端地址;;;;;;;;;;;;;;;;;;;;;MOV 41H,#0FEHMOV42H,#0FDHMOV 43H,#0FBHMOV 44H,#0F7HMOV45H,#0EFHMOV 46H,#0DFHSETBP2.7;;;;;;;;;;;;;;;;;;;;;;;;;;;LOOP:SETB EASETB ET0MOV TMOD,#01HMOV TL0,#0BHMOV TH0,#38HSETB TR0MOV R0,#18LJMP CSCS:LCALL DISLJMP CSRET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;加1子程序;;;;;;;;;;;;;;;;;;DIAY1:MOV TL0,#0BHMOVTH0,#38HRETITNTT0:;中断入口;;DJNZ R0,DIAY1MOVR0,#18;;;;;;;;;;; 秒加1; ;;;;;;;;;;;;;低位;;;MOV A,SECLSS:INC AMOV SECL,AJNB P3.2,AS;;;设置分JNBP3.1,HH1;;;设置时WWQ:CJNE A,#0AH,DIAY1MOV SECL,#00H;;高位;;;;MOV A,SECHINC AMOV SECH,ACJNEA,#06H,DIAY1MOV SECH,#00H;;;;;;;;;;; 分加1 ;;;;;;;;;;;;;;低位;;;MOV A,MINLINC AMOVMINL,ACJNE A,#0AH,DIAY1MOV MINL,#00H;;高位;;;;MOV A,MINHINC AMOV MINH,ACJNEA,#06H,DIAY1MOV MINH,#00H;;;;;;;;;;; 时加1; ;;;;;;;;;;;;;低位;;;MOV A,HOURLINC AINC R1MOV HOURL,ACJNE R1,#24,D1LCALL D2D1:CJNEA,#0AH,DIAY1MOV HOURL,#00H;;高位;;;;MOV A,HOURHINC AMOV HOURH,ACJNE A,#03H,DIAY1MOVHOURH,#00HRETHH1:LCALL HHRETAS:LCALL MMRET;;;;;;;;;;;;;;;;;24小时清0;;;;;;;;;;;;;;;;D2:MOV A,#0AHMOV R1,#00HRET;;;结束加1子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;动态扫描时间显示;;;;;;;;;;;;;;;;;;;;KK:LCALLONF7RETONOFF1:LCALL ONOFFRETDDD1:JNB P3.3,$LCALL NUOL1RETDIS:;;;秒;;;JNB P3.0,ONOFF1;;直开关机JNB P3.3,ddd1;;;进入闹钟设置JNB P3.4,KK;;;定时开关机MOV DPTR,#TABMOV A,SECLMOVC A,@A+DPTRMOV P0,AMOV P2,41HLCALL DIAYMOV A,SECHMOVC A,@A+DPTRMOV P0,AMOV P2,42HLCALL DIAY;;;;分;;;MOV A,MINLMOVC A,@A+DPTRMOV P0,AMOVP2,43HSETB P0.2LCALL DIAYMOV A,MINHMOVC A,@A+DPTRMOV P0,AMOV P2,44HLCALL DIAY;;;;时;;;;;MOV A,HOURLMOVC A,@A+DPTRMOV P0,AMOV P2,45HSETB P0.2LCALL DIAYMOV A,HOURHMOVC A,@A+DPTRMOV P0,AMOV P2,46HLCALL DIAYMOV A,MINLLCCG:;;铃声比较;;;;;;;CJNE A,36H,DFMOVA,MINHCJNE A,37H,DFMOV A,HOURLCJNE A,38H,DFMOV A,HOURHCJNE A,39H,DFLCALL LCDF:;;定时开机比较;;;;;;;MOV A,MINLCJNEA,60H,DGMOV A,MINHCJNE A,61H,DGMOV A,HOURLCJNE A,62H,DGMOV A,HOURHCJNE A,63H,DGLCALL OONDG:;;定时关机比较;;;;;;;MOV A,SECLCJNE A,#00H,TTMOVA,SECHCJNE A,#00H,TTMOV A,MINLCJNE A,64H,TTMOV A,MINHCJNE A,65H,TTMOV A,HOURLCJNE A,66H,TTMOV A,HOURHCJNE A,67H,TTLCALLOFFTT:RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;设置时钟,分&时;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;MM:;;;设置分;;;;MOV 30H,#00HMOV 31H,#00HMOV A,MINLINC AMOV MINL,ACJNE A,#0AH,DDMOV MINL,#00HMOV A,MINHINC AMOV MINH,ACJNE A,#06H,DDMOV MINH,#00H HH:;;设置时;;;MOV 30H,#00HMOV 31H,#00HMOVA,HOURLINC AINC R1MOV HOURL,ACJNE R1,#24,D4LCALL D2D4:CJNE A,#0AH,DDMOV HOURL,#00HMOV A,HOURHINC AMOV HOURH,ACJNE A,#03H,DDMOV HOURH,#00HDD:LCALL WWQRET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;铃声;;;;;;;;;;;;;;;;;LC:LCALL DIAYCLR P2.7LCALL DELAYRET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;按键直开关机子程序;;;;;;;;;;;;;;;;;;;;;;;;ONOFF:;;JNB P3.0,$LCALL DELAY1LCALL MNLCALL DELAYMOV 41H,#0FFHMOV42H,#0FFHMOV 43H,#0FFHMOV 44H,#0FFHMOV45H,#0FFHMOV 46H,#0FFHDJNZ R3,END1LCALL DELAY1MOV 41H,#0FEHMOV 42H,#0FDHMOV 43H,#0FBHMOV44H,#0F7HMOV 45H,#0EFHMOV 46H,#0DFHMOVR3,#02HEND1:LJMP SSRET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;按键响声;;;;;;;;;;;;;;MN:CLR P2.7LCALL DIAYRET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定时开关机子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ONF7:JN B P3.4,$LCALL MNLCALL DELAYONF:;;;开设置;;;;;JNB P3.0,ONF3;跳到关设置JNB P3.4,ON1;分设置JNBP3.3,ON2;时设置LCALL ON5;;显示分LCALL ON6;;显示时LJMP ONFONF3:;;关设置;;;;JNB P3.0,$LCALLMNONF1:JNB P3.0,EE;;返回;;JNB P3.4,ON3;分设置JNB P3.3,ON4;时设置LCALL ON7;;显示分 LCALL ON8;;显示时 LJMPONF1EE:JNB P3.0,$LCALL MNLJMP CSRETON1:;;;开机分设置加1;;JNB P3.4,$LCALL MNMOV A,60HINC AMOV 60H,ACJNE A,#0AH,ONF5MOV 60H,#00HMOVA,61HINC AMOV 61H,ACJNE A,#06H,ONF5MOV61H,#00HONF5:LJMP ONFON2:;;;开机时设置加1;;JNB P3.3,$LCALL MNMOV A,62HINC AINC R4MOV 62H,ACJNE R4,#24,FFLCALLON69FF:CJNE A,#0AH,ONF5MOV 62H,#00HMOV A,63HINC AMOV 63H,ACJNE A,#03H,ONF5MOV 63H,#00HLJMP ONFON69:;24小时清0MOV A,#0AHMOV R4,#00HRETON3:;;关机分设置加1;;JNB P3.4,$LCALL MNMOVA,64HINC AMOV 64H,ACJNE A,#0AH,ONF6MOV 64H,#00HMOV A,65HINC AMOV 65H,ACJNE A,#06H,ONF6MOV65H,#00HONF6:LJMP ONF1ON4:;;关机时设置加1;;JNB P3.3,$LCALL MNMOVA,66HINC AINC R5MOV 66H,ACJNE R5,#24,FF11LCALLFF22FF11:CJNE A,#0AH,ONF0MOV 66H,#00HMOV A,67HINC AMOV 67H,ACJNE A,#03H,ONF0MOV 67H,#00HONF0:LJMP ONF1FF22:;24小时清0MOV A,#0AHMOV R5,#00HRETON5:;;开机显示分 ;MOV DPTR,#TABMOV A,60HMOVCA,@A+DPTRMOV P0,AMOV P2,43HLCALL DIAYMOV A,61HMOVC A,@A+DPTRMOV P0,AMOV P2,44HLCALL DIAYRETON6:;;开机显示时 ;MOV DPTR,#TABMOV A,62HMOVC A,@A+DPTRMOVP0,ASETB P0.2MOV P2,45HLCALL DIAYMOV A,63HMOVCA,@A+DPTRMOV P0,ASETB P0.2MOV P2,46HLCALL DIAYRETON7:;;关机显示分 ;MOV DPTR,#TABMOV A,64HMOVC A,@A+DPTRMOV P0,ASETB P0.2MOV P2,43HLCALL DIAYMOV A,65HMOVC A,@A+DPTRMOV P0,ASETB P0.2MOV P2,44HLCALL DIAYRETON8:;;关机显示时 ;MOV DPTR,#TABMOVA,66HMOVC A,@A+DPTRMOV P0,ASETB P0.2MOV P2,45HLCALL DIAYMOV A,67HMOVC A,@A+DPTRMOV P0,ASETB P0.2MOVP2,46HLCALL DIAYRETOFF:;;定时关机MOV 41H,#0FFHMOV 42H,#0FFHMOV 43H,#0FFHMOV 44H,#0FFHMOV 45H,#0FFHMOV46H,#0FFHRETOON:;;定时开机MOV 41H,#0FEHMOV42H,#0FDHMOV 43H,#0FBHMOV 44H,#0F7HMOV45H,#0EFHMOV46H,#0DFHRET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;铃声设置;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DDD :JNB P3.0,$LCALL MNLJMP CS;;返回;;RETNUOL1:MOV36H,#0BHNUOL:JNB P3.0,DDD;;返回;;JNB P3.4,WW1;跳设置分JNB P3.3,WW2;跳设置时LCALL NUOL2;;跳显示分LCALL NUOL3;;跳显示时LJMP NUOLWW1: ;;设置分JNB P3.4,$LCALL MNMOV A,36HINC AMOV36H,ACJNE A,#0AH,NUOLMOV 36H,#00HMOV A,37HINC AMOV 37H,ACJNE A,#06H,NUOLMOV 37H,#00HLJMP NUOLWW2:;;设置时JNB P3.3,$LCALL MNMOV A,38HINC AINC R2MOV 38H,ACJNE R2,#24,D0LCALL D9D0:CJNEA,#0AH,NUOLMOV 38H,#00HMOV A,39HINC AMOV 39H,ACJNE A,#03H,NUOLMOV 39H,#00HLJMP NUOLD9:;24小时清0MOV A,#0AHMOV R2,#00HMOV 36H,#00HMOV 37H,#00HRETNUOL2:;;显示分MOV DPTR,#TABMOV A,36HMOVCA,@A+DPTRMOV P0,AMOV P2,43HLCALL DIAYMOV A,37HMOVC A,@A+DPTRMOV P0,AMOV P2,44HLCALL DIAYRETNUOL3:;;显示分MOV DPTR,#TABMOV A,38HMOVC A,@A+DPTRMOVP0,AMOV P2,45HLCALL DIAYMOV A,39HMOVC A,@A+DPTRMOV P0,AMOV P2,46HLCALL DIAYRET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;延时& ;;;;;;;;;;;;;;;;;;DELAY:;延时子程序.MOV R7,#0AHD7:MOV R6,#0FFH;Dp:DJNZ R6,DpDJNZ R7,D7;RET;DIAY:MOV R6,#05HT2:MOV R7,#0FFHDJNZR7,$DJNZ R6,T2RETDELAY1:;延时子程序.MOV R7,#0FFHD71:MOV R6,#0FFH;Dp1:DJNZ R6,Dp1DJNZ R7,D71;RET;TAB:DB 0EBH,081H,0DAH,0D9H,0B1HDB 079H,07BH,0C1H,0FBH,0F9HRETEND。