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;unsigned cahr dat=0;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;elseDS1302_IO=0;DS1302_CK=1;DS1302_CK=0;       }DS1302_IO=1;
}
//用单次写操作向某一寄存器写入一个字节,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

ds1302.c

#include <reg52.h>
sbit DS1302_CE=P1^7;//使能
sbit DS1302_CK=P3^5;//时钟信号
sbit DS1302_IO=P3^4;//信号读写
struct sTime{unsigned int year;unsigned char mon;unsigned char day;unsigned char hour;unsigned char min;unsigned char sec;unsigned char week;
};
//发送单个字节到DS1302通信总线上
void DS1302ByteWrite(unsigned char dat)
{unsigned char mask;for(mask=0x01;mask!=0;mask<<=1)//低位先读{if((mask&dat)!=0)DS1302_IO=1;elseDS1302_IO=0;DS1302_CK=1;DS1302_CK=0;       }DS1302_IO=1;
}
//从DS1302通信总线上读取一个字节
unsigned char DS1302ByteRead()
{unsigned char mask;unsigned char dat=0;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_CE=0;return dat;
}
//用单次写操作向某一寄存器写入一个字节,reg为寄存器地址,dat为待写入字节
void DS1302SingleWrite(unsigned char reg,unsigned char dat)
{DS1302_CE=1;DS1302ByteWrite((reg<<1)|0x80);//写入指令,寄存器地址即操作DS1302ByteWrite(dat);DS1302_CE=0;
}
//突发模式连续写入8个寄存器数据
void DS1302BurstWrite(unsigned char *dat)
{unsigned char i;DS1302_CE=1;DS1302ByteWrite(0xBE);for (i=0;i<8;i++) //连续写入八个数据{DS1302ByteWrite(dat[i]);}DS1302_CE=0;
}
void DS1302BurstRead(unsigned char *dat)
{unsigned char i;DS1302_CE=1;DS1302ByteWrite(0xBF);for (i=0;i<8;i++) //连续写入八个数据{dat[i]=DS1302ByteRead();}DS1302_CE=0;
}
//获取实时时间
void GetRealTime(struct sTime *time)
{unsigned char buf[8];DS1302BurstRead(buf);time->year=buf[6]+0x2000;time->mon=buf[4];time->day=buf[3];time->hour=buf[2];time->min=buf[1];time->sec=buf[0];time->week=buf[5];
}
//设定实时时间
void SetRealTime(struct sTime *time)
{unsigned char buf[8];buf[7]=0;buf[6]=time->year;buf[5]=time->week;buf[4]=time->mon;buf[3]=time->day;buf[2]=time->hour;buf[1]=time->min;buf[0]=time->sec;DS1302BurstWrite(buf);
}
//初始化
void InitDS1302()
{unsigned char dat;struct sTime code InitTime[]={0x2019,0x08,0x29,0x12,0x00,0x00,0x02};DS1302_CE=0;DS1302_CK=0;dat=DS1302SingleRead(0);//读取秒寄存器if((dat&0x80)!=0) //判断时钟是否已经停止{DS1302SingleWrite(7,0x00);//撤销写保护以允许写入数据SetRealTime(&InitTime);//设置时钟为默认的初始时间}
}

实时时钟芯片DS1302相关推荐

  1. 电脑罗盘时钟代码_轻松吃透实时时钟芯片DS1302软硬件设计

    今天我们来讨论一款老掉牙的实时时钟芯片DS1302.什么是实时时钟(RealTime Clock, RTC)呢?为什么我们需要它呢?假设你使用单片机实现万年历应用,一般的做法是这样的:设置中断后判断1 ...

  2. ds1302模块 树莓派_(16)给树莓派B+ 安装一个实时时钟芯片DS1302

    在这里首先感谢glgoo在google被墙的情况下提供搜索功能,还要感谢 http://wiringpi.com/ 以及github,尽管自己眼瞎,几经波折还是发现了尘封已久的少林"七十二绝 ...

  3. FPGA:时钟模块设计-RTC实时时钟芯片DS1302

    前言 首先我要明确,这个RTC是在干什么,通过查阅DS1302芯片手册,我知道了,要想使用这块芯片,我需要用FPGA生成3个信号,然后用DS1302去实现具体功能,需要实现什么功能我先不用关心,现在需 ...

  4. 4.7 51单片机-DS1302 实时时钟芯片

    4.7 DS1302 实时时钟芯片 4.7.1 原理图介绍 图4-7-1 图4-7-2 驱动DS1302之前,实验板上需要将JP595跳线帽和J11跳线帽断开.JP1302跳线帽接上. 4.7.2 D ...

  5. DS1302实时时钟芯片

    DS1302 是 DALLAS(达拉斯) 公司推出的一款涓流充电时钟芯片, 2001 年 DALLAS 被 MAXIM(美信) 收购,因此我们看到的 DS1302 的数据手册既有 DALLAS 的标志 ...

  6. 关于实时时钟模块DS1302使用心得

    最近在做万年历,用到实时时钟DS1302模块,花了两天时间看资料和写驱动,想记录一下我的学习经过,顺便做一下总结. 首先就是在图书馆查各种资料,于是查到的大多是这些,主要时硬件方面的资料: 其实能查到 ...

  7. STM32使用库函数控制时钟芯片DS1302提供时间

    DS1302简介 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片.它可以对年.月.日.周.时.分.秒进行计时,并且具有闰年补偿等多种功能: 每天的天数和闰年的天数可 ...

  8. 实时时钟芯片DS3231应用笔记,使用指南,FAQ全集

     编者按:Maxim Integrated新型实时时钟(RTC) DS3231,内部集成了TCXO.RTC和32.768kHz晶体,并采用低成本.标准型.16引脚SOIC封装.在-40°C至+85°C ...

  9. 51单片机15单片机 时钟芯片DS1302

    目录 前言 一.DS18B20芯片介绍 二.芯片引脚定义与应用电路 三.寄存器定义 四.命令字 五.数据流 六.时序图与数据读写 6.1 单字节写(Write) 6.2 单字节读(Read) 6.3 ...

  10. 单片机外设系列之一时钟芯片DS1302

    标题 单片机外设之一(时钟芯片DS1302) 何为DS1302? DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片.它可以对年.月.日.周.时.分.秒进行计时,且具有 ...

最新文章

  1. centos 删除crontab_centos crontab(定时任务) 使用
  2. Square Card 计算几何-两圆相交面积
  3. Bootstrap4+MySQL前后端综合实训-Day10-AM【实训汇报-下午返校、项目代码(7个包+7个Html页面)】
  4. 牛客 - 降维打击(dp)
  5. 错误代码#1045 Access denied for user 'root'@'localhost' (using password:YES)
  6. python列表功能默写_Python list(列表)功能详解
  7. 读取nas_NAS怎么玩?除了存放小姐姐,它竟然还有这些功能
  8. 前端学习(3233):高阶函数函数柯里化案例
  9. post修改服务器数据源,postgresql安装及配置超详细教程
  10. Gradle学习之构建java与web项目
  11. jvm原理、启动时间、与编译器操作系统关系
  12. leetcode437. 路径总和 III
  13. 【NLP】45个小众而实用的NLP开源字典和工具
  14. 使用Cargo入门rust语言
  15. PHP数组按字符串长度排序
  16. 渗透测试-SQL注入检测
  17. MF前传——探索者一号液晶屏接线
  18. vtk实现一个简易的RubberBand 并求矩形内部hu平均值和最值
  19. 涂抺mysql 李丙洋_涂抹
  20. 剑指 Offer第 11 天 双指针(简单)

热门文章

  1. 看完一篇论文,如何写该论文研究思路?
  2. 舱机器人尾巴毛茸茸_并无卵用的毛茸茸机器人 如此呆萌 设计是为了爱
  3. 一元二次方程组求根问题
  4. html语言亚马逊后台,「亚马逊」新手卖家指南-页面与术语
  5. elasticsearch集群搭建报错[not enough master nodes discovered during pinging]
  6. Redis基础篇(一)
  7. python打印pdf文件_3条指令教会你用python创建中文pdf文件,适合批量打印,附送源码-pdf文件不能打印...
  8. C语言入门“hello word”编写
  9. 6大常见家谱样本,尤其第4个,深受各大名门望族的喜爱!
  10. 关于表单流程设计器 以及 问卷调查生成器的开发准备