极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26765|回复: 7

为何DS1302时间不准?怎么样能更准确?

[复制链接]
发表于 2013-12-1 23:49:09 | 显示全部楼层 |阅读模式
         今日学着用LCD12864显示时间和温度,通过串口监视器校时,设置的初始时间和电脑系统时间一致,经过半小时运行后发现,时间快了2分钟,很是不准,由于DS1302是淘宝上买的模块,供电是通过pinMode(vccPin,OUTPUT);digitalWrite(vccPin,HIGH);实现,会不会是此处电压影响?还是晶振不好水货?另外发现时钟模块上没有并联电容?哪位知道怎样才能让时间更准确点?

附上实验源码:

//#include <stdio.h>
//#include <string.h>
#include <DS1302.h>
#include "U8glib.h"
// Universal 8bit Graphics Library, http://code.google.com/p/u8glib/

#include <OneWire.h>
#include <DallasTemperature.h>

U8GLIB_ST7920_128X64_4X u8g(9, 8, 7);        // SPI Com: SCK = en = 9, MOSI = rw = 8, CS = di = 7
uint8_t RST_PIN = 5;
uint8_t IO_PIN = 6;
uint8_t SCLK_PIN = 4;
int vccPin = 3;
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int vcc_tPin = 11; //用作18B20温度模块供电+
int gndPin = 10; //用作18B20温度模块供电-

/* 日期变量缓存 */
char buf[50];
char day[10];

/* 串口数据缓存 */
String comdata ="";
int numdata[7] ={0},j=0,mark =0 ;

/* 创建 DS1302 对象 */
DS1302 rtc(RST_PIN,IO_PIN,SCLK_PIN);

void print_time(){
    /* 从 DS1302 获取当前时间 */  
Time t = rtc.time();
     /* 将星期从数字转换为名称 */
memset(day,0,sizeof(day));
switch (t.day)
  {
     case 1: strcpy(day,"Sumday");break;
     case 2: strcpy(day,"Monday");break;
     case 3: strcpy(day,"Tuesday");break;
     case 4: strcpy(day,"");break;
     case 5: strcpy(day,"Wednesday");break;
     case 6: strcpy(day,"Friday");break;
     case 7: strcpy(day,"Saturday");break;
  }
     /* 将日期代码格式化凑成buf等待输出 */
    snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
    /* 输出日期到串口 */
    Serial.println(buf);
  /* 输出当前时间到LCD12864 */
u8g.setPrintPos(1, 35);   
u8g.setFont(u8g_font_cu12);
u8g.print(t.yr);
u8g.print("-");
u8g.print(t.mon);
u8g.print("-");
u8g.print(t.date);
u8g.print(" ");
u8g.print(t.hr);
u8g_printDigits(t.min);
u8g_printDigits(t.sec);
u8g.setPrintPos(2, 55);   
u8g.print(day);
/* 输出当前温度到LCD12864 */
  printTemperatures();
}

void u8g_printDigits(int digits){
u8g.print(":");
if(digits<10)
u8g.print('0');
u8g.print(digits);
}

void printTemperatures(){
  u8g.setPrintPos(75, 55);  
// u8g.setFont(u8g_font_fur17);
  sensors.setWaitForConversion(false);  // makes it async
  sensors.requestTemperatures();
  sensors.setWaitForConversion(true);
  u8g.print(sensors.getTempCByIndex(0));
  u8g.print("C");
}

void draw(void) {
  // graphic commands to redraw the complete screen should be placed here  
  //Font Overview ,please see http://code.google.com/p/u8glib/wiki/fontgroup
// u8g.setFont(u8g_font_unifont);
//  u8g.setFont(u8g_font_osb21);
//u8g.setFont(u8g_font_tpss);
u8g.setFont(u8g_font_baby);
u8g.drawStr( 0, 12, "http://hi.baidu.com/mizuda/");
   print_time();
}

void setup(){
Serial.begin(9600);
rtc.write_protect(false);
rtc.halt(false);
sensors.begin();
pinMode(vccPin,OUTPUT);
digitalWrite(vccPin,HIGH);
pinMode(vcc_tPin,OUTPUT);
digitalWrite(vcc_tPin,HIGH);
pinMode(gndPin,OUTPUT);
digitalWrite(gndPin,LOW);
}

void loop(){
//picture loop
u8g.firstPage();
do{
  draw();
}while(u8g.nextPage());


//set current datetime
/* 当串口有数据的时候,将数据拼接到变量comdata */
while(Serial.available()>0)
{
    comdata += char(Serial.read());
    delay(2);
    mark = 1;
}

  /* 以逗号分隔分解comdata的字符串,分解结果变成转换成数字到numdata[]数组 */
if(mark ==1){
   Serial.print("You inputed : ");
   Serial.println(comdata);
   for(int i=0;i<comdata.length();i++){
      if(comdata==',' || comdata == 0x10 || comdata == 0x13){
        j++;
      }
      else
      {
        numdata[j] = numdata[j]*10 + (comdata - '0');
      }
   }
   
   /* 将转换好的numdata凑成时间格式,写入DS1302 */
  Time t(numdata[0],numdata[1],numdata[2],numdata[3],numdata[4], numdata[5], numdata[6]);
   rtc.time(t);
   mark = 0;j= 0;
    /* 清空 comdata 变量,以便等待下一次输入 */
   
    comdata = String("");
     /* 清空 numdata */
    for(int i=0;i<7;i++)
     numdata=0;
}


delay(800);
}
回复

使用道具 举报

发表于 2013-12-2 09:23:25 | 显示全部楼层
晶振不太行,要想很准,只能换时钟芯片
回复 支持 反对

使用道具 举报

发表于 2013-12-3 00:02:13 | 显示全部楼层
ranqingfa 发表于 2013-12-2 09:23
晶振不太行,要想很准,只能换时钟芯片

换时钟芯片?
回复 支持 反对

使用道具 举报

发表于 2013-12-3 08:03:16 | 显示全部楼层
晶振外壳接地,还有接2个6pf电容
回复 支持 反对

使用道具 举报

发表于 2013-12-3 09:27:10 | 显示全部楼层
isilcala 发表于 2013-12-3 00:02
换时钟芯片?

就是别用1302了  换别的吧
回复 支持 反对

使用道具 举报

发表于 2013-12-3 13:50:26 来自手机 | 显示全部楼层
关注一下这个代码
回复 支持 反对

使用道具 举报

发表于 2013-12-3 14:17:08 | 显示全部楼层
ranqingfa 发表于 2013-12-3 09:27
就是别用1302了  换别的吧

比如呢?1307?还是别的?

但再不济,1302总也不该这么不准吧。
回复 支持 反对

使用道具 举报

发表于 2013-12-4 13:05:12 | 显示全部楼层
isilcala 发表于 2013-12-3 14:17
比如呢?1307?还是别的?

但再不济,1302总也不该这么不准吧。

这么不准说明晶振很不准,或者干脆就是芯片有问题,如果你想要准的试试ds3231
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 04:30 , Processed in 0.041251 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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