实时时钟芯片DS1302

2023-10-27

一、DS1302主要介绍

1、DS1302 的特点

DS1302 是 DALLAS(达拉斯)公司推出的一款涓流充电时钟芯片。 DS1302 实时时钟芯片广泛应用于电话、传真、便携式仪器等产品领域,它的主要性能 指标如下:

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、 DS1302 有两个电源输入,一个是主电源,另外一个是备用电源,比如可以用电池或者大电容,这样 做是为了在系统掉电的情况下,我们的时钟还会继续走。如果使用的是充电电池,还可以在 正常工作时,设置充电功能,给我们的备用电池进行充电。

2、DS1302的硬件信息

 1 脚 VCC2 是主电源正极的引脚,2 脚 X1 和 3 脚 X2 是晶振输入和输出引脚,4 脚 GND 是负极,5 脚 CE 是使能引脚,接单片机的 IO 口,6 脚 I/O 是数据传输引脚,接单片机的 IO 口,7 脚 SCLK 是通信时钟引脚,接单片机的 IO 口,8 脚 VCC1 是备用电源引脚。考虑到 KST-51 开发板是一套以学习为目的的板子,加上备用电池对航空运输和携带不方便,所以 8 脚没有接备用电池,而是接了一个 10uF 的电容,这个电容就相当于一个电量很小的电池, 经过试验测量得出其可以在系统掉电后仍维持 DS1302 运行 1 分钟左右,如果大家想运行时 间再长,可以加大电容的容量或者换成备用电池,如果掉电后不需要它再维持运行,也可以干脆悬空

3、DS1302的时钟寄存器介绍

 寄存器 0:最高位 CH 是一个时钟停止标志位。停止后为1,正常工作为0。如果 Vcc1 悬空或者是电池没电了,当我们下次重新上电时,读取这一位,那这一位就是 1,我们可以通过这一位判断时钟在单片机系统掉电后是否还正常运行。剩下的 7 位高 3 位是秒的十位,低 4 位是秒的个位。

 寄存器 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。

二、DS1302的通信时序及代码示例

DS1302 通信有三根线,分别是 CE、I/O 和 SCLK,其中 CE 是使能线, SCLK 是时钟线,I/O 是数据线。我们会发现DS1302的通信方式与SPI很相似,但又不完全一致,接下来我们一起来看看他的通信时序。

单字节写入操作

 单字节读操作

大家会发现每次在读或写之前,都有一个字节的数据,那么这一个字节的数据是什么呢?接下来首先解决这个问题。我们讨论过DS1302的时钟寄存器,一共有八个,分别存储着时分秒年月日等信息,如果我们要进行写入秒的操作,我们就要找到对应存储秒数据的寄存器,因此我们就可以理解这一个字节的数据其实就是指明写入数据的地址。

理解了这点之后,我们接下来根据时序图理解一下怎么写入数据。我们根据时序图会发现,写入数据时,对应的有效信号是上升沿,而且数据是先发低位后发高位。下面我们用代码和详细注释来解释。

void DS1302_write(unsigned char bite)//写入
{ 
	unsigned char i;
    for(i=0;i<8;i++)
	{
		SCLK=0;
		IO=bite&(0x01<<i);//发送的数据
		SCLK=1;
		_nop_();
		SCLK=0;
	}
}

 接下来是写入一个完整字节的代码示例,其实写入一个字节就是在写入寄存器地址的基础上再次发送数据就可以了

void DS1302_writebite(unsigned char address,dat)
{
	/**电平初始化**/
    CE=0;_nop_();
	SCLK=0;_nop_();
	/**写入**/
	CE=1;
	DS1302_write(address);
	DS1302_write(dat);
	CE=0;
}

写入操作看完之后我们来讨论怎样读取一个字节,读取一个字节与写入一个字节相似,都是要先送一个地址指明是哪一个寄存器的,然后就是读取数据,这里有一点需要注意的是,DS1302中的数据都是以BCD码存储的,因此读出来或写入的数据都应该是BCD码,如果我们需要十进制数,我们还需要进行数制转换,代码及详细注释如下

unsigned char DS1302_readbite(unsigned char address)//读取一个字节
{
	unsigned char i;
	unsigned char dat=0x00;//定义接收数据的变量
	/**电平初始化**/
	CE=0;	_nop_();
 	SCLK=0;	_nop_();
	/**写入被操作寄存器地址**/
 	CE=1;	_nop_();
    DS1302_write(address);
	/**读取数据**/
	for(i=0;i<8;i++)//单片机读取DS1302发送的数据
	{
		SCLK=0;
		dat>>=1;
		if(IO)
        {
	     dat|=0x80;
	    }
		SCLK=1;
		SCLK=0;//下降沿有效
	}
	CE=0;_nop_();
	IO=0;_nop_();//释放数据总线
	dat=dat/16*10+dat%16;//将十六进制BCD码转为十进制
	return dat;
}

接下来我们写入一组时间

void DS1302_writetime()
{
	DS1302_writebite(0x8E,0x00);//关闭芯片写保护
	DS1302_writebite(0x80,0x00);//秒寄存器
	DS1302_writebite(0x82,0x50);//分寄存器
	DS1302_writebite(0x84,0x10);//时寄存器
	DS1302_writebite(0x86,0x05);//天寄存器
	DS1302_writebite(0x88,0x06);//月寄存器
	DS1302_writebite(0x8C,0x23);//年寄存器
	DS1302_writebite(0x8E,0x80);//开芯片写保护
}

然后读取时间

void DS1302_readtime()
{
	
	a[0]=DS1302_readbite(0x8D);//读年寄存器
	a[1]=DS1302_readbite(0x89);//读月寄存器
	a[2]=DS1302_readbite(0x87);//读天寄存器
	a[3]=DS1302_readbite(0x85);//读时寄存器
	a[4]=DS1302_readbite(0x83);//读分寄存器
	a[5]=DS1302_readbite(0x81);//读秒寄存器
}

这样DS1302写入时间和读取时间功能已经完成了。

下面我们想让读取出来的时间显示在LCD1602上,代码如下

main.c

#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"
extern unsigned char a[];
void main()
{
	LCD_Init();
  DS1302_writetime();
while(1)
	{
		DS1302_readtime();
		LCD_ShowNum(1,1,20,2);//显示20
		LCD_ShowNum(1,3,a[0],2);//显示年
		LCD_ShowChar(1,5,'-');
		LCD_ShowNum(1,6,a[1],2);//显示月
		LCD_ShowChar(1,8,'-');
		LCD_ShowNum(1,9,a[2],2);//显示日
		LCD_ShowNum(2,1,a[3],2);//显示时
		LCD_ShowChar(2,3,'-');
		LCD_ShowNum(2,4,a[4],2);//显示分
		LCD_ShowChar(2,6,'-');
		LCD_ShowNum(2,7,a[5],2);//显示秒
		}
}

DS1302.C

#include <REGX52.H>
#include <intrins.h>
sbit CE=P3^5;
sbit IO=P3^4;
sbit SCLK=P3^6;
unsigned char a[]={0,0,0,0,0,0};
void DS1302_write(unsigned char bite)//写入
{ 
	unsigned char i;
  for(i=0;i<8;i++)//发送数据
	{
		SCLK=0;
		IO=bite&(0x01<<i);
		SCLK=1;
		_nop_();
		SCLK=0;
	}
}
void DS1302_writebite(unsigned char address,dat)
{
	/**初始化**/
  CE=0;_nop_();
	SCLK=0;_nop_();
	/**写入**/
	CE=1;
	DS1302_write(address);
	DS1302_write(dat);
	CE=0;
}
unsigned char DS1302_readbite(unsigned char address)//读取一个字节
{
	unsigned char i;
	unsigned char dat=0x00;
	/**初始化**/
	CE=0;	_nop_();
 	SCLK=0;	_nop_();
	/**写寄存器地址**/
 	CE=1;	_nop_();
  DS1302_write(address);
	/**读取数据**/
	for(i=0;i<8;i++)//单片机读取DS1302发送的数据
	{
		SCLK=0;
		dat>>=1;
		if(IO)
    {
	   dat|=0x80;
	  }
		SCLK=1;
		SCLK=0;
	}
	CE=0;_nop_();
	IO=0;_nop_();
	dat=dat/16*10+dat%16;
	return dat;
}
void DS1302_writetime()
{
	DS1302_writebite(0x8E,0x00);//关闭芯片写保护
	DS1302_writebite(0x80,0x00);//秒寄存器
	DS1302_writebite(0x82,0x50);//分寄存器
	DS1302_writebite(0x84,0x10);//时寄存器
	DS1302_writebite(0x86,0x05);//天寄存器
	DS1302_writebite(0x88,0x06);//月寄存器
	DS1302_writebite(0x8C,0x23);//年寄存器
	DS1302_writebite(0x8E,0x80);//开芯片写保护
}
void DS1302_readtime()
{
	
	a[0]=DS1302_readbite(0x8D);//读年寄存器
	a[1]=DS1302_readbite(0x89);//读月寄存器
	a[2]=DS1302_readbite(0x87);//读天寄存器
	a[3]=DS1302_readbite(0x85);//读时寄存器
	a[4]=DS1302_readbite(0x83);//读分寄存器
	a[5]=DS1302_readbite(0x81);//读秒寄存器
}

lcd1602.c

#include <REGX52.H>

 
 
//引脚配置:
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0
void LCD_Delay()
{
	unsigned char i, j;
 
	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
}
void LCD_WriteCommand(unsigned char Command)
{
	LCD_RS=0;
	LCD_RW=0;
	LCD_DataPort=Command;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}
void LCD_WriteData(unsigned char Data)
{
	LCD_RS=1;
	LCD_RW=0;
	LCD_DataPort=Data;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
	if(Line==1)
	{
		LCD_WriteCommand(0x80|(Column-1));
	}
	else if(Line==2)
	{
		LCD_WriteCommand(0x80|(Column-1+0x40));
	}
}
void LCD_Init()
{
	LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
	LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
	LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
	LCD_WriteCommand(0x01);//光标复位,清屏
}
int LCD_Pow(int X,int Y)
{
	unsigned char i;
	int Result=1;
	for(i=0;i<Y;i++)
	{
		Result*=X;
	}
	return Result;
}
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实时时钟芯片DS1302 的相关文章

  • 基础不牢地动山摇之IO流1(File、FilelnputStream、FileOutputStream)

    目录 文件与文件流理解 创建文件常用的三种方式 File构造方法 获取文件信息 目录的操作和文件删除 1 删除文件 2 删除目录 3 创建多级目录 IO流原理及流的分类 原理 分类 IO流体系图 常用的类 InputStream 字节输入流
  • matlab最小二乘法_最小二乘法原理详解

    本文是 Least squares approximation 的学习笔记 这个视频从线性代数的角度 对最小二乘法的原理讲解的通俗易懂 1 提出问题 如上图所示 A 是一个n行k列的矩阵 每行可以看作是一个观测数据 或者一个训练样本 的输入

随机推荐

  • 包区别 版本_Lerna-如何优雅地管理多个npm包

    关于 Lerna Lerna A tool for managing JavaScript projects with multiple packages lerna js org 对于 lerna 的两段描述 A tool for man
  • 锐捷路由技术系列

    1 锐捷路由技术 锐捷路由器基本功能的初始化配置 主机名 推荐配置 Ruijie config hostnameNAME txt 将设备命名为NAME txt 接口描述 推荐配置 XWRJ config interfaceinterface
  • Linux less命令和Linux head命令

    less 工具也是对文件或其它输出进行分页显示的工具 应该说是linux正统查看文件内容的工具 功能极其强大 less 的用法比起 more 更加的有弹性 在 more 的时候 我们并没有办法向前面翻 只能往后面看 但若使用了 less 时
  • python之类、对象详解,实例化代码示例,构造函数与析构函数,私有属性和方法

    世界万物节皆可分类 世界万物皆可对象 只要对象 肯定属于某种类 只要对象 肯定有属性 类 具有相同属性 方法对象的抽象 对象 类的实例化 每个对象可有不同属性 类的三大特性 封装 将数据方法放到类里 类就变成了一个胶囊或者容器 继承 一个类
  • 安装Cpython解释器(day02)

    安装Cpython解释器 Python解释器目前已支持所有主流操作系统 在Linux Unix Mac系统上自带Python解释器 在Windows系统上需要安装一下 具体步骤如下 1 1 下载python解释器 打开官网 https ww
  • Sql执行平时都很快但是偶尔就会很慢

    Sql执行平时都很快但是偶尔就会很慢 记录一下在翻看MySQL技术文章的资料 觉得很不错就自己记录一下 大部分来源于网络 SQL执行变慢的原因 一条Sql执行很慢 那是每次执行都慢还是偶尔慢 简单的总结一下 一 针对偶尔慢的原因 数据库在刷
  • 蓝桥杯零基础冲过赛-第22天

    注意 因为蓝桥杯大部分题目都会涉及到数据规模过大问题 所以大整数是解决数据规模过大的问题的其中一种最简便的方式 核心 竖式个位对齐原理 文章目录 大整数加法 大整数减法 大整数乘法 大整数除法 大整数余数 大整数加法 意义 因为数据类型有s
  • 摸鱼时间少? 是时候学会用Vue自定义指令进行业务开发了

    文章目录 前言 一 博主用Vue自定义指令在业务中实现了什么需求 1 首屏Loading切换指令 用来占位 支持调节Loading样式 2 复制指令 3 文件流形式下载后端数据 转blob下载 4 防抖 支持设置延迟时间 5 按钮或菜单权限
  • 永远怀念左耳朵耗子陈皓——IT界的失去

    2023年 中国IT界遭遇了一次巨大的损失 左耳朵耗子陈皓先生的离世让人震惊和悲伤 作为一位杰出的技术专家和开源倡导者 他为IT界做出了卓越贡献 本文将回顾他的职业生涯和他对IT界的重要影响 以及他离世后的深远意义 第一部分 IT界的璀璨明
  • Opencv

    Opencv 检测框线 模糊判断 计算图片相似度 开操作检测横竖线 拉普拉斯方差判断模糊度 直方图统计判断图片相似性 开操作检测横竖线 开操作是先选定合适结构元对图像进行腐蚀处理再用相同结构元对图像进行膨胀处理 开操作可以平滑物体轮廓 断开
  • C++并发编程(5):std::unique_lock、互斥量所有权传递、锁的粒度

    std unique lock lt gt 灵活加锁 参考博客 线程间共享数据 使用互斥量保护共享数据 C 多线程unique lock详解 多线程编程 五 unique lock 相较于std lock guard std unqiue
  • iOS - 线程中常见的几种锁

    线程锁主要是用来解决 共享资源 的问题 实际开发中或多或少的都会用到各类线程锁 为了线程的安全我们有必要了解常见的几种锁 下面是本人查看一些大牛的博客然后整理的内容 加上自己的一些见解 水平有限 如果不慎有误 欢迎交流指正 常见锁列举 自旋
  • OpenStack 学习笔记(一) 概况

    偶然机会 需要了解一下OpenStack的概况 因此与几个同事一起看了一下 此学习笔记是记录一下学习的知识点 备自己以后回顾复习 一 OpenStack 概况 OpenStack是一个由NASA 美国国家航空航天局 和Rackspace合作
  • python处理wav文件时出现error:X和Y不在同一维度

    python处理wav文件时出现error X和Y不在同一维度 ValueError x and y must have same first dimension but have shapes 1290240 and 2580480 记录
  • Python 动态规划解决不同路径问题

    目录 一 LeetCode 62 不同路径 1 题目描述 2 解题思路 3 代码 二 LeetCode 63 不同路径II 1 题目描述 2 解题思路 3 代码 三 LeetCode 64 最小路径和 1 题目描述 2 解题思路 3 代码
  • 初识Django

    虚拟环境 python pip install Virtualenv pip install Virtualenvwrapper win workon 查看当前虚拟环境 mkvirtualenv xx 创建虚拟环境xx 默认的虚拟环境存放的
  • 编译系统总结篇-Android10.0编译系统(十一)

    Android取经之路 的源码都基于Android Q 10 0 进行分析 Android取经之路 系列文章 系统启动篇 Android系统架构Android是怎么启动的Android 10 0系统启动之init进程Android10 0系
  • Linux CentOS7 添加中文输入法

    在安装CentOS7时 现在默认安装了桌面中文系统 可以切换为英文 中英文可以按要求随时更换 而在CentOS7桌面环境下 显示中文非常方便 正确 但不能录入中文 在远程登录系统的情况下 不论是系统语言 LANG 设置为中文或英文 都可以在
  • 获取lib库中Filler/buffer/CK单元的类型——innovus

    1 Filler的所有类型 命令 dbGet dbGet head allCells name FIL p name 2 BUFFER的所有类型 命令 dbGet dbGet head allCells name BUF p name 3
  • 实时时钟芯片DS1302

    一 DS1302主要介绍 1 DS1302 的特点 DS1302 是 DALLAS 达拉斯 公司推出的一款涓流充电时钟芯片 DS1302 实时时钟芯片广泛应用于电话 传真 便携式仪器等产品领域 它的主要性能 指标如下 1 DS1302 是一