BCD码
用0b0000-0b1001表示0-9
0b1001加1自动进位为0b00010000
特性
1、DS1302是一个实时时钟芯片,可以提供秒、分、小时、日期、月、年等信息,并且还有软件自动调整的能力,可以通过配置AM/PM来决定采用24小时格式还是12小时格式。
2、拥有31字节数据存储RAM。
3、串行I/O通信方式,相对并行来说比较节省IO口的使用。
4、DS1302的工作电压比较宽,在2.0~5.5V的范围内都可以正常工作。
5、DS1302这种时钟芯片功耗一般都很低,它在工作电压2.0V的时候,工作电流小于300nA。
6、DS1302共有8个引脚,有两种封装形式,一种是DIP-8封装,芯片宽度(不含引脚)是300mil,一种是SOP-8封装,有两种宽度,一种是150mil,一种是208mil。
7、当供电电压是5V的时候,兼容标准的TTL电平标准,这里的意思是,可以完美的和单片机进行通信。
8、由于DS1302是DS1202的升级版本,所以所有的功能都兼容DS1202。此外DS1302有两个电源输入,一个是主电源,另外一个是备用电源,比如可以用电池或者大电容,这样做是为了在系统掉电的情况下,我们的时钟还会继续走。
硬件信息
引脚功能
寄存器介绍
寄存器内部采用BCD码
指令讲解:
DS1302 的一条指令一个字节共 8 位,其中第 7 位(即最高位)固定为 1,这一位如果是0 的话,那写进去也是无效的。第 6 位是选择 RAM 还是 CLOCK 的,如果选择 CLOCK 功能,第 6位是 0,如果要用 RAM,那第 6 位就是 1。从第 5 到第 1 位,决定了寄存器的 5 位地址,而第 0 位是读写位,如果要写,这一位就是 0,如果要读,这一位就是 1。
DS1302 时钟的寄存器,其中 8 个和时钟有关的,5 位地址分别是 0b00000~0b00111,还有一个寄存器的地址是 01000,这是涓流充电所用的寄存器,我们这里不讲。在 DS1302 的数据手册里的地址,直接把第 7 位、第 6 位和第 0 位值给出来了,所以指令就成了 0x80、0x81那些了,最低位是 1,那么表示读,最低位是 0 表示写,如图 15-10 所示。
寄存器详解
寄存器 0:最高位 CH 是一个时钟停止标志位。如果时钟电路有备用电源,上电后,我们要先检测一下这一位,如果这一位是 0,那说明时钟芯片在系统掉电后,由于备用电源的供给,时钟是持续正常运行的;如果这一位是 1,那么说明时钟芯片在系统掉电后,时钟部分不工作了。如果 Vcc1 悬空或者是电池没电了,当我们下次重新上电时,读取这一位,那这一位就是 1,我们可以通过这一位判断时钟在单片机系统掉电后是否还正常运行。剩下的7 位高 3 位是秒的十位,低 4 位是秒的个位,这里再提请注意一次,DS1302 内部是 BCD 码,而秒的十位最大是 5,所以 3 个二进制位就够了。
寄存器 1:最高位未使用,剩下的 7 位中高 3 位是分钟的十位,低 4 位是分钟的个位。
寄存器 2:bit7 是 1 的话代表是 12 小时制,0 代表是 24 小时制;bit6 固定是 0,bit5 在12 小时制下 0 代表的是上午,1 代表的是下午,在 24 小时制下和 bit4 一起代表了小时的十位,低 4 位代表的是小时的个位。
寄存器 3:高 2 位固定是 0,bit5 和 bit4 是日期的十位,低 4 位是日期的个位。
寄存器 4:高 3 位固定是 0,bit4 是月的十位,低 4 位是月的个位。
寄存器 5:高 5 位固定是 0,低 3 位代表了星期。
寄存器 6:高 4 位代表了年的十位,低 4 位代表了年的个位。请特别注意,这里的 00~99 指的是 2000 年~2099 年。
寄存器 7:最高位一个写保护位,如果这一位是 1,那么是禁止给任何其它寄存器或者那 31 个字节的 RAM 写数据的。因此在写数据之前,这一位必须先写成 0。
通信时序
sbit DS1302_CE=P1^7;//使能
sbit DS1302_CK=P3^5;//时钟信号
sbit DS1302_IO=P3^4;//信号读写
读
先写指令在读字节
上升沿发送,下降沿读取数据
//从DS1302通信总线上读取一个字节
unsigned char DS1302ByteRead()
{
unsigned char mask;
for(mask=0x01;mask!=0;mask<<=1)
{
if(DS1302_IO!=0)
dat|=mask;
DS1302_CK=1;
DS1302_CK=0;
}
return dat;
}
//用单次操作从某一寄存器中读取一个字节,reg为寄存器地址,dat为待写入字节
unsigned char DS1302SingleRead(unsigned char reg)
{
unsigned char dat;
DS1302_CE=1;
DS1302ByteWrite((reg<<1)|0x81);
dat=DS1302ByteRead();
DS1302_E=0;
return dat;
}
写
1、首先写字节指令,指明寄存器地址以及后续操作是写操作
2、写入一个字节数据
在下降沿发送数据,从机上升沿附近进行采样
//发送单个字节到DS1302通信总线上
void DS1302ByteWrite(unsigned char dat)
{
unsigned char mask;
for(mask=0x01;mask!=0;mask<<=1)//低位先读
{
if((mask&dat)!=0)
DS1302_IO=1;
else
DS1302_IO=0;
DS1302_CK=1;
DS1302_CK=0;
}
}
//用单次写操作向某一寄存器写入一个字节,reg为寄存器地址,dat为待写入字节
void DS1302_SingleWrite(unsigned char reg,unsigned char dat)
{
DS1302_CE=1;
DS1302ByteWrite((reg<<1)|0x80);//写入指令,寄存器地址即操作
DS1302ByteWrite(dat);
DS1302_CE=0;
}
BURST模式
主要是防止读取的时候,还没读完,数据又变化了,故先将寄存器的数据,输出到缓冲区内,读取数据时候是去缓冲区进行读取,写也是如此。
指令:
读0xBF
写0xBE