实时时钟DS1302原理详解和单片机编程

2023-11-18

一、DS1302的功能

DS1302是美国DALLAS推出的一款高性能、低功耗的日历时钟芯片。

DS1302是一种串行接口的实时时钟,芯片内部具有可编程的日历时钟和31个字节的静态RAM,日历时钟可以自动进行闰年补偿,计时准确,接口简单,使用方便,工作电压范围宽(2.5~5.5V),芯片自身还具有对备用电池进行涓流充电功能,可有效延长备用电池的使用寿命。

DS1302用于数据记录,能实现数据与该数据出现的时间同时记录,因此广泛应用于测量系统中。

 

 二、DS1302硬件及引脚功能

 

各引脚功能为:

1、VCC1:主电源。 VCC2:备用电源。当VCC2大于VCC1+0.2V时由VCC2向DS1302供电否则由VCC1向DS1302供电。

2、SCLK:串行时钟输入端,控制数据输入与输出;

3、I/O :双向输入线;

4、CE:使能端,CE为高时允许读写DS1302数据,为低时禁止读写。

三、DS1302寄存器

时钟日历和控制寄存器如图所示:

如上图所示,时钟日历寄存器包含在7个读/写寄存器内,读/写寄存器中的数据是BCD码。

秒寄存器(81h、80h)的BIT7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。

小时寄存器(85h、84h)的BIT7用于定义DS1302是运行于12小时模式还是24小时模式,当为1时,选择12小时模式,此时BIT5为AM/PM位,在24小时模式时此位为小时数据位。

控制寄存器(8Fh、8Eh)的BIT7是写保护位(WP),其它7位均为0。在任何对时钟或RAM读写操作之前,WP位必须为0。当WP位为1时,不能对任何时钟日历寄存器或RAM进行写操作。

    

 31个字节静态RAM寄存器如图所示

 

 突发模式配置寄存器如图所示

  四、DS1302通信时序

DS1302读写数据时序,图8为读一字节时序,图9为写一字节时序,数据的传输是从最低位开始(BIT0)。数据是以位(BIT)为单位依次写入或读出,读写数据操作中SCLK上升沿时执行写入数据,下降沿时执行读出数据。

 读数据:CE端从低到高的一个上升沿开始允许开始读数据,拉低CE端则禁止读写数据;开始的8个SCLK周期,写命令字节,数据的后8个SCLK 周期读出数据。

 

 写数据:CE端从低到高的一个上升沿开始允许开始写数据,拉低CE端则禁止读写数据;开始的8个SCLK周期,写命令字节,数据的后8个SCLK 周期写入数据。

 五、BCD码的转换

在DS1302中有关于时钟日历的寄存器数据存储格式为BCD码

BCD码介绍:

我们时钟日历寄存器使用的是8421码型的BCD码,BCD码还有5421码、2421码等,其中8421码型的BCD码最最常用;

BCD码是用四位二进制数表示一位十进制数的0-9这十个数简称BCD码;

      8421

8421码型BCD码最小值为0000(二进制),最大值为1001(二进制);9

一个字节的8421码型BCD码中的低四位用于表示十进制的个位,高四位用于表示十进制的十位,如10(十进制)的8421码型BCD码=0001 0000;

BCD码用程序转换实例:

例:把十进制数45转换为8421型BCD码

unsigned char data1, data2 = 45;  //声明2个无符号char型变量data1data2并且data2赋初值45

data1 = data2/10;  data2 = data2%10;  data2 = data2 + data1*16;  //data2最终等于69这个数

把69这个8421型BCD码换算回十进制数:

data1 = data2/16;  data2 = data2%16;  data2 = data2 + data1*10;  //data2最终等于45

 六、程序设计流程

写DS1302一字节数据
读DS1302一字节数据
BCD码转换
关闭写保护
设置DS1302时钟日历寄存器(初始显示时间)
设置写保护
关闭写保护
读取DS1302时钟日历
设置写保护
用数码管显示DS1302  时.分.秒

 

#include <reg52.h>
#include <intrins.h>
#define MAIN_Fosc		11059200UL	//宏定义主时钟HZ
/*====================================
 自定义类型名
====================================*/
typedef unsigned char INT8U;
typedef unsigned char uchar;

typedef unsigned int INT16U;
typedef unsigned int uint;

/*====================================
 硬件接口位声明
====================================*/
sbit TSCLK = P1^0;//时钟线 接到P10上用杜邦线
sbit TIO   = P1^1;//数据线,接到P11上
sbit TRST  = P1^2;//使能端,接到P12上
sbit DU  = P2^6;   //数码管段选
sbit WE  = P2^7;   //数码管位选
/*====================================
共阴极数码管段选码
====================================*/
uchar code table[]={ 
//0		1	 2     3     4     5     6     7     8
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F,
//9     A     B	   C	 D	   E	 F		-	 .	  关显示
0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x40, 0x80, 0x00
                   };

/*====================================
数码管位选码
====================================*/
				  //第1位	2位	  3位	 4位   5位	6位	  7位	8位
uchar code T_COM[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};//数码管位码

/*====================================
函数:void Delay_Ms(INT16U ms)
参数:ms,毫秒延时形参
描述:12T 51单片机自适应主时钟毫秒级延时函数
====================================*/
void Delay_Ms(INT16U ms)
{
     INT16U i;
	 do{
	      i = MAIN_Fosc / 96000; 
		  while(--i);   //96T per loop
     }while(--ms);
}

void Display(uchar Hour, Min, Sec)
{		
//------------------------------
	DU = 0;							
	P0 = table[Hour/10];		
	DU = 1;						
	DU = 0;							

	WE = 0;						
	P0 = T_COM[0];				   
	WE = 1;						
	WE = 0;						
	Delay_Ms(3);
//-------------------------------
	DU = 0;
	P0 = table[Hour%10]|0x80; 
	DU = 1;
	DU = 0;

	WE = 0;
	P0 = T_COM[1];			  
	WE = 1;
	WE = 0;
	Delay_Ms(3);
//------------------------------
	DU = 0;							
	P0 = table[Min/10];		
	DU = 1;						
	DU = 0;							

	WE = 0;						
	P0 = T_COM[2];				   
	WE = 1;						
	WE = 0;						
	Delay_Ms(3);
//-------------------------------
	DU = 0;
	P0 = table[Min%10]|0x80; 
	DU = 1;
	DU = 0;

	WE = 0;
	P0 = T_COM[3];			 
	WE = 1;
	WE = 0;
	Delay_Ms(3);
//------------------------------
	DU = 0;							
	P0 = table[Sec/10];		
	DU = 1;						
	DU = 0;							

	WE = 0;						
	P0 = T_COM[4];				   
	WE = 1;						
	WE = 0;						
	Delay_Ms(3);
//-------------------------------
	DU = 0;
	P0 = table[Sec%10]; 
	DU = 1;
	DU = 0;

	WE = 0;
	P0 = T_COM[5];			  
	WE = 1;
	WE = 0;
	Delay_Ms(3);

}

//写DS1302数据
void Write_DS1302_DAT(uchar cmd, uchar dat)
{
	uchar i;
	TRST = 0; //拉低使能端
	TSCLK = 0;//拉低数据总线
	TRST = 1; //拉高使能端,产生上升沿开始写数据
	for(i = 0; i < 8; i++)//每次写1位,写8次
	{
		TSCLK = 0;		  //拉低时钟总线
		TIO = cmd & 0x01; //写1位数据,从最低位开始写
		TSCLK = 1;		  //拉高时钟总线,产生上升沿数据被DS1302读走
		cmd >>=1;		  //右移一位
	}
	for(i = 0; i < 8; i++)//每次写1位,写8次
	{
		TSCLK = 0;		  //拉低时钟总线
		TIO = dat & 0x01; //写1位数据,从最低位开始写
		TSCLK = 1;		  //拉高时钟总线,产生上升沿数据被DS1302读走
		dat >>= 1;		  //右移一位
	}
}
//读DS1302数据
uchar Read_DS1302_DAT(uchar cmd)
{
	uchar i, dat;
	TRST = 0;  //拉低使能端
	TSCLK = 0; //拉低数据总线
	TRST = 1;  //拉高使能端,产生上升沿开始写数据
	for(i = 0; i < 8; i++)//每次写1位,写8次
	{
		TSCLK = 0;		 //拉低时钟总线
		TIO = cmd & 0x01;//写1位数据,从最低位开始写
		TSCLK = 1;		 //拉高时钟总线,产生上升沿数据被DS1302读走
		cmd >>=1;		 //右移一位
	}
	for(i = 0; i < 8; i++)//每次读1位,读8次
	{
		TSCLK = 0;		  //拉低时钟总线,产生下降沿,DS1302把数据放到TIO上
		dat >>= 1;		  //右移一位
		if(TIO)	dat |= 0x80;//读取数据,从最低位开始
		TSCLK = 1;			//拉高时钟总线,以备下一次产生下降沿
	}
	return dat;	//返回读出数据
}

//数据转BCD码
uchar Dat_Chg_BCD(uchar dat)
{
	uchar dat1, dat2;
	dat1 = dat / 10;
	dat2 = dat % 10;
	dat2 = dat2 + dat1 * 16;
	return dat2;
}

//BCD码转换为数据
uchar BCD_Chg_Dat(uchar dat)
{
	uchar dat1, dat2;
	dat1 = dat / 16;
	dat2 = dat % 16;
	dat2 = dat2 + dat1 * 10;
	return dat2;
}

void main()
{
	uchar i;
	uchar Sec, Min, Hour;
	Write_DS1302_DAT(0x8e, 0);//清除写保护
	Write_DS1302_DAT(0x80, Dat_Chg_BCD(30));//30秒(并且进行BCD码转换)
	Write_DS1302_DAT(0x82, Dat_Chg_BCD(15));//15分
	Write_DS1302_DAT(0x84, Dat_Chg_BCD(19));//19时
	Write_DS1302_DAT(0x8e, 0x80);//开写保护
	while(1)
	{
		Write_DS1302_DAT(0x8e, 0); //清除写保护
		Sec = BCD_Chg_Dat(Read_DS1302_DAT(0x81));//读秒寄存器(并且进行BCD码转换)
		Min	= BCD_Chg_Dat(Read_DS1302_DAT(0x83));//读分寄存器
		Hour = BCD_Chg_Dat(Read_DS1302_DAT(0x85));//读时寄存器
		Write_DS1302_DAT(0x8e, 0x80);//开写保护
		for(i = 0; i < 50; i++)	//循环显示时钟
			Display(Hour, Min, Sec);

	}
}

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

实时时钟DS1302原理详解和单片机编程 的相关文章

  • C++实现栈的顺序存储与链式存储

    栈是一种特殊的数据结构 栈中数据先进后出 且栈中数据只能从头部出栈 能直接访问的数据也仅为栈的头部数据 要想访问下面的数据则需要将前面的数据逐个出栈后才可访问 下面通过一个word撤销的案例来解释 我们用word写paper时 首先需要创建
  • 国内首部

    当前 税务和发票等财税数据作为财务关联性强 欺诈难度大 覆盖率最高的优质数据 正成为数字普惠金融不可或缺的 硬核 力量 全面提升相关数据理论与实战能力正逢其时 8月8日 在金蝶2023年全球创见者大会 企业数字信用平行论坛 现场 金蝶征信
  • java使用MD5生成摘要

    对value进行hash处理 return hash处理结果 public static String digest String input int length 32 try MessageDigest md MessageDigest
  • openGL之API学习(六十八)core profile、compatibility profile、forward compatibility

    在OpenGL的发展历程中 总是兼顾向下兼容的特性 但是到了一定的程度之后 这些旧有的OpenGL API不再适应时代的需要 还有一些扩展并不是驱动一定要实现的扩展 这些被统一划入可选的Compatibility Profile 而由Ope
  • 信号的时域相位、频域相位

    文章目录 傅里叶变换的时移性质 matlab代码 单点频信号 线调信号 时域相位 频域相位 傅里叶变换的时移性质 信号增加线性相位时 是所有的频率分量对应的相位都有变化 matlab代码 清空一切 clc clear all close a

随机推荐

  • 翻译:《实用的Python编程》01_07_Functions

    目录 上一节 1 6 文件 下一节 2 0 处理数据 1 7 函数 随着程序开始变大 我们会想要有条理地组织这些程序 本节简要介绍函数 库模块以及带有异常的错误处理 自定义函数 对你要重用的代码使用函数 下面是函数的定义方式 def sum
  • 数据结构--图的学习(基础概念)

    目录 图的定义 图的逻辑结构应用 无向图 有向图 编辑 简单图 多重图 顶点的度 入读 出度 顶点 顶点的关系描述 连通图和强连通图 子图 1 无向图的子图 编辑 2 有向图的子图 连通分量 强连通分量 生成树 生成森林 边的权 带权图 网
  • 2014年3月7日星期五(DEMO8-4,实体三角形着色)

    这个例子比较大 任重而道远 理论草草看了下 光记住索引和RGB各项求最小距离了 为简单起见 拷贝7 6过来 并把8 3封装到的引擎代码拷贝替换 逐行来看 各个击破 先换成800 600视口 define SCREEN WIDTH 800 d
  • mysql之基础查询,条件查询测试题07

    1 基础查询 条件查询测试题 看图 结果 1 SELECT salary last name FROM employees WHERE commission pct IS NULL AND salary lt 18000 2 SELECT
  • STM32F407 CAN1 CAN2

    注意CAN1可以单独使用 CAN2要开启CAN1时钟才能使用 u8 CAN1 Mode Init u8 mode GPIO InitTypeDef GPIO InitStructure CAN InitTypeDef CAN InitStr
  • DBeaver 如何配置离线驱动

    1 打开已经下载过DBeaver驱动的软件 点击 数据库 驱动管理器 进入 2 选中 MySQL 点击右侧的 编辑 进入 3 点击页签 库 打开列表内容 选中 mysql connector java 8 0 17 jar 点击 类路径 4
  • Android用surface直接显示yuv数据(二)

    研究了一段时间Android的surface系统 一直执着地认为所有在surface或者屏幕上显示的画面 必须要转换成RGB才能显示 yuv数据也要通过颜色空间转换成RGB才能显示 可最近在研究stagefright视频显示时发现 根本找不
  • 泰克

    主要功能 硬件连接 参数配置 运行参数 数据查询 程控对象 示波器 程控接口 兼容市面上所有具有GPIB USB RS232 LAN RS485 TTL任意一种程控接口的示波器 仪器兼容性 泰克Tektronix 是德科技Keysight
  • CISC RISC ARM MIPS区别与联系

    转载 文章有点老 不过还是有所收获 补充一句 国内那么多牛人研究处理器架构 要钱有钱 要人有人 ARM都能获得如此成就 为啥国产那么多CPU团队都不成功 其它类型的芯片也一样 大多都是买国外IP 个人理解 相关专利太少 也就是积累不足 无法
  • 【MATLAB第31期】基于MATLAB的降维/全局敏感性分析/特征排序/数据处理回归问题MATLAB代码实现(持续更新)

    MATLAB第31期 基于MATLAB的降维 全局敏感性分析 特征排序 数据处理回归问题MATLAB代码实现 持续更新 本文敏感性分析主要分析回归问题 下期分析分类问题 fisher rf arf nca等 内容更新 增加视频解说 基于MA
  • npm创建openlayer(入门)

    1 搭建node js开发环境 2 创建目录 mkdir ol deme 3 安装ol包 npx create ol app 4 打开 npm start
  • flex布局和grid布局

    flex布局 父容器 parent 8个设置项 parent display flex flex direction row row reverse column column reverse 决定子元素的排列方式 flex wrap no
  • 服务器系统磁盘分区,服务器磁盘分区教程

    服务器磁盘分区教程 内容精选 换一换 对于Linux弹性云服务器 磁盘分区与磁盘设备名称完全对应 本节以Red Hat Enterprise Linux 7的图形界面为例 介绍查询Linux弹性云服务器磁盘分区与磁盘设备的方法 以root权
  • pandas导入和导出数据至MySQL数据库

    安装准备 可以不用看 同学们在进行数据分析 数据处理时经常会使用pandas来储存结构化数据 我们在数据处理中会出现各种的过程文件或最终文件 虽然pandas给我们提供了非常多的输出结口 比如csv文件 xlsx文件 但在软件开发过程中db
  • 关于httpurlconnection getcontentlength返回值为-1的问题

    在做AsyncTask异步任务读取网络数据的时候 发现了httpUrlConnection的获取数据内容长度 connection getContentLength 总是为 1 导致进度条一直为灰色状态 预期结果应如图所示 而现在的效果是这
  • 网络协议的三要素

    一个网络协议主要由语法 语义和同步三个要素组成 1 语法 语法指数据与控制信息的结构或格式 确定通信时采用的数据格式 编码及信号电平等 2 语义 语义由通信过程的说明构成 它规定了需要发出何种控制信息 完成何种控制动作以及做出何种应答 对发
  • timeout in locking authority file in /home/**/.Xauthority,

    进入终端后使用startx命令 看是否有错误提示 我的当时是 timeout in locking authority file in home Xauthority 解决办法是将 Xauthority删掉 在检查用户目录权限 确定为775
  • Mesh(802.11s)组网 — 基于OpenWRT路由器

    一 mesh网络 1 mesh网络拓补图 2 介绍 二 OpenWRT路由器Mesh网络配置 1 准备阶段 说明 本次测试用2台单WiFi路由器作为测试 wifi用于组建Mesh网络连接 因此内网已无额外WiFi可以提供使用 因此局域网用有
  • Android Studio3.5.2 设置代码提示和代码自动补全快捷键

    方法步骤如下 1 左上角点击File选项 找到Settings 2 点击Settings后 找到Editor 3 点击Editor后 找到General 点击General 找到Code Completion 从图中我们可以看到标红 选择F
  • 实时时钟DS1302原理详解和单片机编程

    一 DS1302的功能 DS1302是美国DALLAS推出的一款高性能 低功耗的日历时钟芯片 DS1302是一种串行接口的实时时钟 芯片内部具有可编程的日历时钟和31个字节的静态RAM 日历时钟可以自动进行闰年补偿 计时准确 接口简单 使用