Вы находитесь на странице: 1из 7

21

RTC1307

REAL TIME CLOCK


Real Time Clock berhubungan dengan waktu mulai dari detik, menit, jam, hari, tanggal, bulan
dan tahun. Tetapi IC RTC ini juga bisa dipakai untuk menyimpan data di dalam internal RAM RTC ini, di
mana data tersebut tidak bisa hilang meskipun supply diputus, hal ini karena di dalam
IC RTC tersebut ada battery-nya yang selalu hidup untuk menjalankan clock-nya jadi waktu
(clock) tetap berjalan meskipun supply dimatikan. IC RTC ini masih mempunyai kelebihan bisa dipakai
sebagai timer atau alarm. Untuk hitungan detik, menit, jam, hari, tanggal, bulan dan tahun dengan
tahun kabisat yang valid sampai 2100 karena compensation valid up to 2100. Mode yang dipilih juga
bisa 12 or 24 hour clock with AM dan PM in 12 hour mode.
RTC 1307 menggunakan teknik I2C yaitu memakai 2 jalur untuk keperluan transfer data secara
seri, sedangkan SPI dan MicroWire memakai 3 jalur. Semua teknik mempunyai 1 jalur untuk Clock, I2C
hanya punya satu jalur data 2 arah, sedangkan SPI dan MicroWire mempunyai 2 jalur data satu arah,
masing-masing untuk jalur data masuk dan jalur data keluar.
Komunikasi dengan protokol I2C pada RTC 1307 mempunyai cara yang sama seperti mengakses
eeprom serial tipe 24C04 misalnya. Pertama kirim start-bit, alamat RTC(0xC0) dengan bit R/W low,
kemudian nomor register yang ingin diakses.

KONFIGURASI PIN
Untuk lebih jelas mengenai fungsi dan kegunaan dari IC ini terlebih dahulu akan dijelaskan
fungsi dari tiap-tiap pin pada IC keluarga DS1307, di mana diketahui bahwa IC DS1307 memiliki 8 pin
atau kaki, seperti pada Gambar 1.

Gambar 1. Pin-pin IC DS1307 (Dallas, 2004)

Fungsi dari tiap pin RTC DS1307 antara lain :


1. X1, X2
Terhubung dengan kaki kristal 32768kHz
2. Vbat
Terhubung dengan battery 3,3 volt
3. GND, Vcc
Input tegangan Vcc adalah +5V.
4. SQW (Square Wave Output)
Pin SQW dapat mengeluarkan sinyal salah satu dari 13 taps yang disediakan oleh 15 tingkat
pembagi internal dari RTC.
5. SCL
Pin SCL mengeluarkan sinyal clock. Pin ini harus diberi resistor Pull Up.
6. SDA
Pin SCL mengeluarkan sinyal data

RANGKAIAN MEMBACA RTC DS1307


Rangkaian berikut digunakan untuk membaca data RTC1307 dengan menggunakan
mikrokontroller. Rangkaian tersebut menggunakan LCD untuk menampilkan data waktu.
22
U r t c
Y 1
1 5
2 X 1 S D A
6 X 2 7
Z T B
S C L SK Q W / O U T
U 8 3
8 V B A T

1
P 2 . 0 V C C V C C
3 9 2 1 B T 1
3 8 P 0 . 0 / A P D 2 0. 0 / 2 A 2 8P 2 . 1
3 7 P 0 . 1 / A P D 2 1. 1 / 2 A 3 9P 2 . 2 B A T T E R D Y S 1 3 0 7
3 6 P 0 . 2 / AP D2 . 2 2 / A2 41 P0 2 . 3
P 0 . 3 / AP D2 . 3 3 / A2 51 P1

2
3 5 2 . 4
3 4 P 0 . 4 / AP D2 . 4 4 / A2 61 P2 2 . 5 P D 5
3 3 P 0 . 5 / AP D2 . 5 5 / A2 71 P3 2 . 6 P D 6
3 2 P 0 . 6 / AP D2 . 6 6 / A2 81 P4 2 . 7
H E A D E R 5 P 0 . 7 / AP D2 . 7 7 / A 1 5 R R T C 1
P 1 _ 01 1 0 R R T C 2
R S T P 1 _ 12 P 1 . 0 P 3 . 0 / R 1 1X D
1 P 1 _ 23 P 1 . 1 P 3 . 1 / T1 X2 D
2 P 1 . 2 P 3 . 2 / I 1N 3 T 0 V C C
P 1 _ 34
3 P 1 _ 45 P 1 . 3 P 3 . 3 / I 1N 4 T 1 V C C
4 G N D P 1 _ 56 P 1 . 4 P 3 . 4 /1 T 5 0
5 P 1 . 5 P 3 . 5 /1 T 6 1 J 1 6 .
P 1 _ 67
P 1 _ 78 P 1 . 6 P 3 . 6 / W1 7 R
J P 4 P 1 . 7 P 3 . 7 / R D 1
1 9 3 0 V C C 2
1 8 X T A L A 1 L E / P R2 9 O G 3
X T A L 2 P S E N 5 k P 2 . 5 4
X 1
3 1 R 9 5
V C C E A / V P P
9 P 2 . 4 6
R S T 7
1 2 M H z
8
C 3 A T 8 9 S 5 1 9
1 0 u 1 0
3 0 p 3 0 p R E S E T P 2 . 0 1 1
C 6 C 7 R S T P 2 . 1 1 2
P 2 . 2
C

1 3
R 2 D 3 P 2 . 3 1 4
4 K 7 1 5
1 N 4 0 0 2 1 6

C
A

D 3
H E A D E R 1 6
1 N 4 0 0 2

V C C

A
Gambar 2. Rangkaian RTC DS1307 mikrokontroller

PEMROGRAMAN MEMBACA RTC DS1307


Setelah membuat rangkaian RTC DS1307 mikrokontroller, maka sekarang saatnya Anda
membuat program library LCD dan library i2c.
Library LCD sebagai berikut:
/*
* Filename : lcd.h
* I/O : RS -> P2.5
* Enable -> P2.4
* Data4567 -> P2.0,P2.1,P2.2,P2.3
* Compiler : SDCC
*/

#define LCD_en P2_4


#define LCD_rs P2_5
#define LCD_DELAY 1535
#define LCD_clear() LCD_command(0x1)
#define LCD_origin() LCD_command(0x2)
#define LCD_row1() LCD_command(0x80)
#define LCD_row2() LCD_command(0xC0)

void LCD_delay(unsigned char ms);


void LCD_enable();
void LCD_command(unsigned char command);
void LCD_putc(unsigned char ascii);
void LCD_puts(unsigned char *lcd_string);
void LCD_init();

void LCD_delay(unsigned char ms)


{
unsigned char n;
unsigned int i;
for (n=0; n<ms; n++)
{
for (i=0; i<LCD_DELAY; i++);
}
}

void LCD_enable()
{
23
LCD_en = 0;
LCD_delay(1);
LCD_en = 1;
}

void LCD_command(unsigned char command)


{
LCD_rs = 0;
P2 = (P2 & 0xF0)|((command>>4) & 0x0F);
LCD_enable();
P2 = (P2 & 0xF0)|(command & 0x0F);
LCD_enable();
LCD_delay(1);
}

void LCD_putc(unsigned char ascii)


{
LCD_rs = 1;
P2 = (P2 & 0xF0)|((ascii>>4) & 0x0F);
LCD_enable();
P2 = (P2 & 0xF0)|(ascii & 0x0F);
LCD_enable();
LCD_delay(1);
}

void LCD_puts(unsigned char *lcd_string)


{
while (*lcd_string)
{
LCD_putc(*lcd_string++);
}
}

void LCD_init()
{
LCD_en = 1;
LCD_rs = 0;
LCD_command(0x33);
LCD_command(0x32);
LCD_command(0x28);
LCD_command(0x0C);
LCD_command(0x06);
LCD_command(0x01);
LCD_delay(256);
}

Library I2C sebagai berikut:


/*
* Filename : i2c.h
* I/O : SDA -> P2.7
* SCL -> P2.6
* Compiler : SDCC
*/

#define SDA P2_7


#define SCL P2_6
#define I2C_DELAY 0x0F

void I2C_delay(void)
{
unsigned char i;
for(i=0; i<I2C_DELAY; i++);
}
24

void I2C_clock(void)
{
I2C_delay();
SCL = 1;
I2C_delay();
SCL = 0;
}

void I2C_start(void)
{
if(SCL)
SCL = 0;
SDA = 1;
SCL = 1;
I2C_delay();
SDA = 0;
I2C_delay();
SCL = 0;
}

void I2C_stop(void)
{
if(SCL)
SCL = 0;
SDA = 0;
I2C_delay();
SCL = 1;
I2C_delay();
SDA = 1;
}

bit I2C_write(unsigned char dat)


{
bit data_bit;
unsigned char i;
for(i=0;i<8;i++)
{
data_bit = dat & 0x80;
SDA = data_bit;
I2C_clock();
dat = dat<<1;
}
SDA = 1;
I2C_delay();
SCL = 1;
I2C_delay();
data_bit = SDA;
SCL = 0;
I2C_delay();
return data_bit;
}

unsigned char I2C_read(void)


{
bit rd_bit;
unsigned char i, dat;
dat = 0x00;
for(i=0;i<8;i++)
{
I2C_delay();
SCL = 1;
I2C_delay();
rd_bit = SDA;
25
dat = dat<<1;
dat = dat | rd_bit;
SCL = 0;
}
return dat;
}

void I2C_ack()
{
SDA = 0;
I2C_delay();
I2C_clock();
SDA = 1;
}

void I2C_noack()
{
SDA = 1;
I2C_delay();
I2C_clock();
SCL = 1;
}

Library DS1307 sebagai berikut:


/*
* Filename : ds1307.h
* I/O : SDA -> P2.7
* SCL -> P2.6
* Compiler : SDCC
*/

#include "i2c.h" /* Need i2c bus */

#define DS1307_ID 0xD0


#define SEC 0x00
#define MIN 0x01
#define HOUR 0x02
#define DATE 0x04
#define MONTH 0x05
#define YEAR 0x06
unsigned char DS1307_get(unsigned char addr)
{
unsigned char ret;
I2C_start();
I2C_write(DS1307_ID);
I2C_write(addr);
I2C_start();
I2C_write(DS1307_ID+1);
ret = I2C_read();
I2C_stop();
return ret;
}

void DS1307_settime(unsigned char hh, unsigned char mm, unsigned char ss)
{
I2C_start();
I2C_write(DS1307_ID);
I2C_write(0x00);
I2C_write(ss);
I2C_write(mm);
I2C_write(hh);
I2C_stop();
}
26

void DS1307_setdate(unsigned char dd, unsigned char mm, unsigned char yy)
{
I2C_start();
I2C_write(DS1307_ID);
I2C_write(0x04);
I2C_write(dd);
I2C_write(mm);
I2C_write(yy);
I2C_stop();
}

Setelah membuat library RTC, maka sekarang saatnya Anda membuat program yang digunakan untuk
membaca waktu dari RTC dan ditampilkan di LCD..
Program sebagai berikut ini
//Program Bab 10.1 RTC DS1307
#include <at89x51.h>
#include "ds1307.h"
#include "lcd.h"

void PowerOn()
{
unsigned char inner, outer;
for (outer = 0x00; outer < 0x10; outer++)
{
for (inner = 0x00; inner < 0xFF; inner++);
}
LCD_init();
for (inner = 0; inner < 10; inner++)
LCD_delay(2);
}

void send2lcd(unsigned char value)


{
unsigned char buf = 0;
buf = value & 0xF0; /* Filter for high byte */
buf = (buf>>4)|(0x30); /* Convert to ascii code */

LCD_putc(buf);
buf = value & 0x0F;
buf = buf | 0x30;
LCD_putc(buf);
}

/******* Main function ********/


void main(void)
{
unsigned char sec, min, hour, date, month, year;

PowerOn();
LCD_row1(); LCD_puts("Date:");
LCD_row2(); LCD_puts("Time:");

while(1)
{
/* Get Date & Time */
sec = DS1307_get(SEC);
min = DS1307_get(MIN);
hour = DS1307_get(HOUR);
date = DS1307_get(DATE);
month = DS1307_get(MONTH);
year = DS1307_get(YEAR);

LCD_command(0x86);
27
send2lcd(date);
LCD_putc('/');
send2lcd(month);
LCD_putc('/');
send2lcd(year);
LCD_command(0xC6);
send2lcd(min);
LCD_putc(':');
send2lcd(hour);
LCD_putc(':');
send2lcd(sec);
}
}

Вам также может понравиться