查看: 1477|回复: 33

[经验] 【Arduino】108种传感器模块系列实验(29)---DS1302时钟模块

[复制链接]
  • TA的每日心情
    开心
    2019-10-16 06:31
  • 签到天数: 168 天

    [LV.7]常住居民III

    发表于 2019-6-18 18:31 | 显示全部楼层 |阅读模式
    本帖最后由 eagler8 于 2019-8-27 09:36 编辑

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试做实验,不管成功与否,都会记录下来---小小的进步或是搞不定的问题,希望能够抛砖引玉。


    【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)

    实验二十九:DS1302实时时钟模块(带电池CR2032 掉电走时)


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


    00 (1).jpg

  • TA的每日心情
    开心
    2019-10-16 06:31
  • 签到天数: 168 天

    [LV.7]常住居民III

     楼主| 发表于 2019-6-19 17:41 | 显示全部楼层

    kittenblock中小学创客名师推荐的图形化编程软件

    /*
    【Arduino】37种传感器模块系列实验(29)
    实验二十九:DS1302实时时钟模块(带电池CR2032 掉电走时)之一
    */
    
    #define RST 5    
    #define SCLK 7
    #define IO 6
    #define uchar unsigned char   
    
    void setup() {    
      pinMode(RST,OUTPUT);
      pinMode(SCLK,OUTPUT);
      pinMode(IO,OUTPUT);
      Serial.begin(9600);
      attachInterrupt(0, settm, FALLING );  
    }
    
    void writeData(unsigned char addr,unsigned char dat){ 
      pinMode(IO,OUTPUT);
      digitalWrite(RST,LOW);   
      digitalWrite(SCLK,LOW) ;
      delayMicroseconds(1);
      digitalWrite(RST,HIGH); 
    
      int i;
      for(i =0;i<8;i++){
        digitalWrite(SCLK,LOW);
        digitalWrite(IO, addr&1);
        addr =addr>>1;
        digitalWrite(SCLK,HIGH);
        delayMicroseconds(1);
      }
    
      for(i =0;i<8;i++){
          digitalWrite(SCLK,LOW);
          digitalWrite(IO, dat&1);
          dat =dat>>1;
          digitalWrite(SCLK,HIGH);
          delayMicroseconds(1);
      }
      digitalWrite(RST,LOW);
    }
    
    uchar readData(uchar addr){              
      addr = addr | 1; 
    
      pinMode(IO,OUTPUT);
      digitalWrite(RST,LOW); 
      digitalWrite(SCLK,LOW) ;
      delayMicroseconds(1);
      digitalWrite(RST,HIGH); 
    
      int i;
      for(i =0;i<8;i++){                
        digitalWrite(SCLK,LOW);
        digitalWrite(IO, addr&1);
        addr =addr>>1;
        digitalWrite(SCLK,HIGH);
        delayMicroseconds(1);
      }
      pinMode(IO,INPUT);               
    
      int dat = 0;
      for(i =0;i<8;i++){
          digitalWrite(SCLK,LOW);
          delayMicroseconds(10);
          uchar b = digitalRead(IO);
          dat = dat >>1;
    
          dat = dat | (b<<7); 
          digitalWrite(SCLK,HIGH);
          delayMicroseconds(1);
      }
      digitalWrite(RST,LOW);  
      return dat ;
    }
    
    #define SECOND  0x80   
    #define MIN 0x82
    #define HOUR 0x84
    #define DAY 0x86
    #define MONTH 0x88
    #define YEAR 0x8C
    #define WEEK 0x8A
    
    void writeTimeUnit(uchar TYPE,uchar data){
    
      uchar high = data / 10;
      uchar low = data % 10;
      uchar d = ((data /10) << 4) | (data % 10);
      writeData(TYPE,data);
    }
    
    uchar readTimeUnit(uchar TYPE){  
      uchar r = readData(TYPE);
      r = 10*(r >> 4)+ (r & 0xf);    
      return r;
    }
    
    void writeAllTm(uchar tm[]){
      uchar s = SECOND;
      for(uchar i=0;i<5;i++){
        writeTimeUnit(s,tm[5-i]);
        s+=2;
      }
      writeTimeUnit(YEAR,tm[0]);
    }
    
    void readAllTm(uchar tm[]){  
      uchar s = SECOND;
      for(uchar i=0;i<5;i++){
        tm[5-i] = readTimeUnit(s);  
        s+=2;
      }  
      tm[0] = readTimeUnit(YEAR);
      tm[6] = readTimeUnit(WEEK);
    }
    
    
    void printTm(uchar tm[]){
      Serial.print(tm[0]);
      Serial.print("-");
      Serial.print(tm[1]);
      Serial.print("-");
      Serial.print(tm[2]);
      Serial.print(" ");
    
      Serial.print(tm[3]);
      Serial.print(":");
    
      Serial.print(tm[4]);
      Serial.print(":");
    
      Serial.print(tm[5]);
      Serial.print(" week ");
    
      Serial.print(tm[6]);
      Serial.println();
    }
    uchar st = 0;
    void loop() {            
        uchar tm[7] = {0};   
        readAllTm(tm);
        printTm(tm);
        delay(1000);
    }
    
    void settm()
    {
        uchar tm[] = {11,12,13,4,5,6 ,0};
        Serial.println("set tm ...");
          writeAllTm(tm);
    }

  • TA的每日心情
    开心
    2019-10-16 06:31
  • 签到天数: 168 天

    [LV.7]常住居民III

     楼主| 发表于 2019-6-18 19:33 | 显示全部楼层
    DS1302的内部结构


    02.jpg
  • TA的每日心情
    开心
    2019-10-16 06:31
  • 签到天数: 168 天

    [LV.7]常住居民III

     楼主| 发表于 2019-6-18 19:42 | 显示全部楼层
    DS1302管脚描述
    X1 X2 32.768KHz 晶振管脚
    GND 地
    RST 复位脚
    I/O 数据输入/输出引脚
    SCLK 串行时钟
    Vcc1,Vcc2 电源供电管脚
    03.jpg

  • TA的每日心情
    开心
    2019-10-16 06:31
  • 签到天数: 168 天

    [LV.7]常住居民III

     楼主| 发表于 2019-6-19 14:43 | 显示全部楼层
    03-.jpg
  • TA的每日心情
    开心
    2019-10-16 06:31
  • 签到天数: 168 天

    [LV.7]常住居民III

     楼主| 发表于 2019-6-19 14:49 | 显示全部楼层
    DS1302主要性能指标:
    ★ 实时时钟具有能计算2100 年之前的秒、分、时、日、星期、月、年的能力,还有闰年调整的能力
    ★ 31 8 位暂存数据存储RAM
    ★ 串行 I/O 口方式使得管脚数量最少
    ★ 宽范围工作电压2.0 5.5V
    ★ 工作电流 2.0V 时,小于300nA
    ★ 读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式
    ★ 8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配
    ★ 简单 3 线接口
    ★ 与 TTL 兼容Vcc=5V
    ★ 可选工业级温度范围-40 +85
    ★ 双电源管用于主电源和备份电源供应

    00-.jpg

  • TA的每日心情
    开心
    2019-10-16 06:31
  • 签到天数: 168 天

    [LV.7]常住居民III

     楼主| 发表于 2019-6-19 14:57 | 显示全部楼层
    很多DS1302 存在时钟精度不高,是因为选用的晶振易受环境影响,出现时钟混乱等缺点。DS1302可以用于数据记录,特别是对某些具有特殊意义的数据点的记录,能实现数据与出现该数据的时间同时记录。这种记录对长时间的连续测控系统结果的分析及对异常数据出现的原因的查找具有重要意义。传统的数据记录方式是隔时采样或定时采样,没有具体的时间记录,因此,只能记录数据而无法准确记录其出现的时间;若采用单片机计时,一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且,某些测控系统可能不允许。但是,如果在系统中采用时钟芯片DS1302,则能很好地解决这个问题。
    0-1.jpg
  • TA的每日心情
    开心
    2019-10-16 06:31
  • 签到天数: 168 天

    [LV.7]常住居民III

     楼主| 发表于 2019-6-19 15:01 | 显示全部楼层
    应用电路


    04 (1).jpg

    04 (2).jpg
  • TA的每日心情
    开心
    2019-10-16 06:31
  • 签到天数: 168 天

    [LV.7]常住居民III

     楼主| 发表于 2019-6-19 15:40 | 显示全部楼层
    04 (3).jpg

    04-.jpg
  • TA的每日心情
    开心
    2019-10-16 06:31
  • 签到天数: 168 天

    [LV.7]常住居民III

     楼主| 发表于 2019-6-19 15:49 | 显示全部楼层
    DS1302实时时钟模块

    05.jpg

  • TA的每日心情
    开心
    2019-10-16 06:31
  • 签到天数: 168 天

    [LV.7]常住居民III

     楼主| 发表于 2019-6-19 15:57 | 显示全部楼层
    模块参数
    1.PCB为单面板,尺寸:44mm*23mm*1.6mm
    2.带4个定位孔,直径3.1mm
    3.备用电池为正品天球CR2032,电压3V,电流260mAh,非可充电电池。理论数据保持时间大于10年!
    4.晶振32.768KHz,日本原装进口晶振,匹配电容为6pF,尺寸2*6mm
    5.DS1302为8脚直插国产大芯片,芯片下面有IC座,方便更换及插拔芯片
    6.模块工作电压兼容3.3V/5V,可与5V及3.3V单片机连接
    7.工作温度:0°---70°
    06 (3).jpg

    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    SpiderRobot 蜘蛛
    SpiderRobot 蜘蛛
    关于SpiderRobot 项目实行方案 之前有人推荐我做这个项目,于是乎就有了这个 h
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    求助!GM65二维码扫描模块怎么用?
    求助!GM65二维码扫描模块
    求助!GM65二维码扫描模块怎么用? 卖家给的资料真的看不懂该怎么弄。。( ̄▽ ̄)~*
    KPM大比拼
    KPM大比拼
    前言:没别的就是比手快! 方案描述: 做这个的初衷其实是受到一些网红玩具的启发—
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表