【51单片机系列】DS1302时钟模块

news2024/11/17 4:22:34

本文是关于DS1302时钟芯片的相关介绍。

文章目录

  • 一、 DS1302时钟芯片介绍
  • 二、DS1302的使用
    • 2.1、DS1302的控制寄存器
    • 2.2、DS1302的日历/时钟寄存器
    • 2.3、片内RAM
    • 2.4、DS1302的读写时序
  • 三、SPI总线介绍
  • 四、DS1302使用示例

一、 DS1302时钟芯片介绍

DS1302是DALLAS公司推出的涓流充电时钟芯片,内部含有一个实时时钟/日历和31字节静态RAM,通过简单的串行接口与单片机进行通信。该芯片是3线SPI接口。

实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可以自动调整。

时钟操作通过AM/PM只是决定采用24或12小时格式。

DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需要用到三根通信线:
① RES复位;② I/O数据线;③ SCLK串行时钟。

时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。

DS1302工作时功耗很低,保持数据个时钟信息时功率小于1mW。

DS1302的双电源管脚用于主电源和备份电源供应,Vcc1为可编程涓流充电电源,附加七个字节存储器。它广泛应用与电话、传真、便携式仪器以及电池供电的仪器仪表等产品领域下面。

DS1302主要的性能指标:

  • 实时时钟具有能计算2100年之前的秒、分、时、日、周、月、年的能力,还有闰年调整能力。
  • 31个8位暂存数据存储RAM。
  • 串行I/O口方式使得管脚数量最少。
  • 宽范围工作电压3.0~5.5V。
  • 工作在2.0V时,电流小于300nA。
  • 读/写时钟或RAM数据时有两种传送方式:单字节传送和多字节传送方式。
  • 8脚DIP封装或可选的8脚SOIC封装根据表面装配。
  • 简单3线接口。
  • 与TTL兼容Vcc=5V。
  • 可选工业级温度范围-40~+85。
  • 具有涓流充电能力。
  • 采用主电源和备份电源双电源供应,备份电源可用电池或大容量电容实现。

DS1302芯片管脚如下:

DS1302管脚

芯片管脚功能:

管脚名称管脚标号说明
Vcc21备用电源引脚,接入电池断电时提供1302电源
X1、X22、3外部晶振引脚,通常需要外接32.768K晶振
GND4电源地
CE5使能引脚,也是复位引脚RST,低电平有效,操作时置为高电平
I/O6串行数据引脚,数据输出或输入都使用该引脚,具有三态功能
SCLK7串行时钟引脚
Vcc18工作电源引脚

二、DS1302的使用

操作DS1302的大致过程,就是将各种数据写入DS1302的寄存器,来设置它当前的时间的格式;然后使DS1302开始运作,DS1302时钟会按照设置情况运转,再用单片机将其寄存器内的数据读出;最后用液晶显示,就是常说的简易电子时钟。

简单来说DS1302的操作分2步,显示部分属于液晶显示的内容,不属于DS1302本身的内容。

首先了解下寄存器,DS1302有一个控制寄存器、12个日历/时钟寄存器和31个RAM。

2.1、DS1302的控制寄存器

控制寄存器用于存放DS1302的控制命令字,DS1302的RST引脚回到高电平后写入的第一个字节为控制命令,它用于对DS1302读写过程进行控制,格式如下:

76543210
1RAM
/CK
A4A3A2A1A0RD
/WR
  • 第7位固定是1。
  • 第6位,1表示片内RAM;0表示日历、时钟寄存器选择位。
  • 第5到1位,地址位,用于选择进行读写的日历、时钟寄存器或片内RAM。
  • 第0位,1表示RD,即下一步的操作是读;0表示WR,即下一步的操作是写。

第5到1位取值代表的RAM或寄存器如下表所示。根据下表可以知道,如果要读秒寄存器,命令为1000 0001,如果要写秒寄存器命令为1000 0000。

寄存器名称D7
1
D6
RAM/CK
D5
A4
D4
A3
D3
A2
D2
A1
D1
A0
D0
RD/WR
寄存器值
秒寄存器10000000或180H/81H
分寄存器10000010或182H/83H
时寄存器10000100或184H/85H
日寄存器10000110或186H/87H
月寄存器10001000或188H/89H
星期寄存器10001010或18AH/8BH
年寄存器10001100或18CH/8DH
写保护寄存器10001110或18EH/8FH
慢充电寄存器10010000或190H/91H
时钟突发模式10111110或1BEH/BFH
RAM011000000或1C0H/C1H
110或1
RAM3011111100或1FCH/FDH
RAM突发模式11111110或1FEH/FFH

2.2、DS1302的日历/时钟寄存器

DS1302共有12个寄存器,其中7个与日历、时钟有关,存放的数据为BCD码形式,格式如下:

寄存器名称取值范围D7D6~D4D3~D0
秒寄存器00~59CH秒的十位秒的个位
分寄存器00~590分的十位分的个位
时寄存器01 ~ 12或00 ~ 2312或24D6-D5-D4
0-A/P-HR
时的个位
日寄存器01~310D6-D5D4
0-日的十位
日的个位
月寄存器01~120D6-D5-D4
0-0-1或0
月的个位
周寄存器01~070D6-D5-D4
0-0-0
星期几
年寄存器01~99年的十位年的十位年的个位
写保护寄存器WP0-0-00-0-0-0
慢充电寄存器TCSTCS-TCS-TCSDS-DS-RS-RS
时钟突发寄存器

寄存器说明:

  • 秒寄存器:低四位为SEC,高的次三位为10SEC。CH位为时钟暂停位,当CH=1时,时钟暂停,CH=0时,时钟开始启动。

  • 时寄存器:最高位为12/24小时的格式选择位,1表示12小时格式,0表示24小时格式;

    • 当设置为12小时显示格式时,D5的高电平表示上午AM,D5低电平表示下午PM;
    • 当设置为24小时格式时,D5、D4表示小时的十位。
  • 写保护寄存器:最高位WP为1时,DS1302只读不写,一般在往DS1302写数据之前确保WP为0。

  • 慢充电寄存器:TCS位为控制慢充电的选择,当为1010时才能使慢充电工作。

    • DS为二极管选择位。DS=01表示选择一个二极管,DS=10表示选择二个二极管,DS=11或00表示充电器被禁止,与TCS无关。

    • RS用于选择连接在Vcc2和Vcc1之间的电阻,RS=00,充电器被禁止,与TCS无关,电阻选择如下:

    • RS位电阻器阻值
      00
      01R12K
      10R24K
      11R38K

从DS1302中读取出来的时钟数据均为BCD码格式,需要转换为习惯的十进制。

BCD码是通过4位二进制码来表示1位十进制中的0~9这10个数码。

二进制码转换为BCD码的方式为:4位二进制码大于1001时,加6。比如BCD码00001100的二进制码为:00001100+6=0010010。

如下所示:

十进制码二进制码
00000
10001
20010
30011
40100
50101
60110
70111
81000
91001

2.3、片内RAM

DS1302片内有31个RAM单元,对片内RAM的操作方式有两种:单字节方式和多字节方式。

当控制命令字位C0H~FDH时为单字节读写方式,命令字中的D5 ~ D1用于选择对应的RAM单元。

当控制命令字为FEH、FFH时为多字节操作,表中的RAM突发模式,多字节操作可一次把所有的RAM单元内容进行读写。FEH为写操作,FFH为读操作。

2.4、DS1302的读写时序

在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位开始。在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位到高位。时序图如下。

  • DS1302通过SPI串行总线跟单片机通信,当进行一次读写操作时最少得读写两个字节,第一个字节是控制字节,就是一个命令,告诉DS1302是读还是写操作,是对RAM还是CLOCK寄存器操作。第二个字节是要读或要写的数据。
  • 单字节读写,只有在SCLK为低电平时,才能将CE置为高电平。所以在进行操作之前需要先将SCLK置低电平,然后将CE置为高电平,接着开始在IO上放入要传送的电平信号。然后跳变SCLK。数据在SCLK上升沿时,DS1302读写数据,在SCLK下降沿时,DS1302放置数据到IO上。

DS1302读写时序

上图是DS1302的三个时序:复位时序、单字节写时序、单字节读时序。

CE(RST):复位时序,在RST引脚产生一个正脉冲,在整个读写期间,RST保持高电平,一次字节读写完毕后,把RST返回低电平准备下次读写周期。

单字节读时序:读之前要先对寄存器写命令,从最低位开始写;可以看到,写数据时在SCLK的上升沿实现,读数据在SCLK的下降沿实现。在单字节读时序中,写命令的第八个上升沿结束后紧接着的第八个下降沿就将要读寄存器的第一位数据读到数据线上了。读出来的数据也是最低位开始。

单字节写时序:两个字节的数据配合16个上升沿将数据写入即可。

需要注意的是:

  • 在操作DS1302之前需要关闭写保护。
  • 用延时来降低单片机的速度以配合器件时序。
  • DS1302读出来的数据是BCD码形式,要转换成常用的10进制。
  • 读取字节之前,将IO设置为输入口,读取完之后,将IO改回输出口。
  • 写程序时,建议开辟数组集放置DS1302的一系列数据,方便扩展键盘输入。

三、SPI总线介绍

SPI,Serial Peripheral Interface,串行外围接口。SPI接口主要应用在EEPROM、FLASH、实时时钟、AD转换器、数字信号处理器和数字信号解码器之间。

SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前,低位在后,为全双工通信,数据传输速度总体来说比I2C总线要快,可达几Mbps。

SPI接口以主从方式工作,这种方式下通常有一个主器件和一个或多个从器件,其接口包括以下四种信号:

  1. MOSI——主器件数据输出,从器件数据输入;
  2. MISO——主器件数据输入,从器件数据输出;
  3. SCLK——时钟信号,由主器件产生;
  4. /CE——从器件使能信号,由主器件控制;

SPI接口

SPI接口内部硬件如下:

SPI接口内部硬件图

SPI没有指定的流控制,没有应答机制确认是否接收到数据。

四、DS1302使用示例

本示例实现的功能是:系统运行时,数码管上显示电子时钟,格式为"xx-xx-xx"。

使用到的资源有数码管以及DS1302时钟芯片,DS1302时钟模块设计如下,DS1302芯片的控制管脚接至单片机的P3.4~P3.6口上,在芯片的X1、X2管脚处外接了一个32.768KHz晶振,为时钟运行提供一个稳定的时钟频率。

proteus中DS1302时钟模块

软件实现,按照上面介绍的时序编写DS1302的读、写时序代码,如下:

sbit DSIO=P3^4;
sbit RST=P3^5;
sbit SCLK=P3^6;

// DS1302读时、分、秒等寄存器的地址命令,依次是秒分时日月周年
uchar code READ_RTC_ADDR[]={0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
// DS1302写时、分秒等寄存器的地址命令,依次是秒分时日月周年
uchar code WRITE_RTC_ADDR[]={0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

// 时钟初始化2023-12-26星期二12点0分0秒,存储顺序按照秒分时日月周年,
// 存储格式使用BCD吗
uchar TIME[7]={0, 0, 0x12, 0x26, 0x12, 0x02, 0x23};

// 向DS1302发送命令,向地址addr写入数据dat
void DS1302Write(uchar addr, uchar dat)
{
	uchar i;
	RST=0;  // RST拉低
	_nop_();  // 延时
	SCLK=0;  // 拉低SCLK,SCLK为低时才可拉高RST
	_nop_();  // 延时
	RST=1;  // RST拉高,整个读写期间保持RST高电平
	_nop_();  // 延时
	
	for(i=0;i<8;i++)  // 从低位开始传送八位地址addr
	{
		DSIO=addr&0x01;
		addr>>=1;
		SCLK=1;  // 上升沿向DS1302写数据
		_nop_();
		SCLK=0;  // SCLK拉低为下一位传送做准备
		_nop_();
	}
	
	for(i=0;i<8;i++)  // 从低位开始传送八位数据dat
	{
		DSIO=dat&0x01;
		dat>>=1;
		SCLK=1;  // 上升沿向DS1302写数据
		_nop_();
		SCLK=0;  // SCLK拉低为下一位传送做准备
		_nop_();
	}
	
	// 数据传送结束,将RST拉低,为下一次传送做准备
	RST=0;
	_nop_();
}

// 从DS1302中读取地址addr的数据dat
uchar DS1302Read(uchar addr)
{
	uchar i;
	uchar dat, bi;
	RST=0;  // RST拉低
	_nop_();  // 延时
	SCLK=0;  // 拉低SCLK,SCLK为低时才可拉高RST
	_nop_();  // 延时
	RST=1;  // RST拉高,整个读写期间保持RST高电平
	_nop_();  // 延时
	
	for(i=0;i<8;i++)  // 从低位开始传送八位地址addr
	{
		DSIO=addr&0x01;
		addr>>=1;
		SCLK=1;  // 上升沿向DS1302写数据
		_nop_();
		SCLK=0;  // SCLK拉低为下一位传送做准备
		_nop_();
	}
	_nop_();
	for(i=0;i<8;i++)  // 从低位开始读取八位数据dat
	{
		bi=DSIO;
		dat=(dat>>1)|(bi<<7);
		SCLK=1;  // 上升沿向DS1302写数据
		_nop_();
		SCLK=0;  // SCLK拉低为下一位传送做准备
		_nop_();
	}
	
	// 数据传送结束,将RST拉低,为下一次传送做准备
	RST=0;
	_nop_();
	// DS1302复位稳定时间
	SCLK=1;
	_nop_();
	DSIO=0;
	_nop_();
	DSIO=1;
	_nop_();
	return dat;
}

在读取之前需要对DS1302初始化,写入设置的时间,然后可以读取时间,代码如下:

// DS1302初始化
// 1. 在对DS1302操作之前需要关闭写保护,0x8e写0x00
// 2. 写入设置的时间
// 3. 打开写保护功能
void DS1302Init()
{
	uchar i;
	DS1302Write(0x8E, 0x00);  // 关闭写保护
	for(i=0;i<sizeof(WRITE_RTC_ADDR);i++)  // 设置时间
	{
		DS1302Write(WRITE_RTC_ADDR[i], TIME[i]);
	}
	DS1302Write(0x8E, 0x80);  // 打开写保护

}

// 从DS1302中读取时间信息
void DS1302ReadTime()
{
	uchar i;
	for(i=0;i<sizeof(READ_RTC_ADDR);i++)
	{
		TIME[i] = DS1302Read(READ_RTC_ADDR[i]);
	}
}

主程序中,数据处理函数中读取时间,并将时间处理后赋值给显示数据的数组,如下

void DataPros()
{
	DS1302ReadTime();  // 首先读取时间信息
	display[0]=smg[TIME[2]/16];  // 时
	display[1]=smg[TIME[2]&0x0f];
	display[2]=0x40;  // - 号
	display[3]=smg[TIME[1]/16];  // 分
	display[4]=smg[TIME[1]&0x0f]; 
	display[5]=0x40;  // - 号
	display[6]=smg[TIME[0]/16];  // 秒
	display[7]=smg[TIME[0]&0x0f]; 
}

数码管显示函数与温度传感器使用示例中类似。主函数如下:

void main()
{
	DS1302Init();  // 初始化,第一次初始化后可以注释掉
	while(1)
	{
		DataPros();
		DigDisplay();
	}
}

第一次初始化仿真结果:

初始化时钟芯片

当注释调初始化函数时,会显示当前时间,如下:

注释初始化函数显示当前时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1338964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【教程】使用ipagurd打包与混淆Cocos2d-x的Lua脚本

文章目录 摘要引言正文1. 准备工作2. 使用ipaguard处理Lua文件3. 运行ipagurd进行混淆代码加密具体步骤测试和配置阶段IPA 重签名操作步骤4. IPA重签名与发布 总结 摘要 本文将介绍如何使用ipagurd工具对Cocos2d-x中的Lua脚本进行打包与混淆&#xff0c;以及在iOS应用开发中的…

IDEA2023创建web项目

一、新建项目 点击File->New->Project...&#xff0c;如果是第一次创建项目则单击New Project 二、添加Web Application 建好的样子 把web移动到main目录下同时改名为webapp 三、不存在Add Framework Support添加Web Application 如何存在Add Framework Support&#…

React快速入门之交互性

响应事件 创建事件处理函数 处理函数名常以handle事件名命名 function handlePlayClick() {alert(Playing);}传递事件处理函数 函数名、匿名两种方式&#xff01; function PlayButton() {function handlePlayClick() {alert(Playing);}return (<Button handleClick{handl…

信息科技成“新课标”重点,家长必须要懂!

日新月异的当下&#xff0c;人工智能无疑是与生活最为密切相关的核心词语。或许在不远的将来&#xff0c;技术含量低的重复性工作将会被机器取代。甚至有人认为&#xff0c;现在的小学生&#xff0c;大概多数会在未来从事目前尚未发明出来的工作。 近年来&#xff0c;我国的教…

微信消息撤回拦截:x64dbg反汇编实现揭秘

在数字世界中&#xff0c;信息传递的速度快如闪电&#xff0c;但也常常伴随着一些遗憾。微信作为我们日常生活中最常用的通讯工具之一&#xff0c;其撤回功能让许多人在发出信息后有了后悔的机会。然而&#xff0c;有时候我们却希望能够拦截这些即将被撤回的信息。通过x64dbg反…

YOLOv7+Pose姿态估计+tensort部署加速

YOLOv7是一种基于深度学习的目标检测算法&#xff0c;它能够在图像中准确识别出不同目标的位置和分类。而姿态估计pose和tensort则是一种用于实现人体姿态估计的算法&#xff0c;可以对人体的关节位置和方向进行精准的检测和跟踪。 下面我将分点阐述YOLOv7姿态估计posetensort…

用 Unity 实现的安检模拟小游戏源码,通过安检设备 (扫描仪) 检查乘客的随身物品 根据禁止名单对乘客做出判断是否允许通行

介绍 用 Unity 实现的安检模拟小游戏 软件版本 Unity 2019.4.9f1 (64-bit) Visual Studio 2019 游戏玩法 在游戏中你将扮演一名安全检查员 通过安检设备 (扫描仪) 检查每位乘客的随身物品 根据禁止名单对乘客做出判断&#xff1a;允许通行或者下令逮捕 游戏效果 游戏截图…

maven工具的搭建以及使用

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;首先进行maven工具的搭建&#x1f993;1.[打开下载 maven 服务器官网](http://maven.apache.org)&#x1fa85;2.解压之后&#xff0c;配置环境变量&#x1f3e8;3.打开设…

【SAM系列】I-MedSAM: Implicit Medical Image Segmentation with Segment Anything

论文链接&#xff1a;https://arxiv.org/abs/2311.17081 比较有趣的点&#xff1a;frequency adapter

数据结构课设迷宫问题

迷宫问题 【问题描述】以一个mn的长方阵表示迷宫&#xff0c;0和1分别表示迷宫中的通路和障碍。设计一个程序&#xff0c;对任意设定的迷宫&#xff0c;求出一条从入口到出口的通路&#xff0c;或得出没有通路的结论。 【基本要求】编写一个求解迷宫的非递归程序。求得的通路…

微信小程序获取手机号

1、先新建vue页面 打开看到页面是下图 在method定义方法 源码&#xff1a; <template><view><button type"primary" open-type"getPhoneNumber" getphonenumber"getPhoneNumberFn">登录</button><view class"&…

Explain分析-Mysql索引优化(三)

欢迎大家关注我的微信公众号&#xff1a; 传送门&#xff1a;Explain分析——索引优化实践 传送门&#xff1a;Explain分析-Mysql索引优化&#xff08;二&#xff09; 目录 分页查询优化 Join关联查询优化 in和exsits优化 count(*)查询优化 分页查询优化 示例表&am…

115基于matlab的用于铣削动力学建模的稳定性叶瓣图分析(stablity lobe)

基于matlab的用于铣削动力学建模的稳定性叶瓣图分析(stablity lobe)&#xff0c;程序已调通&#xff0c;可直接运行。 115matlab铣削动力学 (xiaohongshu.com)

HarmonyOS的功能及场景应用

一、基本介绍 鸿蒙HarmonyOS主要应用的设备包括智慧屏、平板、手表、智能音箱、IoT设备等。具体来说&#xff0c;鸿蒙系统是一款面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备…

SpringBoot 3.2.0 结合Redisson接入Redis

依赖版本 JDK 17 Spring Boot 3.2.0 Redisson 3.25.0 工程源码&#xff1a;Gitee 集成Redis步骤 导入依赖 <properties><redisson.version>3.25.0</redisson.version> </properties> <dependencies><dependency><groupId>org.pr…

无需手动搜索!轻松创建IntelliJ IDEA快捷方式的Linux教程

轻松创建IntelliJ IDEA快捷方式的Linux教程 一、IntelliJ IDEA简介二、在Linux系统中创建快捷方式的好处三、命令行创建IntelliJ IDEA快捷方式四、图形界面创建IntelliJ IDEA快捷方式五、常见问题总结 一、IntelliJ IDEA简介 IntelliJ IDEA是一个由JetBrains搞的IDE&#xff0…

Bridge桥模式(单一职责)

目的 链接&#xff1a;桥模式实例代码 解析 由于某些类型的固有的实现逻辑&#xff0c;使得它们具有两个变化的维度&#xff0c;乃至多个纬度的变化。 如何应对这种“多维度的变化”&#xff1f;如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化&#xff…

算法模板之单调栈和单调队列图文详解

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;算法模板、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️单调栈讲解1.1 &#x1f514;单调栈的定义1.2 &#x1f514;如何维护一个单…

Socket与字节序

一、Socket "Socket"&#xff08;套接字&#xff09;是计算机网络编程中的一个重要概念&#xff0c;它提供了一种在网络上进行进程间通信的机制。套接字是一种抽象&#xff0c;它允许程序通过网络发送和接收数据。在通常的情况下&#xff0c;套接字用于实现不同计算…

【论文阅读+复现】SparseCtrl: Adding Sparse Controls to Text-to-Video Diffusion Models

SparseCtrl:在文本到视频扩散模型中添加稀疏控制。 &#xff08;AnimateDiff V3&#xff0c;官方版AnimateDiffControlNet&#xff0c;效果很丝滑&#xff09; code&#xff1a;GitHub - guoyww/AnimateDiff: Official implementation of AnimateDiff. paper&#xff1a;htt…