① 时钟芯片DS1302调整时间的思路是怎么样的最好能给一个调整时间的程序,谢谢
我级别太低不能穿电路图!!
#ifndef _1602_yejing_
#define _1602_yejing_
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P3^4;
sbit lcdrs=P3^5;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_lcd(uchar x,char *cha)
{ uchar length,i=0;
write_com(x);
for(length=0;cha[length]!=0;length++);
for(i=0;i<length;i++)
{
write_data(cha[i]);
delay(5);
}
}
void write_bcd(uchar cha)
{
uchar ch1,ch2;
ch1=(cha&0x0f)+'0';
ch2=((cha>>4)&0x0f)+'0';
write_data(ch2);
write_data(ch1);
}
void write_fd(float t)//显示float型函数
{ uchar s1,s2,s3,s4;
uint tt;
tt=t*100;
s1=tt/1000;s1+=0x30;
s2=tt%1000/100;s2+=0x30;
s3=tt%1000%100/10;s3+=0x30;
s4=tt%10;s4+=0x30;
write_data(s1);
write_data(s2);
write_data(46);
write_data(s3);
write_data(s4);
}
void init()
{
lcden=0;
write_com(0x38);//设置16*2显示
write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//写一个字符后地址指针加
write_com(0x01);//显示清0,数据指针清0
}
#endif
/**************************************************************************
THE REAL TIMER DS1302 DRIVER LIB
COPYRIGHT (c) 2010 BY ZYK.
-- ALL RIGHTS RESERVED --
File Name: DS1302.h
Author: ZHANG YUAN KE
Created: 2010/06/21
Modified: NO
Revision: 1.0
***************************************************************************/
#ifndef _DS1302_2010_06_21_
#define _DS1302_2010_06_21_
sbit SCLK = P1^6; //实时时钟时钟线引脚
sbit DIO = P1^7; //实时时钟数据线引脚
sbit CE = P1^5; //实时时钟复位线引脚
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
char sec,min,hour,day,mon,week,year;
char *tab[7]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat",};
void write_1302(uchar add,uchar dat)
{
uchar i;
ACC=add;
CE=0;
SCLK=0;
CE=1;
for(i=0;i<8;i++)
{
DIO=ACC0;
SCLK=1;
SCLK=0;
ACC>>=1;
}
ACC=dat;
for(i=0;i<8;i++)
{
DIO=ACC0;
SCLK=1;
SCLK=0;
ACC>>=1;
}
CE=0;
}
uchar read_1302(uchar add)
{
uchar i;
ACC=add;
CE=0;
SCLK=0;
CE=1;
for(i=8;i>0;i--) // 为什么不能for(i=0;i<8;i++) 又为什么用我写的函数不能改时间!!!!!!!!!!!!
{
DIO=ACC0;
SCLK=1;
ACC>>=1;
SCLK=0;
}
for(i=8;i>0;i--)
{ ACC>>=1;
ACC7=DIO;
SCLK=1;
SCLK=0;
}
return(ACC);
CE=0;
}
void inputbyte(uchar d) //实时时钟写入一字节(内部函数)
{
uchar i;
ACC=d;
for(i=8;i>0;i--)
{
DIO=ACC0; //相当于汇编中的 RRC
SCLK=1;
SCLK=0;
ACC>>=1;
}
}
uchar outputbyte() //实时时钟读取一字节(内部函数)
{
uchar i;
for(i=8; i>0; i--)
{
ACC=ACC>>1; //相当于汇编中的 RRC
ACC7=DIO;
SCLK=1;
SCLK=0;
}
return(ACC);
}
void write_1302(uchar add,uchar dat) //ucAddr: DS1302地址, ucData: 要写的数据
{
CE=0;
SCLK=0;
CE=1;
inputbyte(add); // 地址,命令
inputbyte(dat); // 写1Byte数据
CE=0;
}
uchar read_1302(uchar add) //读取DS1302某地址的数据
{
uchar dat;
CE=0;
SCLK=0;
CE=1;
inputbyte(add); // 地址,命令
dat=outputbyte(); // 读1Byte数据
CE=0;
return(dat);
}
void setprotect(bit flag)
{
if(flag)
write_1302(0x8e,0x80);
else
write_1302(0x8e,0x00);
}
void gettime_1302()
{
sec=read_1302(0x81);
min=read_1302(0x83);
hour=read_1302(0x85);
day=read_1302(0x87);
mon=read_1302(0x89);
week=read_1302(0x8b);
year=read_1302(0x8d);
}
void stop_time(bit flag) // 是否将时钟停止
{
unsigned char dat;
dat=read_1302(0x81);
setprotect(0);
if(flag)
write_1302(0x80, dat|0x80);
else
write_1302(0x80, dat&0x7F);
}
void init_1302()
{
uchar second=read_1302(0x81);
if(second&0x80)
write_1302(0x80,0);
}
/********************************************************************************
void BurstWrite1302(unsigned char *pWClock) //往DS1302写入时钟数据(多字节方式)
{
unsigned char i;
Write1302(0x8e,0x00); // 控制命令,WP=0,写操作?
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(0xbe); // 0xbe:时钟多字节写命令
for (i = 8; i>0; i--) //8Byte = 7Byte 时钟数据 + 1Byte 控制
{
DS1302InputByte(*pWClock); // 写1Byte数据
pWClock++;
}
DS1302_CLK = 1;
DS1302_RST = 0;
}
void BurstRead1302(unsigned char *pRClock) //读取DS1302时钟数据(时钟多字节方式)
{
unsigned char i;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(0xbf); // 0xbf:时钟多字节读命令
for (i=8; i>0; i--)
{
*pRClock = DS1302OutputByte(); // 读1Byte数据
pRClock++;
}
DS1302_CLK = 1;
DS1302_RST = 0;
}
********************************************************************************/
#endif
#include "1602.h"
#include "DS1302.h"
sbit set=P3^2;
sbit jia1=P3^0;
sbit jian1=P3^1;
uchar slect=0;
uchar bcdtoasc(uchar cha)
{
return ((cha/16)*10+(cha%16));
}
uchar asctobcd(uchar cha)
{
return ((cha/10)*16+(cha%10));
}
void disp_week()
{ switch(week)
{
case 1:{write_lcd(0xcd,tab[0]); break;}
case 2:{write_lcd(0xcd,tab[1]); break;}
case 3:{write_lcd(0xcd,tab[2]); break;}
case 4:{write_lcd(0xcd,tab[3]); break;}
case 5:{write_lcd(0xcd,tab[4]); break;}
case 6:{write_lcd(0xcd,tab[5]); break;}
case 7:{write_lcd(0xcd,tab[6]); break;}
}
}
void disp_time()
{
write_com(0x87);
write_bcd(year);
write_com(0x8a);
write_bcd(mon);
write_com(0x8d);
write_bcd(day);
write_com(0xc5);
write_bcd(hour);
write_com(0xc8);
write_bcd(min);
write_com(0xcb);
write_bcd(sec);
disp_week();
}
void keyscan()
{
set=1;
jia1=1;
jian1=1;
stop_time(1);
if(set==0)
{delay(10);
if(set==0)
{
delay(200);
slect++;
}
if(slect==8)
{slect=0; stop_time(0);write_com(0x0c);}
}
if(slect)
{
switch(slect)
{ case 1:{
write_com(0xcb);
write_com(0x0d);
if(jia1==0)
{delay(10);
if(jia1==0)
{
delay(200);
sec=read_1302(0x81);
sec=sec&0x7f;
sec=bcdtoasc(sec);
sec+=1;
if(sec==60)
sec=0;
sec=asctobcd(sec);
write_1302(0x80,sec);
write_com(0x0c);
write_bcd(sec);
}
}
if(jian1==0)
{
delay(10);
if(jian1==0)
{ delay(200);
sec=read_1302(0x81);
sec=sec&0x7f;
sec=bcdtoasc(sec);
sec-=1;
if(sec<0)sec=59;
sec=asctobcd(sec);
write_1302(0x80,sec);
write_com(0x0c);
write_bcd(sec);
}
}
break;
}
case 2:{write_com(0xc8);
write_com(0x0d);
if(jia1==0)
{delay(10);
if(jia1==0)
{
delay(200);
min=read_1302(0x83);
min=bcdtoasc(min);
min+=1;
if(min==60)
min=0;
min=asctobcd(min);
write_1302(0x82,min);
write_com(0x0c);
write_bcd(min);
}
}
if(jian1==0)
{
delay(10);
if(jian1==0)
{ delay(200);
min=read_1302(0x83);
min=bcdtoasc(min);
min-=1;
if(min<0)min=59;
min=asctobcd(min);
write_1302(0x82,min);
write_com(0x0c);
write_bcd(min);
}
}
break;}
case 3:{write_com(0xc5);
write_com(0x0d);
if(jia1==0)
{delay(10);
if(jia1==0)
{
delay(200);
hour=read_1302(0x85);
hour=bcdtoasc(hour);
hour+=1;
if(hour==24)
hour=0;
hour=asctobcd(hour);
write_1302(0x84,hour);
write_com(0x0c);
write_bcd(hour);
}
}
if(jian1==0)
{
delay(10);
if(jian1==0)
{ delay(200);
hour=read_1302(0x85);
hour=bcdtoasc(hour);
hour-=1;
if(hour<0)hour=23;
hour=asctobcd(hour);
write_1302(0x84,hour);
write_com(0x0c);
write_bcd(hour);
}
}
break;}
case 4:{write_com(0x8d);
write_com(0x0d);
if(jia1==0)
{delay(10);
if(jia1==0)
{
delay(200);
mon=read_1302(0x89);
year=read_1302(0x8d);
day=read_1302(0x87);
day=bcdtoasc(day);
day+=1;
year=bcdtoasc(year);
if(year%4==0)
{
if(mon==2)
{if(day==29)day=1;}
else if(day==30)day=1;
}
else{ switch(mon)
{case 1:{if(day==32)day=1;break;}
case 2:{if(day==30)day=1;break;}
case 3:{if(day==32)day=1;break;}
case 4:{if(day==31)day=1;break;}
case 5:{if(day==32)day=1;break;}
case 6:{if(day==31)day=1;break;}
case 7:{if(day==32)day=1;break;}
case 8:{if(day==32)day=1;break;}
case 9:{if(day==31)day=1;break;}
case 0x10:{if(day==32)day=1;break;}
case 0x11:{if(day==31)day=1;break;}
case 0x12:{if(day==32)day=1;break;}
}
if(mon==1|mon==3|mon==5|mon==7|mon==8|mon==0x10|mon==0x12)
if(day==32)day=0; */
if(mon==4|mon==6|mon==9|mon==0x11)
{if(day==31)day=1;}
else if(day==32)day=1;
}
day=asctobcd(day);
write_1302(0x86,day);
write_com(0x0c);
write_bcd(day);
}
}
if(jian1==0)
{
delay(10);
if(jian1==0)
{ delay(200);
day=read_1302(0x87);
day=bcdtoasc(day);
day-=1;
if(day<1)
{ mon=read_1302(0x89);
year=read_1302(0x8d);
switch(mon)
{ case 0x01: {day=31; break;}
case 0x02: {day=29; break;}
case 3: {day=31; break;}
case 4: {day=30; break;}
case 5: {day=31; break;}
case 6: {day=30; break;}
case 7: {day=31; break;}
case 8: {day=31; break;}
case 9: {day=30; break;}
case 0x10: {day=31; break;}
case 0x11: {day=30; break;}
case 0x12: {day=31; break;}
}
year=bcdtoasc(year);
if(year%4==0)if(mon==2)day=28;
}
day=asctobcd(day);
write_1302(0x86,day);
write_com(0x0c);
write_bcd(day);
}
}
break;}
case 5:{write_com(0x8a);
write_com(0x0d);
if(jia1==0)
{delay(10);
if(jia1==0)
{
delay(200);
mon=read_1302(0x89);
mon=bcdtoasc(mon);
mon+=1;
if(mon==13)
mon=1;
mon=asctobcd(mon);
write_1302(0x88,mon);
write_com(0x0c);
write_bcd(mon);
}
}
if(jian1==0)
{
delay(10);
if(jian1==0)
{ delay(200);
mon=read_1302(0x89);
mon=bcdtoasc(mon);
mon-=1;
if(mon<1)mon=12;
mon=asctobcd(mon);
write_1302(0x88,mon);
write_com(0x0c);
write_bcd(mon);
}
}
break;}
case 6:{write_com(0x87);
write_com(0x0d);
if(jia1==0)
{delay(10);
if(jia1==0)
{
delay(200);
year=read_1302(0x8d);
year=bcdtoasc(year);
year+=1;
if(year==100)
year=0;
year=asctobcd(year);
write_1302(0x8c,year);
write_com(0x0c);
write_bcd(year);
}
}
if(jian1==0)
{
delay(10);
if(jian1==0)
{ delay(200);
year=read_1302(0x8d);
year=bcdtoasc(year);
year-=1;
if(year<0)year=99;
year=asctobcd(year);
write_1302(0x8c,year);
write_com(0x0c);
write_bcd(year);
}
}
break;}
case 7:{write_com(0xcd);
write_com(0x0d);
if(jia1==0)
{delay(10);
if(jia1==0)
{
delay(200);
week=read_1302(0x8b);
week=bcdtoasc(week);
week+=1;
if(week==8)
week=1;
week=asctobcd(week);
write_1302(0x8a,week);
write_com(0x0c);
disp_week();
/* switch(week)
{
case 1:{write_lcd(0xcd,tab[0]); break;}
case 2:{write_lcd(0xcd,tab[1]); break;}
case 3:{write_lcd(0xcd,tab[2]); break;}
case 4:{write_lcd(0xcd,tab[3]); break;}
case 5:{write_lcd(0xcd,tab[4]); break;}
case 6:{write_lcd(0xcd,tab[5]); break;}
case 7:{write_lcd(0xcd,tab[6]); break;}
} */
}
}
if(jian1==0)
{
delay(10);
if(jian1==0)
{ delay(200);
week=read_1302(0x8b);
week=bcdtoasc(week);
week-=1;
if(week<1)week=7;
week=asctobcd(week);
write_1302(0x8a,week);
write_com(0x0c);
disp_week();
/* switch(week)
{
case 1:{write_lcd(0xcd,tab[0]); break;}
case 2:{write_lcd(0xcd,tab[1]); break;}
case 3:{write_lcd(0xcd,tab[2]); break;}
case 4:{write_lcd(0xcd,tab[3]); break;}
case 5:{write_lcd(0xcd,tab[4]); break;}
case 6:{write_lcd(0xcd,tab[5]); break;}
case 7:{write_lcd(0xcd,tab[6]); break;}
} */
}
}
break; }
}
}
}
main()
{
init();
init_1302();
write_lcd(0x80,"DATE:20 - -");
write_lcd(0x80+0x40,"TIME: : :");
while(1)
{
gettime_1302();
set=1;
if(set==0)
{delay(10);
if(set==0){delay(200);slect++;}
}
while(slect)
keyscan();
disp_time();
delay(30);
}
}
② ds1302时钟芯片怎么连单片机
ds1302时钟芯片采用I2C总线和单片机连接,如果 单 片机没有I2C总线接口,可以用普通IO口模拟
③ 请问,单片机学习板这个DS1032芯片为什么会烧掉
“做而论道”讲的很有道理,同意他的观点。一种可能的原因就是I/O冲突,具体地说就是:DS1302受到烧录程序的时序干扰,开始向外输出数据,而单片机或编程时序也向外输出数据。这样,如果DS1302输出1,而单片机或编程时序输出0,一高(5V)一低(0V),出现短路!那么,就会有很大的电流从DS1302输出,导致1302严重发热而烧毁。
另外,复位脚是低电平有效,高电平时DS1302正常工作;所以J10跳线连接上时,DS1302就开始工作了。
④ ds1302时钟芯片。。。谁给我看下这个程序液晶可以显示,但是时钟不会走显示的也不是我初始化的时间。
1、存储和读取的时间的内容应为BCD码。write_1302(0x8c,0x11);maioh=(miao&0x7f)>>4;……
2、建议上电后,ce=0;clk=0;延时一会儿再操作1302。或者多写两次撤销写保护命令。
write_1302(0x8e,0x10);笔误,应该是 write_1302(0x8e,0x80);
3、建议读写1302的clk速率降低,如datasheet,2MHz最大。
4、建议首次改写时间时,将秒值最高位置为1,时间设置完毕后,清秒值最高位。
5、建议,刷新LCD速率在100mS~500mS。没有必要不停地读1302,写1602。
6、检查硬件连接,及起振晶体。或更换一片1302再看看。
最后调试成功,请告知原因。谢谢!
⑤ DS1302芯片如何进行12/24 制显示时间转换的编程(C语言)
修改DS1302芯片的(85h、84h)寄存的BIT7进行12/24小时模式切换,BIT7=1是12小时模式,BIT7=0是24小时模式。
⑥ 时钟芯片DS1302功能及具体介绍
摘 要:介绍美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟电路DS1302的结构、工作原理及其在实时显示时间中的应用。它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能。给出DS1302在读写中的C51程序及流程图,以及在调试过程中的注意事项。
关键词:时钟电路;实时时钟;单片机;应用
1 引言
现在流行的串行时钟电路很多,如DS1302、 DS1307、PCF8485等。这些电路的接口简单、价格低廉、使用方便,被广泛地采用。本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。
2 DS1302的结构及工作原理
DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
2.1 引脚功能及结构
图1示出DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK始终是输入端。
2.2 DS1302的控制字节
DS1302 的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
2.3 数据输入输出(I/O)
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
2.4 DS1302的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
3 DS1302实时显示时间的软硬件
DS1302与CPU的连接需要三条线,即SCLK(7)、I/O(6)、RST(5)。图3示出DS1302与89C2051的连接图,其中,时钟的显示用LCD。
3.1 DS1302与CPU的连接
实际上,在调试程序时可以不加电容器,只加一个32.768kHz 的晶振即可。只是选择晶振时,不同的晶振,误差也较大。另外,还可以在上面的电路中加入DS18B20,同时显示实时温度。只要占用CPU一个口线即可。 LCD还可以换成LED,还可以使用北京卫信杰科技发展有限公司生产的10位多功能8段液晶显示模块LCM101,内含看门狗(WDT)/时钟发生器及两种频率的蜂鸣器驱动电路,并有内置显示RAM,可显示任意字段笔划,具有3-4线串行接口,可与任何单片机、IC接口。功耗低,显示状态时电流为2μA (典型值),省电模式时小于1μA,工作电压为2.4V~3.3V,显示清晰。
3.2 DS1302实时时间流程
图4示出DS1302的实时时间流程。根据此流程框图,不难采集实时时间。下面结合流程图对DS1302的基本操作进行编程:
根据本人在调试中遇到的问题,特作如下说明:
DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位LSB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。
在DS1302的时钟日历或RAM进行数据传送时,DS1302必须首先发送命令字节。若进行单字节传送,8位命令字节传送结束之后,在下2个SCLK周期的上升沿输入数据字节,或在下8个SCLK周期的下降沿输出数据字节。
DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,在此方式下可一次性读、写所有的RAM的31个字节。
要特别说明的是备用电源B1,可以用电池或者超级电容器(0.1F以上)。虽然DS1302在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池。可以用老式电脑主板上的3.6V充电电池。如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替。100 μF就可以保证1小时的正常走时。DS1302在第一次加电后,必须进行初始化操作。初始化后就可以按正常方法调整时间。
4 结论
DS1302 存在时钟精度不高,易受环境影响,出现时钟混乱等缺点。DS1302可以用于数据记录,特别是对某些具有特殊意义的数据点的记录,能实现数据与出现该数据的时间同时记录。这种记录对长时间的连续测控系统结果的分析及对异常数据出现的原因的查找具有重要意义。传统的数据记录方式是隔时采样或定时采样,没有具体的时间记录,因此,只能记录数据而无法准确记录其出现的时间;若采用单片机计时,一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且,某些测控系统可能不允许。但是,如果在系统中采用时钟芯片DS1302,则能很好地解决这个问题。