DS1307是我们使用较多的一款时间日历芯片,当然,我们也可以作为方波发生器来使用,本质上可以作为信号发生器的一定会有晶振来参与。
虽然它内含了56个字节的NVRAM记忆体,但从管脚的设计来说,这款芯片使用起来非常简单明了。
主要引脚定义如下: X1、32.768kHz 晶振接入端;
VBAT:X2:+3V 电池电压输入;
SDA: 串行数据;
SCL:串行时钟;
SQW/OUT:方波/输出驱动器。
很显然,对于这款芯片来说,必须有两个管脚(X1和X2)来接晶振。SCL和SDA为数据通讯管脚。剩下的就是Vcc与Vbat用来接电源了,接好他们我们就可以用起来了。电路图如下:
上图,我们采用了LM1602作为显示输出。默认的是I2C的接口方式。读写取芯片记忆体的数据直接用getDate()和setDate()即可轻松完成。初始化对象和使用串口一样用begin(),代码如下:
#include <LiquidCrystal.h>
#include <DS1307.h>
#include <Wire.h>
LiquidCrystal lcd(13,12,11,10,9,8);
int clock[7];
void setup(){
for(int i=3;i<8;i++){
pinMode(i,INPUT);
}
lcd.begin(20,2);
DS1307.begin();
DS1307.setDate(16,4,29,0,17,50,04);
}
void loop(){
DS1307.getDate(clock);
lcd.setCursor(0,1);
lcd.print("Time: ");
Print(clock[4]);
lcd.print(":");
Print(clock[5]);
lcd.print(":");
Print(clock[6]);
lcd.setCursor(0,0);
lcd.print("Date: ");
Print(clock[1]);
lcd.print("/");
Print(clock[2]);
lcd.print("/");
lcd.print("20");
Print(clock[0]);
//minutes will be limited and reseted;
if(digitalRead(7)){
clock[5]++;
if(clock[5]>59) clock[5]=0;
DS1307.setDate(clock[0],clock[1],clock[2],0,clock[4],clock[5],clock[6]);
while(digitalRead(7));
}
//clock will be limited and reseted;
if(digitalRead(6)){
clock[4]++;
if(clock[4]>23) clock[4]=0;
DS1307.setDate(clock[0],clock[1],clock[2],0,clock[4],clock[5],clock[6]);
while(digitalRead(6));
}
//days will be limited and reseted;
if(digitalRead(5)){
clock[2]++;
if(clock[2]>31) clock[2]=1;
DS1307.setDate(clock[0],clock[1],clock[2],0,clock[4],clock[5],clock[6]);
while(digitalRead(5));
}
//months will be limited and reseted;
if(digitalRead(4)){
clock[1]++;
if(clock[1]>12) clock[1]=1;
DS1307.setDate(clock[0],clock[1],clock[2],0,clock[4],clock[5],clock[6]);
while(digitalRead(4));
}
//years will be limited and reseted;
if(digitalRead(3)){
clock[0]++;
if(clock[0]>99) clock[0]=0;
DS1307.setDate(clock[0],clock[1],clock[2],0,clock[4],clock[5],clock[6]);
while(digitalRead(3));
}
delay(100);
}
void Print(int number){
lcd.print(number/10);
lcd.print(number%10);
}