极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 27173|回复: 5

arduino与ds3234芯片制作时钟

[复制链接]
发表于 2013-1-18 00:08:53 | 显示全部楼层 |阅读模式
本帖最后由 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双向总线串行传输。

我的接线图

官方线路

代码
  1. #include <SPI.h>
  2. const int cs=8; //chip select
  3. void setup(){
  4. Serial.begin(9600);
  5. RTC_init();
  6. SetTimeDate(05,10,12,14,15,16);
  7. }
  8. void loop(){
  9.   Serial.println(ReadTimeDate());
  10. }
  11. int RTC_init(){
  12.   pinMode(cs,OUTPUT);
  13.   SPI.begin();
  14.   SPI.setBitOrder(MSBFIRST);
  15.   SPI.setDataMode(SPI_MODE3);
  16.   digitalWrite(cs,LOW);
  17.   SPI.transfer(0x8E);
  18.   SPI.transfer(0x60);
  19.   digitalWrite(cs,HIGH);
  20.   delay(10);
  21. }
  22. int SetTimeDate(int d, int mo,int y ,int h,int mi,int s){
  23.   int TimeDate[7]={s,mi,h,0,d,mo,y};
  24.   for(int i=0;i<=6;i++){
  25.     if(i==3)
  26.       i++;
  27.       int b=TimeDate[i]/10;
  28.       int a=TimeDate[i]-b*10;
  29.       if(i==2){
  30.         if(b==2)
  31.           b=B00000010;
  32.          else if(b==1)
  33.            b=B00000001;
  34.       }
  35.      TimeDate[i]=a+(b<<4);
  36.      digitalWrite(cs, LOW);
  37.      SPI.transfer(i+0x80);
  38.      SPI.transfer(TimeDate[i]);
  39.      digitalWrite(cs, HIGH);
  40.   }
  41. }
  42. String ReadTimeDate(){
  43.   String temp;
  44. int TimeDate [7];
  45. for(int i=0; i<=6;i++){
  46.   if(i==3)
  47.       i++;
  48.   digitalWrite(cs, LOW);
  49.   SPI.transfer(i+0x00);
  50.   unsigned int n = SPI.transfer(0x00);
  51.   digitalWrite(cs, HIGH);
  52.   int a=n & B00001111;
  53.   if(i==2){
  54.       int b=(n & B00110000)>>4; //24 hour mode if(b==B00000010)
  55.         if(b==B00000010)
  56.             b=20;
  57.         else if(b==B00000001)
  58.           b=10;
  59.         TimeDate[i]=a+b;
  60. }
  61.     else if(i==4){
  62.       int b=(n & B00110000)>>4;
  63.       TimeDate[i]=a+b*10;
  64.     }
  65.     else if(i==5){
  66.       int b=(n & B00010000)>>4;
  67.       TimeDate[i]=a+b*10;
  68.     }
  69.     else if(i==6){
  70.       int b=(n & B11110000)>>4;
  71.        TimeDate[i]=a+b*10;
  72.      }
  73.     else{
  74.     int b=(n & B01110000)>>4;
  75.     TimeDate[i]=a+b*10;
  76.     }
  77. }
  78. temp.concat(TimeDate[4]);
  79. temp.concat("/") ;
  80. temp.concat(TimeDate[5]);
  81. temp.concat("/") ;
  82. temp.concat(TimeDate[6]);
  83. temp.concat(" ") ;
  84. temp.concat(TimeDate[2]);
  85. temp.concat(":") ;
  86. temp.concat(TimeDate[1]);
  87. temp.concat(":") ;
  88. temp.concat(TimeDate[0]);
  89. return(temp);
  90. }
复制代码

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2013-1-18 00:44:33 | 显示全部楼层
没用过,不过看样子SQW脚你没接上
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-1-18 08:27:08 来自手机 | 显示全部楼层
wasdpkj 发表于 2013-1-18 00:44
没用过,不过看样子SQW脚你没接上

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

使用道具 举报

发表于 2013-1-18 20:37:01 | 显示全部楼层
flashria 发表于 2013-1-18 08:27
对的 那个地方我没看明白 不知道那个vpu和曲折线是什么

曲线是电阻吧,vpu也许是mcu的正极吗。。
回复 支持 反对

使用道具 举报

发表于 2014-8-19 00:04:08 | 显示全部楼层
你这个程序有个问题,不能同步电脑上的时间,而是需要自己输入相应的数据设定时间,现在如何利用这段程序同步电脑上的时间呢?
回复 支持 反对

使用道具 举报

发表于 2019-12-2 21:52:34 | 显示全部楼层
能不能在写一个在LCD1602上显示出日期和时间
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 19:35 , Processed in 0.039971 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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