实时时钟DS1302实验

实验现象

通过DS1302的读取获取年,月,日,星期,时,分,秒的值,然后串口显示在PC上
通过4个按键设定当前的时间
按键1(设置):按一下进入设置状态,在按下退出设置状态
按键2(切换):按一下切换一种设置变量,分别可以设置年,月,日,星期,时,分,秒
按键3(加1):可以对当前的设置变量进行加1操作
按键4(减1):可以对当前的设置变量进行减1操作

理论学习

  • DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
  • DS1302的引脚排列,其中Vcc2为主电源,VCC1为后备电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据传送的方法。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK为时钟输入端。 下图为DS1302的引脚功能图:

原理图

代码编写

#define RST 7
#define SCLK 6
#define IO 5
//#define L(item) digitalWrite((item),LOW)
//#define H(item) digitalWrite((item),HIGH)
#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) ; //SCLK的上升沿, 芯片会读取IO端口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; //读操作最低位置为1 pinMode(IO,OUTPUT);digitalWrite(RST,LOW); //下拉低,再拉高digitalWrite(SCLK,LOW) ; //SCLK的上升沿, 芯片会读取IO端口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}; // 2011-12-22 3:4:1Serial.println("set tm ...");writeAllTm(tm);
}

实时时钟DS1302实验相关推荐

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

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

  2. 基于Proteus学习单片机系列(七)——实时时钟DS1302

    获取更多资源,请关注微信公众号:嵌入式基地 获取项目资源:公众号后台回复:单片机仿真 基于Proteus学习单片机系列(一)--点亮LED 基于Proteus学习单片机系列(二)--驱动数码管 基于P ...

  3. Arduino 实时时钟DS1302模块

    Arduino 实时时钟DS1302模块 DS1302模块 开发板选择Arduino uno板子 所使用的库:国内镜像地址:https://codechina.csdn.net/mirrors/msp ...

  4. 【STC单片机学习】第十四课:SPI通信-实时时钟DS1302

    [朱老师课程总结 侵删] 第一部分.章节目录 1.14.1.RTC有关的背景知识 1.14.2.原理图和接线 1.14.3.数据手册带读 1.14.4.时序图的读法1​ 1.14.5.编程实践1 1. ...

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

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

  6. DS1302实时时钟及实验【时序定义、数据读写】

    RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟芯片. 1.引脚定义和应用电路 2.内部结构 寄存器定义和命令字 寄存器:其中,第一行的CH表示时钟暂停控制位,置1表示 ...

  7. vc 串口 实时保存_Arduino提高篇22—实时时钟DS1302

    关注.星标公众号,不错过精彩内容 编辑:Tony 来源:公众号TonyCode 很多电子爱好者都热衷制作电子时钟来练手,这些时钟会使用数码管.点阵屏.LCD液晶屏.OLED屏.TFT屏等显示模块,所使 ...

  8. Arduino提高篇22—实时时钟DS1302

    很多电子爱好者都热衷制作电子时钟来练手,这些时钟会使用数码管.点阵屏.LCD液晶屏.OLED屏.TFT屏等显示模块,所使用的RTC时钟芯片也各不相同,DS1302.DS3231.DS12C887等.通 ...

  9. arduino uno r3单片机封装图_Arduino提高篇22—实时时钟DS1302

    关注.星标公众号,不错过精彩内容 编辑:Tony 来源:公众号TonyCode 很多电子爱好者都热衷制作电子时钟来练手,这些时钟会使用数码管.点阵屏.LCD液晶屏.OLED屏.TFT屏等显示模块,所使 ...

最新文章

  1. [JAVA EE] JPA 技术实践:完成增、删、改、查操作
  2. 吐槽express 中间件multer
  3. 播放视频一会,出错并自动关闭
  4. 高并发编程-重新认识Java内存模型(JMM)
  5. 无限极分类不知pid_PHP实现无限极分类
  6. vue - blog开发学7
  7. if-else运用及技巧(C# 参考)
  8. Intellj Idea 如何设置类头注释和方法注释
  9. [转载] Python字典的setdefault()方法
  10. android traceview工具,[Android]Android TraceView工具使用
  11. 「AI」一文看懂“声纹识别VPR”
  12. 神经网络算法入门书籍,bp神经网络算法的优点
  13. ChromeDriver版本(最新v2.45)与Chrome版本(最新v72)支持关系以及下载地址
  14. 14Python爬虫---爬虫伪装浏览器
  15. 导数公式、导数运算法则、复合函数求导、幂指函数求导
  16. Guava学习之Splitter
  17. malloc失败的一个原因
  18. 幼儿园带括号算式口诀_幼儿园括号题教案
  19. Mybatis-Plus如何使用
  20. POJ 2248 搜索

热门文章

  1. css-图片模糊处理-blur
  2. photoshop 去掉背景
  3. android 旋转屏幕全屏,重新组合活动布局以在旋转屏幕时全屏播放video
  4. JVM监控及诊断工具-GUI篇
  5. Laravel 资源管理器 destory方法
  6. Unreal Engine 4 渲染目标(Render Target)教程 之 实现雪地足迹(上)
  7. amd锐龙笔记本cpu怎么样_九代酷睿还是AMD锐龙?多款标压笔记本处理器性能实测对比...
  8. 上班族一定得学会、掌握的jpg转word技巧
  9. clipboard.js
  10. html图片实现左右滑动,css实现图片左右滑动