51单片机 | DS1302 时钟实验


  前面介绍了如何使用单片机 IO 口模拟 IIC 总线、单总线时序。这一节我们来学习 DS1302 时钟芯片,该芯片是 3 线 SPI 接口,所以需要使用 51单片机的 3 个 IO 口模拟 SPI 时序与 DS1302 时钟芯片通信,将时钟日历数据读取出来。开发板上集成了 1 个 DS1302 时钟模块,可使用它设计一个多功能电子时钟。本节要实现的功能是:系统运行时,数码管上显示电子时钟时分秒,格式为 “XX-XX-XX”

一、DS1302 时钟芯片介绍

1.DS1302 简介

  DS1302DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和 31 字节静态 RAM,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过 AM/PM 指示决定采用 2412 小时格式。DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三根通信线:

  • RES复位(CE)
  • I/O 数据线
  • SCLK 串行时钟

时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信。DS1302 工作时功耗很低保持数据和时钟信息时功率小于 1mW
  DS1302DS1202 改进而来增加了以下的特性:双电源管脚用于主电源和备份电源供应,Vcc1 为可编程涓流充电电源,附加七个字节存储器。它广泛应用于电话、传真、便携式仪器以及电池供电的仪器仪表等产品领域下面。
  主要的性能指标

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

  下面来看下 DS1302 芯片的管脚及功能。
在这里插入图片描述
1,VCC2:主电源引脚
2,X1X2DS1302 外部晶振引脚,通常需外接 32.768K 晶振
3,GND:电源地
4,CE:使能引脚,也是复位引脚(新版本功能变)。
5,I/O:串行数据引脚,数据输出或者输入都从这个引脚
6,SCLK:串行时钟引脚
7,VCC1:备用电源

2.DS1302 使用

  操作 DS1302大致过程,就是将各种数据写入DS1302 的寄存器以设置它当前的时间的格式。然后使DS1302 开始运作,DS1302 时钟会按照设置情况运转,再用单片机将其寄存器内的数据读出。再用液晶显示,就是我们常说的简易电子钟。所以,总的来说 DS1302 的操作分 2 步(显示部分属于液晶显示的内容,不属于 DS1302 本身的内容),但是在讲述操作时序之前,我们要先看看寄存器,DS1302 有一个控制寄存器、12 个日历、时钟寄存器和 31 个 RAM

  1. 控制寄存器
      控制寄存器用于存放 DS1302 的控制命令字,DS1302RST 引脚回到高电平后写入的第一个字节就为控制命令。它用于对 DS1302 读写过程进行控制,格式如下:
    在这里插入图片描述
    上图是 DS1302 的寄存器样式,我们看到:
    1、第 7 位永远都是 1;
    2、第 6 位,1 表示 RAM,寻址内部存储器地址;0 表示 CK,寻址内部寄存器;
    3、第 5 到第 1 位,为 RAM 或者寄存器的地址;
    4、最低位,高电平表示 RD,即下一步操作将要“读”;低电平表示 W,即下一步操作将要“写”。
    在这里插入图片描述
    在这里插入图片描述
    比如要读秒寄存器则命令为 1000 0001,反之写为 1000 0000,要注意其含义。

  2. 日历/时钟寄存器
      DS1302 共有 12 个寄存器,其中有 7 个与日历、时钟相关,存放的数据为 BCD码形式。格式如下:
    在这里插入图片描述
    在这里插入图片描述
    下面对几个寄存器做下说明:

    • 秒寄存器:低四位为秒的个位,高的次三位为秒的十位。最高位 CHDS1302 的运行标志,当 CH=0 时,DS1302 内部时钟运行,反之 CH=1 时停止;
    • 小时寄存器:时寄存器。最高位为 12/24 小时的格式选择位,该位为 1 时表示 12 小时格式。当设置为 12 小时显示格式时,第 5 位的高电平表示下午(PM);而当设置为 24 小时格式时,第 5 位位具体的时间数据。
    • 写保护寄存器:当该寄存器最高位 WP 为 1 时,DS1302 只读不写,所以要在往 DS1302 写数据之前确保 WP 为 0。
    • 慢充电寄存器(涓细电流充电)寄存器:我们知道,当DS1302 掉电时,可以马上调用外部电源保护时间数据。该寄存器就是配置备用电源的充电选项的。其中高四位(4 个 TCS)只有在 1010 的情况下才能使用充电选项;低四位的情况与 DS1302 内部电路有关,

      前面我们提到在日历/时钟寄存器中都是以 BCD 码存放数据,那么 BCD 码是什么呢?BCD 码是通过 4 位二进制码来表示 1 位十进制中的 0~9 这 10 个数码。如下所示:
    在这里插入图片描述
    所以从 DS1302 中读取出来的时钟数据均为 BCD 码格式,需转换为我们习惯的 10 进制,转换方法在源程序里,后面我们会介绍。

  3. DS1302的读写时序
      在控制指令字输入后的下一个 SCLK 时钟的上升沿时,数据被写入 DS1302,数据输入从低位(位 0)开始。同样,在紧跟 8 位的控制指令字后的下一个 SCLK脉冲的下降沿读出 DS1302 的数据,读出数据时从低位 0 位到高位 7。其时序图如下所示:
    在这里插入图片描述
      上图就是 DS1302 的三个时序:复位时序,单字节写时序,单字节读时序;

    • CE(RST):复位时序,即在 RST 引脚产生一个正脉冲,在整个读写器件,RST保持高电平,一次字节读写完毕之后,要注意把 RST 返回低电平准备下次读写周期;
    • 单字节读时序:注意读之前还是要先对寄存器写命令,从最低位开始写;可以看到,写数据是在 SCLK 的上升沿实现,而读数据在 SCLK 的下降沿实现。所以,在单字节读时序中,写命令的第八个上升沿结束后紧接着的第八个下降沿就将要读寄存器的第一位数据读到数据线上了!这个就是 DS1302 操作中最特别的地方。当然读出来的数据也是最低位开始。
    • 单字节写时序:两个字节的数据配合 16 个上升沿将数据写入即可。

    程序注意事项

    • 要记得在操作 DS1302 之前关闭写保护;
    • 注意用延时来降低单片机的速度以配合器件时序;
    • DS1302 读出来的数据是 BCD 码形式,要转换成我们习惯的 10 进制,转换方法在源程序里;
    • 读取字节之前,将 IO 设置为输入口,读取完之后,要将其改回输出口
    • 在写程序的时候,建议实现开辟数组(内存空间)来集中放置 DS1302 的一系列数据,方便以后扩展键盘输入。

二、硬件设计

  本实验使用到硬件资源如下:

  • 动态数码管
  • DS1302

动态数码管电路在前面章节都介绍过,这里就不再重复。下面我们来看下A4开发板上 DS1302 时钟模块电路,如下图所示:
在这里插入图片描述
  从上图中可知,DS1302 芯片的控制管脚接至单片机 P3.4-P3.6 上,在芯片的X1X2 管脚处外接了一个32.768KHZ 晶振,为时钟运行提供一个稳定的时钟频率,C2C3 为旁路电容,目的是消除晶振起振时产生的电感干扰。对于本开发板无外接备用电池,如果需要可自行将外部备用电源接入第 8VCC1

三、软件设计

  本节所要实现的功能是:数码管上显示电子时钟时分秒,格式为“XX-XX-XX”。
  程序框架如下:

  • 编写公共文件
    打开public.c,代码如下:

    #include "public.h"
    
    /*
    函 数 名 : delay_10us
    函数功能 : 延时函数,ten_us=1 时,大约延时 10us
    输 入 : ten_us
    输 出 : 无
    */
    void delay_10us(u16 ten_us)
    {
         
    	while(ten_us--);
    }
    
    /*
    函 数 名 : delay_ms
    函数功能 : ms 延时函数,ms=1 时,大约延时 1ms
    输 入 : ten_us
    输 出 : 无
    */
    void delay_ms(u16 ms)
    {
         
    	u16 i,j;
    	for (i=ms;i>0;i--)
    	{
         
    		for (j=110;j>0;j--
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值