作者:GWD 时间:2019.06.28

一、 学习要点
1、问:DS1302的(双)总线与DHT11的单总线区别?
答:DS1302的总线是一条数据线,一条时钟线,此类总线“上写下读”,上升沿写入数据给器件,下降沿读取器件发送给主机的数据,此类传感器在读写操作前一定有控制命令发送给器件告知器件此次操作是读还是写,从而决定是给数据口赋值还是读取;DHT11的单总线类是靠检测数据线时长判断高点电平信号的。双总线串行就是把时钟信号当做一扇门了,配合数据信号进行操作。
2、问:串行数据通信接收/发送时高低位的次序怎么决定?
答:数据流发送方向与一元数轴类似从左向右传输,所以先传送低位;当主机接受数据,从机发送数据时候看为数轴的负方向所以先发送高位给主机;
3、问:DS1302数据格式怎么构成的?
答:
1)、写数据发送地址(写命令)+内容;
2)、读数据发送地址(读命令)+内容
4、问:出现实际两分钟的时候,DS1302的分钟才进位的原因?
答:在读取和写入函数中的数值左移一位语句的位置不是随便放置的,写入函数要在循环体末尾插入;读取函数时候要在循环体开始插入;若是多移一次正好差二倍;
5、问:八位数据中如何快速分出高四位与低四位?
答:除以十六就是高四位的值,对16做求余数运算结果就是低四位,同理可得32位数据拆分高16位于低16位;
6、问:时序图中菱形表示什么?
答:表示数据。
二、手册分析
1、

2、DS1302 是 DALLAS (达拉斯)公司推出的涓流充电时钟芯片 内含有一个实时时钟/日历和 31 字节静态 RAM 通过简单的串行接口与单片机进行通信,实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息,每月的天数和闰年的天数可自动调整 时钟操作可通过 AM/PM 指示决定采用 24 或 12 小时格式 DS1302 与单片机之间能简单地采用同步串行的方式进行通信 仅需用到三个口线 1 RES 复位 2 I/O 数据线 3 SCLK串行时钟 时钟/RAM 的读/写数据以一个字节或多达 31 个字节的字符组方式通信 DS1302 工作时功耗很低保持数据和时钟信息时功率小于 1mW
3、实时时钟具有能计算 2100 年之前的秒 分 时 日 日期 星期 月 年的能力 还有闰年调整的能力;
4、读/写时钟或 RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式;
5、引脚描述

6、DS1302 内部寄存器
CH: 时钟停止位 CH=0振荡器工作允许 CH=1振荡器停止;
WP: 写保护位 WP=0寄存器数据能够写入 WP=1寄存器数据不能写入;
TCS: 涓流充电选择 TCS=1010 使能涓流充电 TCS=其它禁止涓流充电;
DS: 二极管选择位 DS=01选择一个二极管 DS=10选择两个二极管,DS=00 或 11, 即使 TCS=1010, 充电功能也被禁止;
寄存器 2 的第 7 位 :12/24 小时标志 bit7=1,12 小时模式 bit7=0,24 小时模式;寄存器 2 的第 5 位:AM/PM 定义 AP=1下午模式 AP=0上午模式;

7、时序图

三:编程
1、 程序功能:在串口和LCD1602上显示时间
2、 程序效果


3、代码
DS1302.c

#include "DS1302.h"void Delay1ms()     //@11.0592MHz
{unsigned char i,j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);
}void Wr_Onebyte2DS1302(char cmd,char val )
{char i,j;RST = 0;CLK = 0;_nop_();RST = 1;for(i=0;i<8;i++)  //先发送低位{j = cmd & 0x01;if(j == 0){DAT_1 = 0 ;}else{DAT_1 = 1 ;}                           CLK = 1;CLK = 0;          cmd >>= 1;       }for(i=0;i<8;i++)  //先发送低位{j = val & 0x01;if(j == 0){DAT_1 = 0;}else{DAT_1 = 1;}                         CLK = 1;CLK = 0;      val >>= 1;   }RST = 0;
}
char Rd_OnebyteFromDS1302(char cmd)
{int i,j;RST = 0;CLK = 0;_nop_();RST = 1;cmd += 1;for(i=0;i<8;i++)    //先发送低位{       j = cmd & 0x01;_nop_();if(j == 0){DAT_1 = 0;}else{DAT_1 = 1 ;}_nop_();                         CLK = 1;_nop_();CLK = 0;          cmd >>= 1;       }for(i=0;i<8;i++)  //先读低位{    j >>= 1;_nop_();if(DAT_1 == 0) {j  &= 0x7f;           }else{j |= 0x80;   }CLK = 1;_nop_();CLK = 0;                 } RST = 0;return j;
}

Main.c

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "LCD1602.h"
#include "delay.h"
#include "stdio.h"
#include "DS1302.h"#define second_addr  0x80
#define min_addr    0x82
#define hour_addr   0x84
#define day_addr   0x86
#define month_addr   0x88
#define week_addr   0x8A
#define year_addr   0x8Ctypedef unsigned char uChar8;
typedef unsigned int uInt16;void InitUART  (void)
{SCON  = 0x50;             // SCON: 模式 1, 8-bit UART, 使能接收  TMOD |= 0x25;               // TMOD: timer 1, mode 2, 8-bit 重装                                //       timer 0,16位计数TR0=0;TL0 = 0;TH0 = 0;TH1   = 0xF4;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  TR1   = 1;                  // TR1:  timer 1 打开                         EA    = 1;                  //打开总中断ES    = 1;                  //打开串口中断TI=1;
}  void delay_ms(unsigned int x)   //延时 ms
{unsigned int a,b,c;for(c=x;c>0;c--){for(b=102;b>0;b--)for(a=3;a>0;a--);}
}void Delay1000ms()     //@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void main (void)
{char year,month,day,week,hour,miao,fen,miao_1,miao_2;InitUART ( );LCD1602_Init( );Wr_Onebyte2DS1302(0x8e,0x00);//写保护去除Wr_Onebyte2DS1302(year_addr,0x19);Wr_Onebyte2DS1302(month_addr,0x06);Wr_Onebyte2DS1302(day_addr,0x28);Wr_Onebyte2DS1302(week_addr,0x05);Wr_Onebyte2DS1302(hour_addr,0x08);Wr_Onebyte2DS1302(min_addr,0x16);Wr_Onebyte2DS1302(second_addr,0x30);Wr_Onebyte2DS1302(0x8e,0x80);//写保护去除while(1){year =Rd_OnebyteFromDS1302(year_addr);printf("年:%c%c  ",year / 16 + '0',year % 16 +'0');Display_CharOnLcd(3,0,year / 16 + '0');Display_CharOnLcd(4,0,year % 16 +'0');Display_CharOnLcd(5,0,'-');month =Rd_OnebyteFromDS1302(month_addr);printf("月:%c%c  ",month / 16 + '0',month % 16 +'0');Display_CharOnLcd(6,0,month / 16 + '0');Display_CharOnLcd(7,0,month % 16 +'0');Display_CharOnLcd(8,0,'-');day =Rd_OnebyteFromDS1302(day_addr);printf("日:%c%c  ",day / 16 + '0',day % 16 +'0');Display_CharOnLcd(9,0,day / 16 + '0');Display_CharOnLcd(10,0,day % 16 +'0');Display_CharOnLcd(11,0,'-');week =Rd_OnebyteFromDS1302(week_addr);printf("星期:%c\n\n\n\r",week + '0');     Display_CharOnLcd(12,0,week + '0');hour =Rd_OnebyteFromDS1302(hour_addr);printf("时:%c%c  ",hour / 16 + '0',hour % 16 +'0');Display_CharOnLcd(3,1,hour / 16 + '0');Display_CharOnLcd(4,1,hour % 16 +'0');Display_CharOnLcd(5,1,'-');fen =Rd_OnebyteFromDS1302(min_addr);printf("分:%c%c  ",fen / 16 + '0',fen % 16 + '0');Display_CharOnLcd(6,1,fen / 16 + '0');Display_CharOnLcd(7,1,fen % 16 + '0');Display_CharOnLcd(8,1,'-');miao = Rd_OnebyteFromDS1302(second_addr);miao_1 = miao / 16+'0';miao_2 = miao % 16+'0';printf("秒:%c%c\n\n\n\r",miao_1,miao_2);Display_CharOnLcd(9,1,miao_1);Display_CharOnLcd(10,1,miao_2);//Delay1000ms();}
}

代码下载地址:
链接:https://pan.baidu.com/s/1yt3sonu6KABuYn4yC__Htg
提取码:2q17

传感器自学笔记第十章——DS1302实时时钟模块(附51程序)相关推荐

  1. 树莓派基础实验32:DS1302实时时钟模块实验

    一.介绍   现在有很多流行的串行时钟芯片,如DS1302,DS1307,PCF8485等,由于简单的接口,低成本和易用性,他们被广泛应用于电话.传真.便携式仪器等产品领域.在本实验中,我们将使用DS ...

  2. 【ESP32】17.DS1302实时时钟模块实验(ThreeWire库 / RtcDS1302库)

    上一篇: [ESP32]16.RFID门禁系统实验(SPI总线 / MFRC522库) 前言: 先放电路连接图: DS1302 RTC模块,内置Tri流充电器的实时时钟(RTC),或Timekeepi ...

  3. 传感器自学笔记第二章——PCF8591 A/D模块

    PCF8591 A/D模块** 作者:gwd 日期:2019.06.20 一:学习要点 读取A/D转换值时,理解手册容易出错,应该参考IIC选择/随机读取的"伪"写方式读取,先发送 ...

  4. 51单片机学习笔记-8 DS1302实时时钟

    8 DS1302实时时钟 [toc] 注:笔记主要参考B站江科大自化协教学视频"51单片机入门教程-2020版 程序全程纯手打 从零开始入门". 注:工程及代码文件放在了本人的Gi ...

  5. 关于STM32驱动DS1302实时时钟的一点思考

    关于STM32驱动DS1302实时时钟的一点思考 之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难, ...

  6. 4.7 51单片机-DS1302 实时时钟芯片

    4.7 DS1302 实时时钟芯片 4.7.1 原理图介绍 图4-7-1 图4-7-2 驱动DS1302之前,实验板上需要将JP595跳线帽和J11跳线帽断开.JP1302跳线帽接上. 4.7.2 D ...

  7. 关于实时时钟模块DS1302使用心得

    最近在做万年历,用到实时时钟DS1302模块,花了两天时间看资料和写驱动,想记录一下我的学习经过,顺便做一下总结. 首先就是在图书馆查各种资料,于是查到的大多是这些,主要时硬件方面的资料: 其实能查到 ...

  8. 基于51单片机的DS1302实时时钟

    本讲内容: 介绍DS1302实时时钟芯片基本知识,演示DS1302例程. DS1302实时时钟: DS1302能提供包括秒.分.时.日期.月份和年份信息.闰年可自行调整,可选择12小时制和24小时制, ...

  9. DS1302实时时钟芯片

    DS1302 是 DALLAS(达拉斯) 公司推出的一款涓流充电时钟芯片, 2001 年 DALLAS 被 MAXIM(美信) 收购,因此我们看到的 DS1302 的数据手册既有 DALLAS 的标志 ...

最新文章

  1. c语言的表达式2 4 6 8的值,C语言程序设计测试题二
  2. linux如何敲打中文,vim敲字如弹琴 - linux-tao的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. (补)20200328:两两交换链表中的节点(leetcode24)
  4. 方舟手游服务器设置文件翻译,方舟手游咋设置翻译
  5. 非常不错的Coding-iOS开源项目
  6. 密码分析学中常见的攻击模式
  7. 芝麻信用分有哪些计算维度?关于大数据风控的87个问题
  8. Web:仿苹果官网首页HTML和CSS
  9. python中双重循环_python中双循环
  10. linux 做路由器系统下载文件,用Linux系统做路由器
  11. 用python写微信红包脚本_python 实现模拟微信发红包
  12. win7设置自动关机
  13. 用内网服务器对接微信公众号服务
  14. java关闭事件_为Java程序添加退出事件
  15. 用CountDownLatch模拟跑步比赛
  16. Levy process(列维过程)
  17. CSDN的markdown不能正常生成lim符号怎么破?
  18. 八数码问题中的逆序数
  19. 分享6个国内优秀Java后台管理框架的开源项目
  20. 安装CP2102驱动2021

热门文章

  1. SMT 常用术语解释
  2. java数组从小到大排序
  3. 金属有机骨架mof载药|阿霉素药物载体La/Tm-MOFs@SiO复合材料|PCN-224负载环丙沙星
  4. 人工智能基础之数学符号篇
  5. nexus安装 及配置阿里云代理
  6. 西门子MES simatic it 资料-西门子数字化
  7. 为什么要清除浮动?清除浮动的方式?
  8. 魔兽世界美服部落人数最多服务器,美服部落转联盟服务正式开启 规模继续扩大...
  9. 利用html开发英语单词小程,前端利用表单标签自己制作一个简单的表单页面-表单制作-小程序表单制作...
  10. 3.3差错控制(检错编码、纠错编码)