接口/时钟/PLL
DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。我们知道DS1302 是实时时钟芯片,既然是时钟芯片它肯定还可以用作一般意义上的定时器(定时时间以秒为单位)。
DS1302是DALLAS(达拉斯)公司出的一款涓流充电时钟芯片,2001年DALLAS被MAXIM(美信)收购,因此我们看到的DS1302的数据手册既有DALLAS的标志,又有MAXIM的标志,大家了解即可。DS1302实时时钟芯片广泛应用于电话、传真、便携式仪器等产品领域,他的主要性能指标如下:
1、DS1302是一个实时时钟芯片,可以提供秒、分、小时、日期、月、年等信息,并且还有软件自动调整的能力,可以通过配置AM/PM来决定采用24小时格式还是12小时格式。
2、拥有31字节数据存储RAM。
3、串行I/O通信方式,相对并行来说比较节省IO口的使用。
4、DS1302的工作电压比较宽,大概是2.0V~5.5V都可以正常工作。
5、DS1302这种时钟芯片功耗一般都很低,它在工作电压2.0V的时候,工作电流小于300nA。
6、DS1302共有8个引脚,有两种封装形式,一种是DIP-8封装,芯片宽度(不含引脚)是300mil,一种是SOP-8封
装,有两种宽度,一种是150mil,一种是208mil.我1]看一下DS1302的引脚封装图,如图1所示。
ds1302是一块高性能芯片,是专用的时钟芯片,它的内部有31个寄存器,具有闰年自动补充功能,非常适合做计时器,那么ds1302是否准确了?理论上来说是没有绝对准确,只是误差小而已 上面说的定时 并不是让你用定时器去读取,定时不等于定时器只是让你一定时间读取一次时钟芯片的时间。
问:单片机需要定时去读取1302内部寄存器的数据,就是时间,秒,分,时,年,月,日等。
答:它是专业的时钟芯片,内部实现准确计时功能,只有晶振搞准了,负载电容对了就可以。
追问1:单片机的定时器本身不准确,嗯,我有点不明白定时器既然不准确,为什么还需要定时从时钟芯片读取时间数据?
2:时钟芯片本身是否能实现准确定时,还是需要单片机的定时器配合才能完成定时?
追答定时从时钟芯片读取数据,并一定要用定时器哦。时钟芯片计时是比较准确的,但也有误差,不是绝对准确。但比单片机定时器要好很多了。
1定时最大范围:小时
2 随时通过控制按键输入定时时间
3一直显示DS1302的实时时间
分析如F: 用DS1302 作为定时器首先需要定义两个数组,一个用作读取DS1302 的实
时时间now[]; 另一个用作需要定时时间暂存time[]; 我们知道从DS1302 中读取的数据格
式是压缩BCD码,即now[7]={秒,分,时,日,月,周,年}; 当控制按键按下时time[]存放
的应该是主观定时时问,之后要将其修改成压缩BCD码并与当前时间now[]的数据相加;
需要修正数据。
在控制按键按下后,一次输入时两位分两位秒两位; 若想要定时1分59秒,那么对
应输入的键值应该是time[6]= {0,0,0,1,5,9}_》_-=[0Oltime[1]= 时time[2]time[3]= 分
time[4]time[5]= 秒这样的表示与从DS1302读出的数据不一致,需要如下修改:
1秒处理:
time[4]《《= 4;
time[4]= time[4]+ time[]//time[4] 为秒的BCD 石马
time[2] 《《= 4;
2 分处理:
time[2]=time[2]+ timc[3];//ime[2] 为分的BCD 5 马
time[0]《《= 4;
3 时处理:
time[0]= time[O] + time[ ];/im[O] 为时的BCD 码
time[5]=time[0];
time[0]= time[4;秒
time[1]= time[2];分
docin.com
time[2]= time[$]/时
time[3]= time[4]= time[5]=0;
接下来就是要处理进位关系:
for( DATA_A= 0; DATA_A 《 3 ;DATA_A++)
time[DATA_A]=time[DATA_A] +now[DATA_A];// 当前8 间与定时时间相加
if(ime[DATA_A]&0x0)》0x09 )
if( DATA_A== 2 )break;
time[DATA_A] +=6;// 加6 修正
}
if(carry_flag )
time[DATA_A] += 1;
if(time[ DATA_A]&0x0f)== 0x0a)
{
time[DATA_A] &=0xf0;
time[DATA_A] +=0x10;
if((ime[DATA_A]&0xf0)》0X50)
{
time[DATA_A]-= 0x60;
carry_flag=1;
elsecarry_flag= 0;
}这样基本上完成对DS1302的数据处理。
全部0条评论
快来发表一下你的评论吧 !