洛克王国专用号 发表于 2013-12-1 23:49:09

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

         今日学着用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;
char day;

/* 串口数据缓存 */
String comdata ="";
int numdata ={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 = numdata*10 + (comdata - '0');
      }
   }
   
   /* 将转换好的numdata凑成时间格式,写入DS1302 */
Time t(numdata,numdata,numdata,numdata,numdata, numdata, numdata);
   rtc.time(t);
   mark = 0;j= 0;
    /* 清空 comdata 变量,以便等待下一次输入 */
   
    comdata = String("");
   /* 清空 numdata */
    for(int i=0;i<7;i++)
   numdata=0;
}


delay(800);
}

ranqingfa 发表于 2013-12-2 09:23:25

晶振不太行,要想很准,只能换时钟芯片

isilcala 发表于 2013-12-3 00:02:13

ranqingfa 发表于 2013-12-2 09:23 static/image/common/back.gif
晶振不太行,要想很准,只能换时钟芯片

换时钟芯片?

game00over 发表于 2013-12-3 08:03:16

晶振外壳接地,还有接2个6pf电容

ranqingfa 发表于 2013-12-3 09:27:10

isilcala 发表于 2013-12-3 00:02 static/image/common/back.gif
换时钟芯片?

就是别用1302了换别的吧

maxims 发表于 2013-12-3 13:50:26

关注一下这个代码

isilcala 发表于 2013-12-3 14:17:08

ranqingfa 发表于 2013-12-3 09:27 static/image/common/back.gif
就是别用1302了换别的吧

比如呢?1307?还是别的?

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

ranqingfa 发表于 2013-12-4 13:05:12

isilcala 发表于 2013-12-3 14:17 static/image/common/back.gif
比如呢?1307?还是别的?

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

这么不准说明晶振很不准,或者干脆就是芯片有问题,如果你想要准的试试ds3231
页: [1]
查看完整版本: 为何DS1302时间不准?怎么样能更准确?