极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17446|回复: 5

小试DS1302时钟芯片

[复制链接]
发表于 2016-12-17 19:19:21 | 显示全部楼层 |阅读模式
最近设计了一款板子,带有DS1302,打样回来焊接好,正好arduino开发板调一下,P板硬件连接有MCU、DS1302、电源插座等,这次单独调试DS1302,所以不使用外接电源给MCU供电,只使用arduino电源给DS1302回路供电,如下,P板其他的功能大家去猜吧


我用导线引出了DS1302和arduino通信连接的三个脚:SCK、IO、RST。因为该导线属于硬导线,一碰就会掉或者接触不良,所以和arduino实物连接图没拍,底端蓝线就是电源,拿万用表量了10遍,确保和DS1302电源通路。大家一看程序也就对接线一目了然

程序随后,下载,通过串口查看,显示初始时间2000-00-00 00:00:00,然后每秒输出一次,但是第一次发现通过串口输入设置时间无反应,秒数超过60,输入格式是年月日时分秒星期数,星期日是1、星期六是7,这一次也没接纽扣电池

将接线重新插了一遍好了,时间设置输出正确

后面接上纽扣电池,再设置当天时间,中间输入是之前把星期数设置错了

下午再上电看到时间已被记忆,自动更新

程序见下

  1. uint8_t CE_PIN   = 5;
  2. uint8_t IO_PIN   = 6;
  3. uint8_t SCLK_PIN = 7;

  4. char buf[50];
  5. char day[10];
  6. String comdata = "";
  7. int numdata[7] ={0}, j = 0, mark = 0;
  8. DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);

  9. void print_time()
  10. {
  11.     Time t = rtc.time();
  12.     memset(day, 0, sizeof(day));
  13.     switch (t.day)
  14.     {
  15.     case 1: strcpy(day, "Sunday"); break;
  16.     case 2: strcpy(day, "Monday"); break;
  17.     case 3: strcpy(day, "Tuesday"); break;
  18.     case 4: strcpy(day, "Wednesday"); break;
  19.     case 5: strcpy(day, "Thursday"); break;
  20.     case 6: strcpy(day, "Friday"); break;
  21.     case 7: strcpy(day, "Saturday"); break;
  22.     }
  23.     snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
  24.     Serial.println(buf);
  25. }


  26. void setup()
  27. {
  28.     Serial.begin(9600);
  29.     rtc.write_protect(false);
  30.     rtc.halt(false);
  31. }

  32. void loop()
  33. {
  34.     while (Serial.available() > 0)
  35.     {
  36.         comdata += char(Serial.read());
  37.         delay(2);
  38.         mark = 1;
  39.     }

  40.     if(mark == 1)
  41.     {
  42.         Serial.print("You inputed : ");
  43.         Serial.println(comdata);
  44.         for(int i = 0; i < comdata.length() ; i++)
  45.         {
  46.             if(comdata[i] == ',' || comdata[i] == 0x10 || comdata[i] == 0x13)
  47.             {
  48.                 j++;
  49.             }
  50.             else
  51.             {
  52.                 numdata[j] = numdata[j] * 10 + (comdata[i] - '0');
  53.             }
  54.         }
  55.         Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]);
  56.         rtc.time(t);
  57.         mark = 0;j=0;
  58.         comdata = String("");
  59.         for(int i = 0; i < 7 ; i++) numdata[i]=0;
  60.     }
  61.     print_time();
  62.     delay(1000);
  63. }
复制代码


最后有两个问题提醒一下:
1、1302很挑晶振,只有6PF的那种才能用。由于DS1302在芯片本身已经集成了6pF的电容,所以,为了获得稳定可靠的时钟,必须选用具有6pF负载电容的晶振。我的芯片是5块钱一片,调试完发现没有问题


2、有人说3.3V供电,Ds1302会正常工作,开始我先5V工作一段时间后断电转为3.3V,输出如下,之前分钟确实记忆了,但是日期又返回了初始化阶段
日期,且秒数会超过59,手册上说宽电压2.5V-5.5V是骗人的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2016-12-17 19:20:08 | 显示全部楼层
我的IDE版本1.0,如果程序编译不过,请换版本
回复 支持 反对

使用道具 举报

发表于 2016-12-17 20:49:54 | 显示全部楼层
意图何在  表示看不懂
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-17 21:05:33 | 显示全部楼层
单片机菜鸟 发表于 2016-12-17 20:49
意图何在  表示看不懂

              学习记录
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-29 05:02 , Processed in 0.041280 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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