【mcuclub】时钟模块DS1302

2023-05-16

一、实物图

 

二、原理图

编号名称功能
1VCC2双供电配置中的主电源供应引脚。DS1302工作于 VCC1和VCC2中较大者.当VCC2比VCC1高0.2V 时,VCC2 给 DS1302供电。当VCC1比VCC2高时, VCC1给DS1302供电
2X132.768kHz晶振引脚
3X2
4GND电源地
5CE使能引脚。输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法
6I/O数据输入/输出引脚。三线接口时的双向数据线
7SCLK串行时钟引脚, 用来同步串行接口上的数据动作
8VCC1备用电源引脚。在使用涓流充电的系统中,这个管脚连接到可再充能量源

电路图中一些电阻电容作用:


VCC2引脚的电容主要用于滤波,而串联一个电阻可以有效防止电源对芯片的冲击。

晶振两端的电容主要用于起振的,如果不接,会导致时间快几秒,但是时间的精确性主要取决于晶振频率。

VCC1接的是一个纽扣电池,当VCC2的电源断电时,VCC1给芯片供电,这样时钟就会继续运行。

三个上拉电阻作用:

DS1302的数据脚(I/O)是双向的,如果只用单片机弱上拉,双向通讯不成功,可能是因为弱上拉时端口电平翻转慢,造成读数不准。

CE脚和SCLK脚是单向的,可以不用接上拉电阻,单片机弱上拉是可以的。

晶振为什么选取32.768kHz:

时钟系统中,秒是一个重要的时间单位,1秒正是1Hz,如果要提高时间精度,那这个1Hz必须要准确。我们知道,在数字世界里,只有0和1两种可能,下面看一个计算:2^15 = 32768 = 32.768K

2的15次方正好等于32768,反过来讲,如果要把32.768K的时钟频率经过15次分频的话,得到的频率正好是1Hz。所以时钟芯片内部经过15次分频就得到了1Hz,即1s。

三、简介

DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。

四、内部框图

 

五、通信协议

DS1302的通信是SPI的变异种类,它用了 SPI 的通信时序,但是通信的时候没有完全按照 SPI 的规则来。SPI接口是以主从方式工作的,这种模式通常有一个主器件和一个或多个从器件,其接口包括以下四种信号:

1、MOSI – 主器件数据输出,从器件数据输入

2、MISO – 主器件数据输入,从器件数据输出

3、SCLK – 时钟信号,由主器件产生

4、/CS – 从器件使能信号,由主器件控制

而DS1302是三种信号,其中I/O替代了MOSI和MISO,利用1根数据线进行数据输入和输出。

六、寄存器地址定义

 

该寄存器显示了时钟的地址信息,操作时往对应的地址写入值就行,也就是说如果想写入秒,往对应的寄存器写入0x80;表示小时的地址的第7位可选为12小时制还是24小时制,WP是写保护位

时钟暂停标志(CH):

秒寄存器的位7被定义为时钟暂停标志,当此位置1时,时钟振荡器暂停,DS1302进入漏电流小于100nA的低功耗备用模式;当此为置0时时钟开始,初始加电状态未定义。

写保护位(WP):

控制寄存器的位7是写保护位,前7位(位0至位6被强制为0且读取时总是读0,在任何对时钟或RAM的写操作以前,位7必须为0;当为高时,写保护位禁止任何寄存器的写操作,初始加电状态未定义;因此,在试图写器件之前应该清除WP位。

命令字:

命令字启动每一次数据传输时需要配置,第7位固定为1,如果是0则禁止对DS1302的写入,第6位写1则是读取或写入RAM区,写0则读取或写入时钟,第1~5位是地址,即要操作的地址,秒的地址是从0开始;第0位置1是read,对地址进行读取,置0是write,对地址进行写入

例如要读取月信息,则往命令字寄存器写0x89,如要写入月信息,则往命令字寄存器写0x88,对应了RTC左边的地址。

七、时序解析

 

CE输入驱动高启动所有的数据传输。CE输入有两个功能。首先,CE打开控制逻辑,允许访问的移位寄存器的地址/命令序列。其次,CE提供了一个终止单字节或多字节数据传输方法。

一个时钟周期是由一个下降沿之后的上升沿序列。对于数据传输而言,数据必须在有效的时钟的上升沿输入,在时钟的下降沿输出。如果CE为低,数据传输终止。

对于数据输入︰

开始的8个SCLK周期,输入写命令字节,数据字节在后8个SCLK周期的上升沿输入。数据输入位0开始。

代码如下:

void Ds1302_Write_Byte(uchar addr, uchar dat)

{

   uchar i;

   DS1302_CE = 1;                        //启动DS1302总线

   //写入目标地址:addr

   addr = addr & 0xFE;                 //最低位置0,寄存器0位为0时写,为1时读

   for(i = 0; i < 8; i++)

   {

      DS1302_IO = addr & (0x01 << i);

      DS1302_SCLK = 1;

      DS1302_SCLK = 0;

   }

   //写入数据:dat

   for(i = 0; i < 8; i++)

   {

      DS1302_IO = dat & (0x01 << i);

      DS1302_SCLK = 1;

      DS1302_SCLK = 0;

   }

   DS1302_CE = 0;                        //停止DS1302总线

}

对于数据输出︰

开始的8个SCLK周期,输入一个读命令字节,数据字节在后8个SCLK周期的下降沿输出。注意,第一个数据字节的第一个下降沿发生后,命令字的最后一位被写入。当CE仍为高时。如果还有额外的SCLK周期,DS1302将重新发送数据字节,这使DS1302具有连续突发读取的能力。

代码如下:

uchar Ds1302_Read_Byte(uchar addr)

{

   uchar i,dat = 0x00;

   DS1302_CE = 1;                        //启动DS1302总线

   //写入目标地址:addr

   addr = addr | 0x01;                 //最低位置1,寄存器0位为0时写,为1时读

   for(i = 0; i < 8; i++)

   {

      DS1302_IO = addr & (0x01 << i);

      DS1302_SCLK = 0;

      DS1302_SCLK = 1;

   }

   //输出数据:dat

   for(i = 0; i < 8; i++)

   {

      DS1302_SCLK = 1;

      DS1302_SCLK = 0;

      if(DS1302_IO)

       dat |= (0x01 << i);

   }

   DS1302_CE = 0;                        //停止DS1302总线

   DS1302_IO = 0;                        //读取后将IO设置为0,否则读出的数据会出错

   return dat;

}

八、BCD码

BCD码(Binary Coded Decimal‎),用4位二进制数来表示1位十进制数

例:0001 0011表示13,1000 0101表示85,0001 1010不合法

在十六进制中的体现:0x13表示13,0x85表示85,0x1A不合法

BCD码转十进制:DEC=BCD/16 * 10+BCD%16; (2位BCD)

十进制转BCD码:BCD=DEC/10 * 16+DEC%10; (2位BCD)

因为时钟芯片内存放的是BCD码,所以直接读取出来的话会不准确,要转为十进制来显示。

九、流程设计

首先初始化引脚,然后初始化DS1302,设置CE为高,设置是读操作还是写操作,然后写入8位目标地址,接下来如果是写操作,则写入数据,如果是读操作,则读取数据,最后设置CE为低,结束操作。

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

【mcuclub】时钟模块DS1302 的相关文章

随机推荐

  • PCB封装库的制作

    以下几个元件制作为例 xff1a 元件SMA封装 步骤 xff1a 1 创建PCB库文件 xff1a 单击 File 菜单 xff0c 选择 New 选项中的 Library 选项 xff0c 再选择 PCB Library xff0c 进
  • PCB板自动布线

    自动布线 步骤 xff1a 1 整体删除同层的走线 xff1a 打开PCB文件 xff0c 在层的选项卡中选择顶层 Top Layer xff0c 在 Edit 菜单下选择 Select 选项 xff0c 选择 All on Layer 选
  • 独立按键实验

    按键简介 按键是一种电子开关 xff0c 使用时 xff0c 按下按钮 xff0c 则开关接通 xff0c 松开手时 开关断开 开发板上使用的按键及内部简易图如下图所示 xff1a 按键管脚两端距离长的表示默认是导通状态 xff08 1 2
  • IO 扩展(串转并)-74HC595-16*16LED点阵实验

    51 单片机的IO 口非常有限 xff0c 有时候若想要连接更多外围设备 xff0c 需要通过 IO 扩展来实现 本文介绍一种 IO 口扩展方式 串转并 xff0c 使用的芯片是 74HC595 若有4个 74HC595 芯片 xff0c
  • LED 点阵实验~点亮一个点、数字、汉字、图

    LED 点阵简介 LED 点阵是由发光二极管排列组成的显示器件 xff0c 如下所示为8 8LED 点阵 xff1a 以 16 16LED 点阵为例 xff0c 其内部结构图如下所示 xff1a 16 16 点阵共由 256 个发光二极管组
  • 定时器中断

    定时器简介 介绍定时器之前 xff0c 先说明几个CPU 时序的有关知识 振荡周期 xff1a 为单片机提供定时信号的振荡源的周期状态周期 xff1a 1 个状态周期 61 2 个振荡周期机器周期 xff1a 1 个机器周期 61 6 个状
  • 红外遥控实验

    红外线简介 人眼所能看到的可见光 xff0c 按波长从长到短排列 xff0c 依次为红 xff08 660nm xff09 橙 xff08 610nm xff09 黄 xff08 585nm xff09 绿 xff08 555nm xff0
  • Jmeter性能测试(25)--linux环境运行jmeter并生成报告

    jmeter是一个java开发的利用多线程原理来模拟并发进行性能测试的工具 xff0c 一般来说 xff0c GUI模式只用于创建脚本以及用来debug xff0c 执行测试时建议使用非GUI模式运行 这篇博客 xff0c 介绍下在linu
  • 题目:输入三个整数x,y,z,把这三个数由小到大输出

    程序分析 xff1a 方式一 xff1a 先将两个数比较 xff0c 再将较大值与第三个数比较 xff0c 得到最大值 然后比较剩余的两个值 最后 xff0c 将数值以X lt Y lt Z的顺序输出 方式二 xff1a 将三个数分别两两进
  • 对话框QDialog

    对话框是 GUI 程序中不可或缺的组成部分 很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置 对话框通常会是一个顶层窗口 xff0c 出现在程序最上层 xff0c 用于实现短期任务或者简洁的用户交互 Qt 中使用QDialog类
  • 布局管理器~登录界面的搭建实例

    所谓的图形用户界面 xff08 GUI xff09 xff0c 本质上就是一堆组件的叠加 创建一个窗口 xff0c 把按钮放上面 xff0c 把图标放上面 xff0c 这样就成了一个界面 因此 xff0c 组件位置的放置尤其重要 xff0c
  • 常用控件及自定义控件

    QLabel QLabel可以用来显示文本 xff0c 图片和动画等 显示文本 xff08 普通文本 HTML xff09 通过QLabel类的setText函数设置显示的内容 void setText const QString amp
  • Dev-c++ 5.11版本调试方法(七小时折磨调试成功,超详细版)

    一 出现的问题是 1 设置断点之后点调试不出现蓝行 2 点了调试之后出现黑框 然后又闪退 3 添加查看之后也看不了变量的值 等等各种问题 xff08 查找 一个个试验 xff0c 还有整理 xff0c 花了起码六七小时 xff0c 几乎一天
  • Pycharm调试Debug篇(详细)

    pycharm中的debug模式 首先 xff0c 还是用示例说话 xff0c 我们书写一段简短的代码 xff0c 来帮我们完成今天要讲的内容 def sum demo x y for in range 2 x 43 61 1 y 43 6
  • Qt --- 信号与槽

    信号与槽概述 信号与槽是 Qt 框架引以为豪的机制之一 所谓信号与槽 xff0c 实际就是观察者模式 发布 订阅模式 当某个事件发生之后 xff0c 比如 xff0c 按钮检测到自己被点击了一下 xff0c 它就会发出一个信号 xff08
  • 不可不知道的串口常识

    串口 xff1a 串口是一个泛称 xff0c UART xff0c TTL xff0c RS232 xff0c RS485都遵循类似的通信时序协议 xff0c 因此都被通称为串口 串口 UART口 COM xff08 cluster com
  • 【Linux】磁盘分区和挂载

    目录 Linux磁盘分区和挂载 linux分区 查看所有设备挂载情况 挂载案例 步骤1 xff1a 新建一块硬盘 操作步骤2 xff1a 虚拟机硬盘分区 步骤3 xff1a 虚拟机硬盘分区格式化 步骤4 xff1a 将磁盘挂载到根目录下ne
  • RealSense D435i + imu 标定 Ros Melodic

    准备工作 ubuntu ros melodic环境 librealsense realsense ros 一 修改rs camera launch文件中的参数 修改之前装好的realsense环境中的 src realsense ros r
  • Jmeter性能测试(26)---生成HTML性能测试报告

    性能测试工具Jmeter由于其体积小 使用方便 学习成本低等原因 xff0c 在现在的性能测试过程中 xff0c 使用率越来越高 xff0c 但其本身也有一定的缺点 xff0c 比如提供的测试结果可视化做的很一般 不过从3 0版本开始 xf
  • 【mcuclub】时钟模块DS1302

    一 实物图 二 原理图 编号名称功能1VCC2双供电配置中的主电源供应引脚 DS1302工作于 VCC1和VCC2中较大者 当VCC2比VCC1高0 2V 时 xff0c VCC2 给 DS1302供电 当VCC1比VCC2高时 VCC1给