flashria 发表于 2013-1-18 00:08:53

arduino与ds3234芯片制作时钟

本帖最后由 flashria 于 2013-1-18 22:36 编辑

这本来是提问贴,因为我第一次焊贴片的芯片 焊的时间长了些第一块芯片搞坏了我重新焊了块 没问题了 所以该成教程贴 供大家参考把。

概述
DS3234是一款低成本、超高精度、采用SPI™总线的实时时钟(RTC),集成了温度补偿晶体振荡器(TCXO)和晶体。DS3234内置经过温度补偿的精密电压基准和比较器电路用来监视VCC。当VCC跌落至低于电源失效电压(VPF)时,器件产生/RST输出;当VCC跌落至同时低于VPF和VBAT时,器件将禁止读/写访问。器件还对/RST引脚进行监视,可作为按钮输入以产生μP复位。当器件的主电源中断时,器件切换至备用电源输入以保持精确的计时。集成的晶体谐振器增强了器件的长期精度同时减少了生产线上的零件数量。DS3234提供商业级和工业级温度范围,并采用工业标准300mil、20引脚SO封装。

DS3234还集成了采用电池备份的256字节SRAM。当主电源掉电时,通过连接至VBAT引脚的电源,内存上的内容得以保持。RTC可以计数秒、分、时、星期、日期、月份和年份信息。对于少于31天的月份,器件能够在月末自动调整日期,同时带有闰年修正功能。该时钟可以工作在24小时或带/AM/PM指示的12小时制式。器件提供每天两个可编程定时闹钟和一路可编程方波输出。地址和数据通过SPI双向总线串行传输。

我的接线图

官方线路

代码
#include <SPI.h>
const int cs=8; //chip select
void setup(){
Serial.begin(9600);
RTC_init();
SetTimeDate(05,10,12,14,15,16);
}
void loop(){
Serial.println(ReadTimeDate());
}
int RTC_init(){
pinMode(cs,OUTPUT);
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE3);
digitalWrite(cs,LOW);
SPI.transfer(0x8E);
SPI.transfer(0x60);
digitalWrite(cs,HIGH);
delay(10);
}
int SetTimeDate(int d, int mo,int y ,int h,int mi,int s){
int TimeDate={s,mi,h,0,d,mo,y};
for(int i=0;i<=6;i++){
    if(i==3)
      i++;
      int b=TimeDate/10;
      int a=TimeDate-b*10;
      if(i==2){
      if(b==2)
          b=B00000010;
         else if(b==1)
         b=B00000001;
      }
   TimeDate=a+(b<<4);
   digitalWrite(cs, LOW);
   SPI.transfer(i+0x80);
   SPI.transfer(TimeDate);
   digitalWrite(cs, HIGH);
}
}
String ReadTimeDate(){
String temp;
int TimeDate ;
for(int i=0; i<=6;i++){
if(i==3)
      i++;
digitalWrite(cs, LOW);
SPI.transfer(i+0x00);
unsigned int n = SPI.transfer(0x00);
digitalWrite(cs, HIGH);
int a=n & B00001111;
if(i==2){
      int b=(n & B00110000)>>4; //24 hour mode if(b==B00000010)
      if(b==B00000010)
            b=20;
      else if(b==B00000001)
          b=10;
      TimeDate=a+b;
}
    else if(i==4){
      int b=(n & B00110000)>>4;
      TimeDate=a+b*10;
    }
    else if(i==5){
      int b=(n & B00010000)>>4;
      TimeDate=a+b*10;
    }
    else if(i==6){
      int b=(n & B11110000)>>4;
       TimeDate=a+b*10;
   }
    else{
    int b=(n & B01110000)>>4;
    TimeDate=a+b*10;
    }
}
temp.concat(TimeDate);
temp.concat("/") ;
temp.concat(TimeDate);
temp.concat("/") ;
temp.concat(TimeDate);
temp.concat(" ") ;
temp.concat(TimeDate);
temp.concat(":") ;
temp.concat(TimeDate);
temp.concat(":") ;
temp.concat(TimeDate);
return(temp);
}

wasdpkj 发表于 2013-1-18 00:44:33

没用过,不过看样子SQW脚你没接上

flashria 发表于 2013-1-18 08:27:08

wasdpkj 发表于 2013-1-18 00:44
没用过,不过看样子SQW脚你没接上

对的 那个地方我没看明白 不知道那个vpu和曲折线是什么

wasdpkj 发表于 2013-1-18 20:37:01

flashria 发表于 2013-1-18 08:27 static/image/common/back.gif
对的 那个地方我没看明白 不知道那个vpu和曲折线是什么

曲线是电阻吧,vpu也许是mcu的正极吗。。

紫气东来 发表于 2014-8-19 00:04:08

你这个程序有个问题,不能同步电脑上的时间,而是需要自己输入相应的数据设定时间,现在如何利用这段程序同步电脑上的时间呢?

kefeng1001 发表于 2019-12-2 21:52:34

能不能在写一个在LCD1602上显示出日期和时间
页: [1]
查看完整版本: arduino与ds3234芯片制作时钟