一、 首先看几张图片给大家一个整体印象:
1. 直插的DS1302时钟芯片:
图1
2. 贴片封装的DS1302时钟芯片:
图2
3. 用DS1302和1602做的数字时钟:
图3
图3为用单片机从DS1302中读取时间,然后把时间显示在1602液晶上。1602上第一行显示的是年月日和星期,第二行显示的为时分秒。
二、 DS1302概述:
1. 通俗易懂言诠释DS1302:
DS1302是时钟芯片,那它就有计时的作用。他和我们日常接触的电子表差不多,可以对年月日、时分秒、星期计时。我们可以用单片机往DS1302里面写入时间进行时间设置,也可以用单片机从DS1302中读取时间,读出来的时间也可以放在液晶上显示。这样我们就可以实现一块电子表的功能了。
2. DS1302封装及引脚分布:
从图1和图2我们看到DS1302有两种封装,一种是直插式的,另
一种为贴片式封装,而且DS1302有八个管脚。介绍如下:
好了, 看了芯片的引脚图是不是觉得挺简单的啊! 晶振两个脚, GND一个脚, VCC两个脚, 我们尽需要关心的只剩下三个脚了. RST引脚的操作非常简单,给它高电平表示启动芯片让芯片工作(低电平复位,高电平时芯片正常),给它低电平表示不让芯片工作。SCLK引脚表示时钟引脚,它给IO引脚数据的传输提供时序。
3. DS1302的特点:
时钟计数功能,可以对秒、分钟、小时、月、
星期、年的计数。年计数可达到2100 年。
有31*8 位的额外数据暂存寄存器(即RAM,掉电丢失)
最少I/O 引脚传输,通过三引脚控制
工作电压:2.0-5.5V
工作电流小于320 纳安(2.0V)
读写时钟寄存器或内部RAM(31*8 位的额外
数据暂存寄存)可以采用单字节模式(一次读写单个字节)和突发模式(一次读写多个字节)
8-pin DIP (直插封装)或8-pin SOICs(贴片封装)
三、 DS1302操作:
1. 开发板电路图:
图4 开发板电路图
从电路图中我们可以看到,RST片选使能引脚接到了单片机的P3.0引脚,SCLK时钟引脚接到而来单片机的P3.3引脚,IO引脚接到了单片机的P2.4引脚。
2.时序与数据读写:
对于操作一个芯片而言,最重要的应该是如何根据它的时序图向它里面写入数据和读取数据。时序就是高低电平随时间的变化,和我们见到的波形随时间变化差不多。下面教大家如何往芯片里面写数据,如何从芯片里面读数据。温馨提示:在读写芯片时,一般需要先写入寄存器或RAM的地址(有时也成为写入命令),然后才能对芯片的寄存器或RAM进行读写操作!
2.1 往芯片里写数据:
因为芯片只识别0和1,所以写数据无非就是往芯片里面写0和1。那芯片又是如何识别0和1的呢?其实我们只要在特定的时间把控制线置为高电平或拉为低电平就可以了。下面看下时序图:
图5 DS1302写时序
先看RST引脚(复位引脚),标号上面的一个横杠表示此引脚低电平有效,也即给它低电平后芯片复位,不能正常工作。所以欲使芯片正常工作,此引脚应该给高电平,从时序图中也可以看出,我们进行写操作的时候RST引脚应该置为高电平。
再看SCLK时钟引脚和IO引脚。图中的黑色箭头表示写入的数据在上升沿锁存。也就是说如果我们要往DS1302里面写入一位二进制数据,首先应该把SCLk引脚拉低,然后把我们要写入的一位二进制数据送到IO口,再把SCLK时钟线拉高,此时数据就被送到DS1302中了。还有一点需要注意,写数据的时候先写低位,后读写高位。读写的时候,先写地址,后写数据。大家可能会有点晕了吧,呵呵,分析下下面的代码大家就明白了:
写操作的代码:
//地址、数据发送子程序
void Write1302 ( uchar addr,dat )
{
uchar i,temp,m,n;
RST=0; //RST引脚为低,数据传送中止
SCLK=0; //清零时钟总线
RST = 1; //RST引脚为高,逻辑控制有效
//发送地址
for ( i=8; i>0; i-- ) //循环8次移位
{
SCLK = 0; //先把时钟线拉低
temp = addr;
DIO = (bit)(temp0x01); //每次传输低字节,数据放到数据端口
addr >>= 1; //右移一位
SCLK = 1; //把时钟线拉高,锁存数据
}
//发送数据
m=dat/10; //存储的时候,高四位存储十位,低四位存储个位,所以需要转换
n=dat%10;
dat=m*16+n; //十进制转化为十六进制,高四位存放十
位,第四位存放个位
for ( i=8; i>0; i-- )
{
SCLK = 0; //先把时钟线拉低
temp = dat;
DIO = (bit)(temp0x01); //只取最低一位
dat >>= 1; //右移一位
SCLK = 1; //把时钟线拉高,锁存数据
}
RST = 0; //数据传送中止
}
2.2 从DS1302中读取数据:
图6 DS1302的读时序
先看RST引脚(复位引脚),标号上面的一个横杠表示此引脚低电平有效,也即给它低电平后芯片复位,不能正常工作。所以欲使芯片正常工作,此引脚应该给高电平,从时序图中也可以看出,我们进行写操作的时候RST引脚应该置为高电平。
再看SCLK时钟引脚和IO引脚。图中的前八位的黑色箭头表示写入的数据在上升沿锁存,后八位的黑色箭头表示下降沿读取数据。也就是说如果我们要从DS1302里面读出一位二进制数据,首先应该把SCLk引脚拉高,然后把SCLK拉低(在SCLK拉低的一瞬间DS1302的数据送到了IO端口上),再把IO口上的数据存入变量,此时就读到了一位二进制数据。还有一点需要注意,读数据的时候先读低位,后读高位。读写的时候,先写地址,后读写数据。大家可能会有点晕了吧,呵呵,分析下下面的代码大家就明白了:
对应代码:
//数据读取子程序
uchar Read1302 ( uchar addr )
{
uchar i,temp,dat1,dat2;
RST=0; //芯片处于复位状态
SCLK=0; //清零
RST = 1; //芯片开始工作
//发送地址
for ( i=8; i>0; i-- ) //循环8次移位
{
SCLK = 0; //时钟线拉低
temp = addr;
DIO = (bit)(temp0x01); //每次传输低位
addr >>= 1; //右移一位
SCLK = 1;
}
//读取数据
for ( i=8; i>0; i-- )
{
SCLK = 1;//时钟线拉高
SCLK = 0;//时钟线拉低
ACC_7=DIO;//读取数据,ACC_7为存放数据变量的最高位一位
ACC>>=1;//右移一位
}
RST=0; //禁止芯片工作
dat1=ACC;
dat2=dat1/16; //数据进制转换,提取高四位,作为十位
dat1=dat1%16; //提取第四位,作为个位
dat1=dat1+dat2*10; //得到的十进制数
return (dat1); //返回十进制值
}