DS1320原理和C51代码实现解读

  • DS封装

  • 引脚介绍

    • VCC2 V_{CC2}为主电源, VCC1 V_{CC1}为备用电源,当 VCC2 V_{CC2}> VCC1 V_{CC1} + 0.2V时选择 VCC2 V_{CC2}, VCC2 V_{CC2} < vCC1 v_{CC1}时,选择 VCC1 V_{CC1}。
    • SCLK:同步时钟。
    • I/0: 数据传输,n数据输入/输出。
    • RST¯¯¯¯¯¯¯ \overline{RST}为复位引脚,1代表读/写使能,0代表读/写禁止。
    • GND:地
  • 功能特性

    • 能计算2100年前的年、月、日、星期、时、分、秒的信息;每月的天数和闰年天数可自动调整;时钟可设置为24或12小时格式。
    • 与单片机间采用单线同步串行通信。
    • 31字节的8位静态RAM。
    • 功耗低,保持数据和时钟信息时功率小于1mW;可选的涓流充电能力。
    • 读/写时钟或RAM数据有单字节和多字节两种传送方式。
  • 时序图

    • 分为写时序和读时序图,由SCLK时钟控制,SCLK为低电平时,单片机和DS1302之间没有数据传输。

    • 读/写时序,SCKL产生上升沿(由低电平变为高电平)

  • 放置数据时序,SCLK产生下降沿(由高电平变为低电平),放置数据。

  • 整读/写时序图。每次读/写数据时,都要先发送命令。

  • DS1302命令格式

    • D7:必须为1代表能写入DS1302,0代表禁止写入DS1302。
    • D6:RAM/ CK¯¯¯¯¯¯ \overline{CK}:1代表读/写RAM,0代表读/写时钟/日历数据
    • D5~D1:命令地址。
    • D0-RD/ W¯¯¯¯ \overline{W}: 1代表对DS1302进行读操作,0代表对DS1302进行写操作
  • DS1302寄存器

    • DS1302有12个寄存器,7个存放时钟/日历相关信息。BCD码形式存放数据。

    • 秒寄存器

      • D7:时钟暂停位,1代表振荡器停止,DS1302为低功耗方式。0代表时钟开始工作。
      • 10SEC(D6~D4):秒的十位
      • SEC(D3~D0):秒的个位
    • 分寄存器

      • 10MIN(D6~D4):分的十位
      • MIN(D3~D0):分的个位
    • 小时寄存器

      • 12/24(D7):12或24小时选择位
      • 0(D6):
      • AP(D5):1代表AM,0代表PM
      • HR:存储时间
    • 天寄存器

      • 10DATE(D5~D4):天的十位
      • DATE(D3~D0):天的个位
    • 月寄存器

      • 10M(D4):月十位
      • MONTH(D3~D0):月个位
    • 星期寄存器

      • DAY(D3~D0)
    • 年寄存器

      • 10YEAR(D7~D4):年的十位
      • YERAR(D3~D0):年的个位
    • 写保护寄存器

      • WP:0允许写入,1进制写入。用来反正写入其他寄存器。
    • 涓流充电寄存器

      • 慢充电寄存器,用于管理对备用电源的充电

      • TCS:当4位TCS=1010时,才允许使用涓流充电寄存器,其他任何状态都将禁止使用涓流充电器。

      • DS:两DS位用于选择连接在VCC2和VCC1间的二极管数目。

      ​ 01-选择1个二极管;10-选择2个二极管;

      ​ 11或00-涓流充电器被禁止。

      • RS:两位RS位用于选择涓流充电器内部在VCC2和VCC1之间的连接电阻。

      • RS=01,选择R1(2kΩ);RS=10时,选择R2(4kΩ);RS=11时,选择R3(8kΩ);RS=00时,不选择任何电阻。

      • 时钟突发寄存器

      • 多字节读/写。写入地址3EH。

  • 代码解读

    • 读取时间流程:初始化时间->写入读取时间的命令->读取时间并输出。

    • 引脚定义:

    sbit DSIO=P3^4; //IO
    sbit RST=P3^5; //复位
    sbit SCLK=P3^6; //时钟
    • 代码模块

      • void Ds1302Init()。初始化设置时间
      • void Ds1302Write(uchar addr, uchar dat)。向DS1302写入数据
      • uchar Ds1302Read(uchar addr)。向DS1302读出数据
      • void Ds1302ReadTime()。获得时间的值

    • 初始化设置时间
    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}; //写寄存器命令
    uchar TIME[7] = {0, 0x42, 0x13, 0x21, 0x11, 0x02, 0x17}; //时间初始化设置
    void Ds1302Init()
    {uchar n;Ds1302Write(0x8E,0X00);      //写入写保护寄存器,关闭写保护。for (n=0; n<7; n++)//把时间写入7个时间寄存器{Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]); }Ds1302Write(0x8E,0x80);      //开启写保护
    }
    • 向DS1302写入8位数据。RST=1和SCLK=0,数据赋值为IO引脚,RST =1 ,SCLK触发上升沿写入数据,写入成功后,RST=0
    void Ds1302Write(uchar addr, uchar dat)
    {uchar n;RST = 0;_nop_();SCLK = 0;//置为0_nop_();RST = 1; //复位为1,允许写入DS1302_nop_();for (n=0; n<8; n++)//写入命令,低位先写入{DSIO = addr & 0x01;//addr >>= 1;SCLK = 1;//上升沿_nop_();SCLK = 0; //恢复_nop_();}for (n=0; n<8; n++)//写入数据{DSIO = dat & 0x01;dat >>= 1;SCLK = 1;//上升沿_nop_();SCLK = 0; //恢复_nop_();    } RST = 0;//写入完成后,RST=0_nop_();
    }
    
    • 向DS1302读取数据,CLK =1,RST = 1.上升沿读取数据,下降沿放置数据。数据恢复到稳定阶段。
    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++)//读取八位数据,低位先读{dat1 = DSIO;//读取引脚IO值dat = (dat>>1) | (dat1<<7); SCLK = 1; //上升沿读取_nop_(); SCLK = 0;//下降沿放置数据_nop_();} RST = 0;_nop_();    //必须延时,让数据稳定。下面是稳定时间 SCLK = 1;   _nop_(); DSIO = 0;_nop_(); DSIO = 1;_nop_();return dat;
    }
    • 读取时钟的值

      void Ds1302ReadTime()
      {uchar n;for (n=0; n<7; n++)//读取7个寄存器的时间数据{TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);}
      }

DS1320原理和C51代码实现解读相关推荐

  1. 单链表反转的原理和python代码实现

    链表是一种基础的数据结构,也是算法学习的重中之重.其中单链表反转是一个经常会被考察到的知识点. 单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容 ...

  2. 【图像处理】——图像质量评价指标信噪比(PSNR)和结构相似性(SSIM)(含原理和Python代码)

    目录 一.信噪比(PSNR) 1.信噪比的原理与计算公式 2.Python常规代码实现PSNR计算 3.TensorFlow实现PSNR计算 4.skimage实现PSNR计算 5.三种方法计算的结果 ...

  3. 利用均值漂移实现图像分割的原理和OpenCV代码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 要想大致理解均值漂移实现图像分割的原理请见网页基 ...

  4. 线性插值法的原理和python代码实现

    假设我们已知坐标 (x0, y0) 与 (x1, y1),要得到 [x0, x1] 区间内某一位置 x 在直线上的值.根据图中所示,我们得到 由于 x 值已知,所以可以从公式得到 y 的值 已知 y  ...

  5. 相机标定原理和opencv代码解析

    1.单目标定 单应矩阵 设三维空间点的齐次坐标,对应的图像坐标为 他们满足一下关系: s为尺度因子,K为内参矩阵 R和T旋转平移矩阵统称为外参 假设我们提供K个棋盘图像,每个棋盘有N个角点,于是我们拥 ...

  6. 无模型自适应迭代学习控制原理和matlab代码仿真学习记录

    无模型自适应ILC原理及代码实现 这里学习的是很老的一篇论文<基于无模型自适应控制的反馈-前馈迭代学习控制系统收敛性研究>,作者是晏静文和侯忠生,大家有兴趣可以找来看看.这里主要介绍的无模 ...

  7. NMS和Soft-NMS的原理和Pytorch代码实现

    NMS都不会,做什么Detection! Non-maximum suppression(非极大值抑制)算法 NMS原理: 首先得出所有的预测框集合B. 对应框的得分Scores, NMS(IoU)阈 ...

  8. TOPSIS模型原理和MATLAB代码实现

    IMMC2020:熵权TOPSIS 笔记整理来自清风老师的数学建模课程:TOPSIS教程 目录 1. 层次分析法的局限性(主观求权重方法) 2. TOPSIS法引入 2.1 一个指标的情况 2.2 2 ...

  9. 归并排序算法原理和C++代码

    归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法的一个非常典型的应用. 算法原理: 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列: 设定两个指针,最初位置分别 ...

最新文章

  1. 【BZOJ3994】[SDOI2015]约数个数和 莫比乌斯反演
  2. 【MM模块】 Goods Issue 发货
  3. hook什么意思_这是什么骚代码!
  4. linux 电池管理软件,Linux电源管理(2)_Generic PM之基本概念和软件架构
  5. appium java简单实例_Appium创建一个Note的实例
  6. 织梦自定义表单地区联动类型不可用的解决办法
  7. python接口自动化测试一:http协议
  8. jQuery学习(七)— append方法与appendTo方法
  9. 【转】从TXT导入到dataGridView
  10. linux两个树莓派通信,Arduino与树莓派间的通信实践
  11. Ctfhub解题 彩蛋
  12. Confluence导出PDF文件乱码
  13. 橘子学设计模式之原型模式
  14. 学python自学多久_python自学要多久能学会
  15. Android 10 SystemUI 如何隐藏状态栏输入法图标
  16. java怎么创建jsp文件怎么打开_Eclipse中怎么创建jsp文件?
  17. 《只为遇见你》硬生生把爱情片拍成了把妹宝典,真人出镜演绎直男转型
  18. android远程控制(三)----通过后台服务实现系统点击事件模拟
  19. 90后人工智能程序猿小哥,我就是传说中的007
  20. CISP笔记 Cyrus

热门文章

  1. ICCV,CVPR,ECCV
  2. 辞职社保如何无缝衔接
  3. 通达oa php漏洞,通达OA系统傻逼上传漏洞分析,可以直接getshell附EXP
  4. .NET中使用ORACLE函数和过程并输出参数(2)
  5. 最新Docker教程(一)——各平台Docker安装
  6. mybatis动态sql,批量插入,批量删除,模糊查询
  7. Matlab 预防性维修,基于故障预测的预防性维修策略优化模型.pdf
  8. Vue相关开源项目库汇总
  9. 风信子网络工作室介绍
  10. 微型气泵、真空泵、水泵的电磁干扰问题