Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: eagler8

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

[复制链接]
 楼主| 发表于 2019-8-30 07:25 | 显示全部楼层
16.jpg
 楼主| 发表于 2019-8-31 12:02 | 显示全部楼层
21.jpg
 楼主| 发表于 2019-9-3 20:48 | 显示全部楼层
21.jpg
 楼主| 发表于 2019-9-5 15:43 | 显示全部楼层
17.jpg
发表于 2019-12-3 13:53 | 显示全部楼层
在吗大佬 方便加个微信探讨下嘛
发表于 2019-12-3 13:57 | 显示全部楼层
这里权限限制的太厉害了 打个招呼都没资格 服了 我Q:981505743
 楼主| 发表于 2019-12-3 18:35 | 显示全部楼层
nkun 发表于 2019-12-3 13:57
这里权限限制的太厉害了 打个招呼都没资格 服了 我Q:981505743

先加好友,几年前就没用QQ了,加微信吧
 楼主| 发表于 2019-12-3 18:54 | 显示全部楼层
本帖最后由 eagler8 于 2020-10-27 10:09 编辑
  1. /*
  2. 【Arduino】37种传感器模块系列实验(29)
  3. 实验二十九:DS1302实时时钟模块(带电池CR2032 掉电走时)之三
  4. */

  5. #define RST 5   
  6. #define SCLK 7
  7. #define IO 6
  8. #define uchar unsigned char   

  9. void setup() {   
  10.   pinMode(RST,OUTPUT);
  11.   pinMode(SCLK,OUTPUT);
  12.   pinMode(IO,OUTPUT);
  13.   Serial.begin(9600);
  14.   attachInterrupt(0, settm, FALLING );  
  15. }

  16. void writeData(unsigned char addr,unsigned char dat){
  17.   pinMode(IO,OUTPUT);
  18.   digitalWrite(RST,LOW);   
  19.   digitalWrite(SCLK,LOW) ;
  20.   delayMicroseconds(1);
  21.   digitalWrite(RST,HIGH);

  22.   int i;
  23.   for(i =0;i<8;i++){
  24.     digitalWrite(SCLK,LOW);
  25.     digitalWrite(IO, addr&1);
  26.     addr =addr>>1;
  27.     digitalWrite(SCLK,HIGH);
  28.     delayMicroseconds(1);
  29.   }

  30.   for(i =0;i<8;i++){
  31.       digitalWrite(SCLK,LOW);
  32.       digitalWrite(IO, dat&1);
  33.       dat =dat>>1;
  34.       digitalWrite(SCLK,HIGH);
  35.       delayMicroseconds(1);
  36.   }
  37.   digitalWrite(RST,LOW);
  38. }

  39. uchar readData(uchar addr){              
  40.   addr = addr | 1;

  41.   pinMode(IO,OUTPUT);
  42.   digitalWrite(RST,LOW);
  43.   digitalWrite(SCLK,LOW) ;
  44.   delayMicroseconds(1);
  45.   digitalWrite(RST,HIGH);

  46.   int i;
  47.   for(i =0;i<8;i++){               
  48.     digitalWrite(SCLK,LOW);
  49.     digitalWrite(IO, addr&1);
  50.     addr =addr>>1;
  51.     digitalWrite(SCLK,HIGH);
  52.     delayMicroseconds(1);
  53.   }
  54.   pinMode(IO,INPUT);               

  55.   int dat = 0;
  56.   for(i =0;i<8;i++){
  57.       digitalWrite(SCLK,LOW);
  58.       delayMicroseconds(10);
  59.       uchar b = digitalRead(IO);
  60.       dat = dat >>1;

  61.       dat = dat | (b<<7);
  62.       digitalWrite(SCLK,HIGH);
  63.       delayMicroseconds(1);
  64.   }
  65.   digitalWrite(RST,LOW);  
  66.   return dat ;
  67. }

  68. #define SECOND  0x80   
  69. #define MIN 0x82
  70. #define HOUR 0x84
  71. #define DAY 0x86
  72. #define MONTH 0x88
  73. #define YEAR 0x8C
  74. #define WEEK 0x8A

  75. void writeTimeUnit(uchar TYPE,uchar data){

  76.   uchar high = data / 10;
  77.   uchar low = data % 10;
  78.   uchar d = ((data /10) << 4) | (data % 10);
  79.   writeData(TYPE,data);
  80. }

  81. uchar readTimeUnit(uchar TYPE){  
  82.   uchar r = readData(TYPE);
  83.   r = 10*(r >> 4)+ (r & 0xf);   
  84.   return r;
  85. }

  86. void writeAllTm(uchar tm[]){
  87.   uchar s = SECOND;
  88.   for(uchar i=0;i<5;i++){
  89.     writeTimeUnit(s,tm[5-i]);
  90.     s+=2;
  91.   }
  92.   writeTimeUnit(YEAR,tm[0]);
  93. }

  94. void readAllTm(uchar tm[]){  
  95.   uchar s = SECOND;
  96.   for(uchar i=0;i<5;i++){
  97.     tm[5-i] = readTimeUnit(s);  
  98.     s+=2;
  99.   }  
  100.   tm[0] = readTimeUnit(YEAR);
  101.   tm[6] = readTimeUnit(WEEK);
  102. }


  103. void printTm(uchar tm[]){
  104.   Serial.print(tm[0]);
  105.   Serial.print("-");
  106.   Serial.print(tm[1]);
  107.   Serial.print("-");
  108.   Serial.print(tm[2]);
  109.   Serial.print(" ");

  110.   Serial.print(tm[3]);
  111.   Serial.print(":");

  112.   Serial.print(tm[4]);
  113.   Serial.print(":");

  114.   Serial.print(tm[5]);
  115.   Serial.print(" week ");

  116.   Serial.print(tm[6]);
  117.   Serial.println();
  118. }
  119. uchar st = 0;
  120. void loop() {            
  121.     uchar tm[7] = {0};   
  122.     readAllTm(tm);
  123.     printTm(tm);
  124.     delay(1000);
  125. }

  126. void settm()
  127. {
  128.     uchar tm[] = {11,12,13,4,5,6 ,0};
  129.     Serial.println("set tm ...");
  130.       writeAllTm(tm);
  131. }
复制代码

发表于 2020-1-31 16:34 | 显示全部楼层

这是51单片机的应用呀!
 楼主| 发表于 2020-2-1 08:24 | 显示全部楼层
tigerzq 发表于 2020-1-31 16:34
这是51单片机的应用呀!

可以通过Arduino的编译验证

360截图20200201082240964.jpg


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

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2022-12-10 01:03 , Processed in 0.072200 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表