采用串行数据传送方式,SPI 3线接口

SPI总线

SPI接口是以主从方式工作的,通常有一个主器件和一个或多个从器件

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

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

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

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

SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据

DS1302

DS1302有一个控制寄存器、12个日历、时钟寄存器和31个RAM

当进行一次读写操作时最少得读写两个字节,第一个字节是控制字节,告诉DS1302是读还是写,或者是对RAM还是对CLOK寄存器操作。第二个字节就是要读或写的数据

只有在SCLK为低电平时,才能将CE置为高电平。所以在进行操作之前先将SCLK置低电平,然后将CE置为高电平,接着开始在IO上面放入要传送的电平信号,然后跳变SCLK。数据在SCLK上升沿时,DS1302读写数据,在SCLK下降沿时,DS1302放置数据到IO上

控制寄存器

DS1302的RST引脚(图CE)回到高电平后写入的第一个字就为控制命令。格式如下

D7:固定为1

D6:RAM/CK位。1,片内RAM;0,日历、时钟寄存器选择位

D5~D1:地址位,用于选择进行读写的日历、时钟寄存器或片内RAM。对日历、时钟寄存器或片内RAM的选择见表

D0: 读写选择。0,写;1,读



日历、时钟寄存器

数据以BCD码形式

小时寄存器的D7位为12小时制/24小时制的选择位,当为1时选12小时制,当为0时选24小时制。当12小时制时,D5位为1是上午,D5位为0是下午,D4为小时的十位。当24小时制时,D5、D4位为小时的十位。

秒寄存器中的CH位为时钟暂停位,当为1时钟暂停,为0时钟开始启动

写保护寄存器中的WP为写保护位。当WP=1,写保护,当WP=0未写保护。当对日历、时钟寄存器或片内RAM进行写时WP应清零;当对日历、时钟寄存器或片内RAM进行读时WP一般置1

慢充电寄存器的TCS位为控制慢充电的选择,当它为1010才能使慢充电工作。DS为二极管选择位。DS为01选择一个二极管,DS为10选择二个二极管,DS为11或00充电器被禁止,与TCS无关。RS用于选择连接在VCC2与VCC1之间的电阻,RS为00,充电器被禁止,与TCS无关,电阻选择情况见表

电阻选择

BCD码

利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行

采用BCD码,既可保存数值的精确度,又可免却使电脑作浮点运算时所耗费的时间

4位二进制码大于1001时,加6

如:BCD码00001100的二进制码为:00001100+6=00010010

举例

sbit DSIO = P3^4;
sbit RST = P3^5;
sbit SCLK = P3^6; //---DS1302写入和读取时分秒的地址命令---//
//---秒分时日月周年 最低位读写位-------//
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; //---DS1302时钟初始化2016年5月7日星期六12点00分00秒---//
//---存储顺序是秒分时日月周年,存储格式是用BCD码---//
uchar TIME[7] = {0, 0, 0x12, 0x07, 0x05, 0x06, 0x16}; void Ds1302Write(uchar addr, uchar dat)
{
uchar n;
RST = 0;
_nop_(); SCLK = 0; //先将SCLK置低电平
_nop_();
RST = 1; //然后将RST(CE)置高电平
_nop_(); for (n=0; n<8; n++) //开始传送八位地址命令
{
DSIO = addr & 0x01; //数据从低位开始传送
addr >>= 1;
SCLK = 1; //数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;
_nop_();
}
for (n=0; n<8; n++) //写入8位数据
{
DSIO = dat & 0x01;
dat >>= 1;
SCLK = 1;
_nop_();
SCLK = 0;
_nop_();
} RST = 0; //传送数据结束
_nop_();
} uchar Ds1302Read(uchar addr)
{
uchar n, dat, dat1;
RST = 0;
_nop_(); SCLK = 0;
_nop_();
RST = 1;
_nop_(); for(n=0; n<8; n++)
{
DSIO = addr & 0x01;
addr >>= 1;
SCLK = 1;
_nop_();
SCLK = 0;
_nop_();
} _nop_(); for(n=0; n<8; n++) //读取8位数据
{
dat1 = DSIO; //从最低位开始接收
dat = (dat>>1) | (dat1<<7);
SCLK = 1;
_nop_();
SCLK = 0; //DS1302下降沿时,放置数据
_nop_();
} RST = 0;
_nop_(); //以下为DS1302复位的稳定时间,必须的
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_(); return dat;
} void Ds1302Init()
{
uchar n;
Ds1302Write(0x8E, 0x00); //禁止写保护,就是关闭写保护功能
for (n=0; n<7; n++) //写入7个字节的时钟信号:分秒时日月周年
{
Ds1302Write(WRITE_RTC_ADDR[n], TIME[n]);
}
Ds1302Write(0x8E, 0x80); //打开写保护功能
} void Ds1302ReadTime()
{
uchar n;
for (n=0; n<7; n++) //读取7个字节的时钟信号:分秒时日月周年
{
TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
}
}

DS1302时钟的更多相关文章

  1. spi接口的ds1302时钟芯片控制在lcd1602上显示

    spi接口的ds1302时钟芯片控制在lcd1602上显示                                                                        ...

  2. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  3. Arduino和C51开发DS1302时钟

    技术:51单片机.Arduino.DS1302时钟.串口通信   概述 本文实现51单片机和Arduino串口实时显示时钟功能,让读者对DS1302能够更好的理解,这次功能也和上节课学到的串口通信运用 ...

  4. DS1302时钟芯片驱动程序

    /***************************************************************************** FileName : DS1302.c F ...

  5. DS1302时钟基础使用(含代码)

    了解其管脚 X1 X2 32.768KHz 晶振管脚 GND 地 RST 复位脚 I/O 数据输入/输出引脚,具有三态 SCLK 串行时钟 Vcc1,Vcc2(备用电源供电) 电源供电管脚 DS130 ...

  6. 「雕爷学编程」Arduino动手做(29)——DS1302时钟模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  7. arduino与DS1302时钟调试失败的分析

    前两天测试了时钟模块,但是,一直失败,能读取时间,但是设置不了时间,所以.这次我查了很多资料,发现好像是信号线的问题,线太长,数据收到干扰, 资料如下http://www.51hei.com/bbs/ ...

  8. 自制单片机之十三……时钟IC_DS1302

    在网上看了很久,发现初学者最有兴趣的就是DS1302时钟电路,也很自然,它是个做出来就让你觉得最实用的电路了,但实际上制做上并不简单,首先你要让你的显示部分(不管是数码管还是LCD)调试通过.然后把D ...

  9. STM32实战应用(一)——1602蓝牙时钟1液晶的显示测试

    前言 从51到STM32F4学习这么久了,总算找到点头绪了,目前学习了GPIO,中断,定时器,看门狗的基本使用,所以想试着看看能不能做个什么东西,就是想复习一下最近学习的知识.正好上学期单片机课程设计 ...

随机推荐

  1. React Native使用NetInfo对当前系统网络的判断

    有网状态: 断网状态: 代码如下: 注意:第一次参考了http://www.hangge.com/blog/cache/detail_1614.html代码,一直显示的是unknow状态... 最后处 ...

  2. MLN Alchemy

    1. 前言: 本文主要参考Alchemy Tutorial, washington主页上挂出的所有Alchemy项目(包括Alchemy1.0, Alchemy2.0, AlchemyLite)都无法 ...

  3. 刀塔OMG塔防1.26b单机版使用方法

    使用方法 1.确保魔兽的版本为1.26以上(低版本会报错),如果版本不对用附件中的版本转换器转一下 2.把 omg.w3x 复制到 魔兽的MAPS文件夹 WarcraftIII 游戏根目录\Maps\ ...

  4. 如何制作红蓝3d电影(详细教程)

    自20世纪初以来,电影制作人一直试图通过制作3D电影来利用我们的双眼.现在,由于大量相对实惠的3D电视,你可以享受电影院以外的额外空间 - 你自己拍摄的视频.对于大预算的电影,电影摄影师使用两个相连的 ...

  5. JS节流和防抖的区分和实现详解

    参考链接:http://caibaojian.com/throttle-debounce.html

  6. [转] Slf4j MDC机制

    MDC ( Mapped Diagnostic Contexts ),线程安全的诊断日志存放容器. 可用于存放线程的全局日志信息, 通过xml配置后可以打印在日志中,用于日志记录.定位.分析 相关:h ...

  7. Python 解LeetCode:23. Merge k Sorted Lists

    题目描述:把k个排序的链表组成的列表合并成一个排序的链表 思路: 使用堆排序,遍历列表,把每个列表中链表的头指针的值和头指针本身作为一个元素放在堆中: 第一步中遍历完列表后,此时堆中最多会有n个元素, ...

  8. 如何配置kindeditor的工具栏

    kindeditor编辑器的工具栏主要是指编辑器输入框上方的那些可以操作的菜单,默认情况下编辑器是给予了所有的工具栏.针对不同的用户,不同的项目,不同的环境,可能就需要保留部分工具栏.那么我们应该如何 ...

  9. Kubernetes---Pod phase

    ⒈Pod phase Pod的status字段是一个PodStatus对象,PodStatus中有一个 phase字段. Pod的相位(phase)是Pod 在其生命周期中的简单宏观概述.该阶段并不是 ...

  10. HDU 1811 并查集+拓扑排序

    Rank of Tetris 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1811 Problem Description 自从Lele开发了Rati ...