Kamis, 27 Desember 2012

Membuat Jam Digital


DS1307 merupakan IC Real Time Clock (RTC) yang dapat diakses dengan mikrokontroler menggunakan komunikasi serial I2C. Berikut ini contoh untuk menampilkan RTC DS1307 pada LCD menggunakan Bascom AVR. Dengan adanya RTC ini maka kita dapat menampilkan waktu yang berupa jam, menit, dan detik, serta tanggal, yaitu hari, bulan dan tahun, seperti yang tercatum di datasheet DS1307.


Koneksi RTC DS1307 dengan Mikrokontroler
Berikut ini gambar schematic dari rangkaian RTC DS1307 yang disimulasikan di proteus 7.4 dengan menggunakan Mikrokontroler ATmega32.


Data jam pada RTC disimulasi ini dapat dirubah dengan menekan swicth seting jam agar terhubung ke groud. Maka  data detik, menit dan jam dapat disesuaikan, Berikut ini listing program rtc ds1307 menggunakan bascom AVR.

$regfile = "m32def.dat"
$crystal = 12000000

'konfigurasi pin LCD
   Config Porta = Output
   Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.2 , Rs = Porta.0
   Config Lcd = 16 * 4 : Cursor Off
   Cls

   $lib "ds1307clock.lib"

'konfigurasi pin Sda & Scl untuk komunikasi I2C
   Config Sda = Portc.1
   Config Scl = Portc.0

'nilai konstanta Ds1307  saat tulis dan baca
   Const Ds1307w = &HD0
   Const Ds1307r = &HD1

'konfiguasi input pust bottom
   Config Pinb.0 = Input , Pinb.1 = Input , Pinb.2 = Input , Pinb.3 = Input
   Config Debounce = 30

'Pendeklarasian variabel yang digunakan'
   Dim A As Byte , B As Byte , Data1 As Byte , C As Byte
   Dim Detik As Byte , Menit As Byte , Jam As Byte

Cursor Off
Cls

'program utama
Cls
   Main:
   Do
   Gosub Ds1307
   Gosub Seting
   Gosub Pustbottom
Loop

Ds1307:
      I2cstart
      I2cwbyte Ds1307w                   'kirim alamat register RAM
      I2cwbyte 0                         'kirim alamat o  yang dibaca detik
      I2cstart
      I2cwbyte Ds1307r                   'baca alamat register RAM
      I2crbyte Detik , Ack               'Variable Detik
      I2crbyte Menit , Ack               'Variable Menit
      I2crbyte Jam , Nack                'variable Jam
      I2cstop

Detik = Makedec(detik) : Menit = Makedec(menit) : Jam = Makedec(jam)
If Detik > 59 Then Detik = 0
If Menit > 59 Then Menit = 0
If Jam > 23 Then
Jam = 0
Gosub Detik
End If

Return
Seting:
If Pinb.3 = 1 Then Gosub Disply_seting
Disply_seting:
      Locate 3 , 1
      Lcd "Jam = "
      If Jam < 10 Then
      Lcd "0" ; Jam ; ":" ;
      Else
      Lcd Jam ; ":" ;
      End If

      If Menit < 10 Then
      Lcd "0" ; Menit ; ":" ;
      Else
      Lcd Menit ; ":" ;
      End If

      If Detik < 10 Then
      Lcd "0" ; Detik
      Else
      Lcd Detik
      End If

Locate 4 , 1
If Jam = 6 Then
Lcd "selamat pagi "
End If

Locate 4 , 1
If Jam = 10 Then
Lcd "selamat Siang"
End If

Locate 4 , 1
If Jam = 16 Then
Lcd "selamat sore"
End If

Return
Pustbottom:
   Debounce Pinb.0 , 0 , Detik , Sub
   Debounce Pinb.1 , 0 , Menit , Sub
   Debounce Pinb.2 , 0 , Jam , Sub

Return
Detik:
      Incr Detik
      If Detik > 59 Then Detik = 0
      Detik = Makebcd(detik)
      I2cstart
      I2cwbyte Ds1307w
      I2cwbyte 0
      I2cwbyte Detik
      I2cstop
      Return

Menit:
      Incr Menit
      If Menit > 59 Then Menit = 0
      Menit = Makebcd(menit)
      I2cstart
      I2cwbyte Ds1307w
      I2cwbyte 1
      I2cwbyte Menit
      I2cstop
      Return
Jam:
      Incr Jam
      If Jam > 23 Then Jam = 0
      Jam = Makebcd(jam)
      I2cstart
      I2cwbyte Ds1307w
      I2cwbyte 2
      I2cwbyte Jam
      I2cstop

Return

semoga bisa bermafaat ..^_^