# DS1307 and the I2C Bus

I wrote an article about my experiences with the DS1307 real-time clock. It also give a mini-overview about I2C bus communications. I thought some of you might find it interesting so I’m posting a link.

http://www.glacialwanderer.com/hobbyrobotics/?p=12

The article also has some example code I wrote that lets you write and read the time and date off this chip. The code also converts the DS1307’s binary-coded decimal based numbers to normal numbers that are easier for me to use on my other projects. Here is a copy of that code.

``````// Maurice Ribble
// 4-17-2008
// http://www.glacialwanderer.com/hobbyrobotics

// This code tests the DS1307 Real Time clock on the Arduino board.
// The ds1307 works in binary coded decimal or BCD.  You can look up
// bcd in google if you aren't familior with it.  There can output
// a square wave, but I don't expose that in this code.  See the
// ds1307 for it's full capabilities.

#include <Wire.h>

// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}

// Stops the DS1307, but it has the side effect of setting seconds to 0
// Probably only want to use this for testing
/*void stopDs1307()
{
Wire.send(0);
Wire.send(0x80);
Wire.endTransmission();
}*/

// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers
void setDateDs1307(byte second,        // 0-59
byte minute,        // 0-59
byte hour,          // 1-23
byte dayOfWeek,     // 1-7
byte dayOfMonth,    // 1-28/29/30/31
byte month,         // 1-12
byte year)          // 0-99
{
Wire.send(0);
Wire.send(decToBcd(second));    // 0 to bit 7 starts the clock
Wire.send(decToBcd(minute));
Wire.send(decToBcd(hour));      // If you want 12 hour am/pm you need to set
// bit 6 (also need to change readDateDs1307)
Wire.send(decToBcd(dayOfWeek));
Wire.send(decToBcd(dayOfMonth));
Wire.send(decToBcd(month));
Wire.send(decToBcd(year));
Wire.endTransmission();
}

// Gets the date and time from the ds1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
// Reset the register pointer
Wire.send(0);
Wire.endTransmission();

// A few of these need masks because certain bits are control bits
*hour       = bcdToDec(Wire.receive() & 0x2f);  // Need to change this if 12 hour am/pm
}

void setup()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
Wire.begin();
Serial.begin(9600);

// Change these values to what you want to set your clock to.
// You probably only want to set your clock once and then remove
// the setDateDs1307 call.
second = 45;
minute = 3;
hour = 7;
dayOfWeek = 5;
dayOfMonth = 17;
month = 4;
year = 8;
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
}

void loop()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
Serial.print(hour, DEC);
Serial.print(":");
Serial.print(minute, DEC);
Serial.print(":");
Serial.print(second, DEC);
Serial.print("  ");
Serial.print(month, DEC);
Serial.print("/");
Serial.print(dayOfMonth, DEC);
Serial.print("/");
Serial.print(year, DEC);
Serial.print("  Day_of_week:");
Serial.println(dayOfWeek, DEC);

delay(1000);
}
``````

Excellent!

You could add a description of how the DS1307 is hooked up in the initial comment section.

There's a description and diagram after the link. I'm glad I read this this morning - I added a thru hole version of the chip to my digikey order!

It is true that the article has a description of this, but I agree with trialax that having a description in the code would be nice for those who only look at the code. I couldn't edit my message above to add it in, but I did modify the code on the tutorial to have the following comment.

/ This code assumes DS1307's SCL is attached to Adruino's analog // pin 5 with a pull-up resister and that SDA is attached to Adruino's // analog pin 4 with a pull-up resister. 2.2K is a good value for both // pullup resisters. The voltage being pulled to is 5V.

Eustace, I'm glad you found this useful :)