Translate

Membuat Peraga Jam Dengan Led 7 Segmen Dilengkapi Dengan Alarm



Hai Sobat yang baik. Pada tulisanku sebelum ini, kita sudah melihat apa dan bagaimana mengoperasikan chip RTC-RAM baik dengan DS1302 maupun DS1307. Kita juga sudah membahas mengenai pengoperasian peraga dengan LED 7 segmen. Bagaimana kalau kali ini kita mencoba mengimplementasikan apa yang sudah pernah ditulis tersebut dalam sebuah rangkaian yang mungkin bermanfaat dan menyenangkan bagi para penghobi elektronik digital.

Tulisanku kali ini akan membahas mengenai pembuatan peraga jam menggunakan RTC-RAM DS1307 dengan penampil LED 7 segmen. Sebagai mikrokontroler akan digunakan AT89C51 dari keluarga MCS51 yang murah meriah. Sebelum merancang, ada baiknya kita memahami apa yang diinginkan pada rangkaian kita. Maka aku akan buatkan identifikasi spesifikasi rancangan tersebut, yaitu:

  1. Rangkaian akan menampilkan peragaan waktu dalam format jam dan menit. Untuk itu setidaknya memerlukan 4 digit LED 7 segmen.
  2. Rangkaian juga bisa menampilkan tanggal dan bulan jika perlu tahun dengan menekan tombol tertentu yang berkaitan dengan peragaan tanggal, bulan dan tahun. Nah, tombol-tombol ini juga akan digunakan juga untuk pengaturan waktu.
  3. Rangkaian juga akan dilengkapi dengan sistem alarm untuk memberikan tambahan fasilitas yang menarik.

Wah banyak juga ya maunya. Tapi sebagai penghobi seharusnya semakin banyak semakin menarik. Sekarang kita mulai saja merancang rangkaian yang diinginkan.

Karena kita hanya akan menampilkan sebanyak 4 digit, maka aku menetapkan menggunakan teknik peragaan LED 7 segmen secara scanning untuk menghemat komponen. Agar terlihat atraktif akan ditambahkan 2 buah LED untuk flashing detik.


Untuk melakukan seting waktu dan alarm aku gunakan 2 tombol saja biar hemat, yaitu untuk tombol menu (SET) dan tombol untuk display (CEK). Tidak apa-apa kan?

Sebelum lupa, untuk alarm diperlukan 1 pin lagi.

Nah, kita langsung lihat rangkaiannya saja.



Untuk penampil waktu menggunakan sebanyak 12 saluran gerbang dengan rincian 7 bit gerbang P0 terdiri dari P00 –  P06 untuk dekoder LED 7 segmen dan 4 bit gerbang P1 yaitu P10 – P13 untuk scanning digit (LED1 – LED4). Sementara indikator detik menggunakan P07.

Untuk informasi waktu kita menggunakan DS1307 yang memiliki antarmuka I2C sehingga hanya membutuhkan 2 saluran gerbang yaitu P26 untuk SCLK dan P27 untuk SDA. DS1307 memiliki fitur keluaran gelombang persegi atau SQW yang akan disetel pada perioda 1 detik dan dihubungan pada gerbang p25.

Peraga waktu kita dilengkapi dengan tombol untuk pengaturan yang terdiri dari SET dihubungkan pada gerbang P20 dan CEK pada gerbang P21.

Nah, sebagai pelengkap akan kita tambahkan keluaran untuk alarm yang akan dihubungkan pada buzer melalui gerbang P23.

Oke lah, kita langsung saja menuju barisan program yang harus diisikan pada mikrokontroler.

$mod51

BufferWaktu       data  8h
BufferProg        data  0bh

RegBendera        data  2fh
      FSRDY       bit   RegBendera.0
      FACK        bit   RegBendera.1
      FLB         bit   RegBendera.2
      Menu        bit   RegBendera.3
      Dsp         bit   RegBendera.4
      Ubahan      bit   RegBendera.5
      Pulsa       bit   RegBendera.6
      Alarm       bit   RegBendera.7

Data7Seg          data  p0
LED_Detik         bit   p0.7

Digit7Seg         data  p1
Digit1            bit   p1.0
Digit2            bit   p1.1
Digit3            bit   p1.2
Digit4            bit   p1.3

T_Set             bit   p2.0
T_Cek             bit   p2.1

Buzzer            bit   p2.3

SDA               bit   p2.7
SCL               bit   p2.6

PulsaDetik  bit   p2.5

StackPointer      data  30h

org   0h

Inisialisasi:
      mov   sp, #StackPointer-1
      mov   r0, #BufferWaktu
      mov   a, #8
      mov   b, #0
      acall DS1307_Read
      mov   a, BufferWaktu
      anl   a, #01111111b
      mov   BufferWaktu, a
      mov   a, BufferWaktu+2
      anl   a, #00111111b
      mov   BufferWaktu+2, a
      mov   BufferWaktu+7, #10h
      mov   a, #8
      mov   b, #0
      acall DS1307_Write
      mov   Data7Seg, #255
      mov   Digit7Seg, #11110111b
      mov   r2, #128

Setelah inisialisasi, program dimulai dengan melakukan beberapa pemeriksaan termasuk tombol dan status pulsa SQW dari DS1307.

Mulai:
      jnb   T_Set, TombolMenu
      jnb   T_Cek, TombolCek
      jb    PulsaDetik, PeragaDetik
      jnb   LED_Detik, Peraga
      setb  Pulsa
      clr   LED_Detik
      jb    Menu, Peraga
      jb    Dsp, Peraga

Penyegaran informasi waktu diambil pada pulsa rendah yang diindikasikan oleh SQW. Jumlah data yang diambil berjumlah 11 byte meskipun beberapa tak digunakan, dimulai dari alamat register 01H atau register menit. Data lainnya yang dibaca meliputi jam, hari (tidak digunakan) tanggal, bulan, tahun dan kontrol (tak dipakai) serta 4 byte isi data RAM yang berisi menit dan jam alarm, durasi alarm dan Bell Chime penunjuk pergantian jam.

Setelah penyegaran informasi waktu, jika seting Bell Chime bukan 0 maka setiap nilai menit menunjuk 00 berarti juga perubahan jam maka program akan mengaktifkan buzzer selama 5 detik sesuai isi register R4. Tetapi fasilitas Bell Chime tidak dijalankan jika status alarm sedang aktif.

      AmbilWaktu:
            mov   r0, #BufferWaktu+1
            mov   a, #10
            mov   b, #01h
            acall DS1307_Read
            clr   LED_Detik
            jb    Alarm, PeriksaSelesai
            mov   a, BufferWaktu+11
            jz    PeriksaAlarm
            mov   a, BufferWaktu+1
            jnz   BellChime
            clr   Buzzer
            mov   r4, #5
            ajmp  PeriksaAlarm

            BellChime:
                  setb  Buzzer

Berikut adalah program memeriksa waktu alarm. Data alarm yang ada pada RAM DS1307 dan disimpan pada BufferWaktu diperiksa. Jika sama maka bit Alarm dan buzzer akan diaktifkan. Lamanya durasi alarm juga dimasukkan pada register R4 untuk dicacah mundur, nanti.

            PeriksaAlarm:
                  mov   a, BufferWaktu+8
                  xrl   a, BufferWaktu+1
                  jnz   PeriksaSelesai
                  mov   a, BufferWaktu+9
                  xrl   a, BufferWaktu+2
                  jnz   PeriksaSelesai
                  mov   r4, BufferWaktu+10
                  setb  Alarm
                  clr   Buzzer

Usai pemeriksaan waktu alarm, program dilanjutkan dengan persiapan untuk memperagakan informasi yang diterima pada peraga LED 7 segmen.

            PeriksaSelesai:
                  mov   r0, #BufferWaktu+2
                  ajmp  Peraga

Untuk mematikan alarm, Sobat cukup menekan sembarang tombol yang ada.

      TombolMenu:
            jb    Alarm, ResetAlarm
            ajmp  MenuProg

      TombolCek:
            jb    Alarm, ResetAlarm
            ajmp  MenuCek

      ResetAlarm:
            clr   Alarm
            setb  Buzzer
            jnb   T_Set, $
            jnb   T_Cek, $
            ajmp  Mulai

      PeragaDetik:
            jnb   LED_Detik, Peraga
            setb  LED_Detik

Peragaan tampilan LED dimulai di sini. Waktu aktif setiap LED 7 segmen berkisar antara 5 ms dengan nilai register R2 adalah 128. Dan pengulangan waktu aktif menjadi sekitar 20 ms atau kurang lebih 50 Hz.

Peraga:
      djnz  r2, Mulai
      mov   r2, #128

      PeragaLED1:
            mov   a, @r0
            dec   r0
            jb    Digit4, PeragaLED2
            swap  a
            acall DataLED
            clr   Digit1
            ajmp  AkhirPeraga

      PeragaLED2:
            jb    Digit1, PeragaLED3
            acall DataLED
            clr   Digit2
            ajmp  AkhirPeraga

      PeragaLED3:
            mov   a, @r0
            jb    Digit2, PeragaLED4
            swap  a
            acall DataLED
            clr   Digit3
            ajmp  AkhirPeraga

      PeragaLED4:
            setb  Digit3
            acall DataLED
            clr   Digit4

      AkhirPeraga:
            jb    Menu, DelayPeraga
            jb    Dsp, DelayPeraga
            jnb   Buzzer, DelayPeraga
            ajmp  Mulai

            DelayPeraga:
                  jnb  Pulsa, KeluarPeraga
                  clr   Pulsa
                  djnz  r4, KeluarPeraga
                  mov   RegBendera, #0
                  clr   Buzzer
                  ajmp  AmbilWaktu

                  KeluarPeraga:
                        ajmp  Mulai

Tampilan LED 7 segmen adalah sesuai dengan data pada Kode7Segmen. Jika diterjemahkan maka akan menampilkan 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, t, A, d, C dan blank. Untuk mengambil kode tersebut mengunakan perintah MOVC

DataLED:
      mov   Digit7Seg, #255
      mov   Data7Seg, #255
      anl   a, #0fh
      mov   dptr, #Kode7Segmen
      movc  a, @a+dptr
      mov   Digit7Seg, a
      ret

      Kode7Segmen:
            db 11000000b, 11111001b, 10100100b, 10110000b, 10011001b
            db 10010010b, 10000010b, 11111000b, 10000000b, 10010000b
            db 10000111b, 10001000b, 10100001b, 11000110b, 255

Berikut adalah program rutin MenuProg yang berkaitan dengan penekanan tombol SET. Untuk kebutuhan pemrograman maka digunakan BufferProg untuk menyimpan informasi yang akan dilakukan pengaturan ulang dimulai dari pengaturan menit sampai pengaturan Chime.

Setiap penekanan tombol SET maka menu akan berpindah dari menu pertama hingga akhir sebanyak total 9 menu kemudian kembali ke posisi normal yaitu menunjukkan waktu jam dan menit.

MenuProg:
      clr   LED_Detik
      clr   Buzzer
      jnb   Dsp, ProsesMenu
      ajmp  AmbilWaktu

      ProsesMenu:
            mov   r0, #BufferProg
            mov   a, #10
            mov   b, #1
            acall DS1307_Read
            mov   r4, #5
            jb    Menu, MenuBerikut
            setb  Menu
            clr   Ubahan
            mov   r1,#0
            ajmp  MenuMenit

Setiap penekanan tombol SET maka menu akan berpindah dari menu pertama hingga terakhir sebanyak 9 menu kemudian kembali ke posisi normal menunjukkan waktu jam dan menit. Tapi sebelum kembali ke posisi normal jika terdapat perubahan maka perubahan tersebut akan disimpan.

      MenuBerikut:
            inc   r1
            cjne  r1, #9, MenuMenit
            jnb   T_Set, $
            setb  Buzzer
            jb    Ubahan, SimpanUbahan
            ajmp  AmbilWaktu

            SimpanUbahan:
                  mov   r0, #BufferProg
                  mov   a, #10
                  mov   b, #1
                  acall DS1307_Write
                  ajmp  AmbilWaktu

Setiap menu akan mengubah tampilan di mana digit 1 dan 2 yang semula menunjukkan waktu jam menjadi penunjuk kode menu. Untuk menu pengaturan menit akan menampilkan “t1”, Menu Jam dengan “t2”, tanggal dengan “t3”, bulan dengan “t4”, tahun dengan “t5”, penunjuk menit alarm dengan “A1”, jam alarm dengan “A2”, durasi alarm dengan “A3” dan terakhir untuk Chime dengan “C1”.

Untuk digit 3 dan 4 adalah informasi sesuai dengan menu-menu di atas. Semua data dalam format BCD (binary code decimal). Penunjuk jam menggunakan format 24 jam. Tahun dibatasi hingga maksimal sampai dengan 2025, jika ingin lebih tinggi bisa mengubahnya tapi maksimal adalah 2099. Durasi alarm juga dibatasi hingga 10 menit yang juga bisa dirubah sampai dengan maksimal 99 menit.

      MenuMenit:
            cjne  r1, #0, MenuJam
            mov   r0, #BufferProg
            jnb   T_Cek, SetMenit
            mov   BufferWaktu+2, #0a1h
            mov   BufferWaktu+1, BufferProg
            ajmp  AkhirMenu

            SetMenit:
                  acall UbahWaktu
                  cjne  a, #60h, X_Ubah

      MenuJam:
            cjne  r1, #1, MenuTanggal
            mov   r0, #BufferProg+1
            jnb   T_Cek, SetJam
            mov   BufferWaktu+2, #0a2h
            mov   BufferWaktu+1, BufferProg+1
            ajmp  AkhirMenu

            SetJam:
                  acall UbahWaktu
                  cjne  a, #24h, X_Ubah
                  ajmp  W_Reset

      MenuTanggal:
            cjne  r1, #2, MenuBulan
            mov   r0, #BufferProg+3
            jnb   T_Cek, SetTanggal
            mov   BufferWaktu+2, #0a3h
            mov   BufferWaktu+1, BufferProg+3
            ajmp  AkhirMenu

            SetTanggal:
                  acall UbahWaktu
                  cjne  a, #24h, X_Ubah
                  ajmp  W_Reset

      MenuBulan:
            cjne  r1, #3, MenuTahun
            mov   r0, #BufferProg+4
            jnb   T_Cek, SetBulan
            mov   BufferWaktu+2, #0a4h
            mov   BufferWaktu+1, BufferProg+4
            mov   r0, #BufferProg+4
            ajmp  AkhirMenu

            SetBulan:
                  acall UbahWaktu
                  cjne  a, #13h, X_Ubah
                  ajmp  T_Reset

                  W_Reset:
                        mov   a, #0
                        ajmp  X_Ubah

                  T_Reset:
                        mov   a, #1

                  X_Ubah:
                        mov   @r0, a
                        ajmp  AkhirMenu

      MenuTahun:
            cjne  r1, #4, MenuAlarmMenit
            mov   r0, #BufferProg+5
            jnb   T_Cek, SetTahun
            mov   BufferWaktu+2, #0a5h
            mov   BufferWaktu+1, BufferProg+5
            ajmp  AkhirMenu

            SetTahun:
                  acall UbahWaktu
                  cjne  a, #25h, X_Ubah
                  ajmp  T_Reset

      MenuAlarmMenit:
            cjne  r1, #5, MenuAlarmJam
            mov   r0, #BufferProg+6
            jnb   T_Cek, SetMenit
            mov   BufferWaktu+2, #0b1h
            mov   BufferWaktu+1, BufferProg+6
            ajmp  AkhirMenu

      MenuAlarmJam:
            cjne  r1, #6, AlarmDurasi
            mov   r0, #BufferProg+7
            jnb   T_Cek, SetJam
            mov   BufferWaktu+2, #0b2h
            mov   BufferWaktu+1, BufferProg+7
            ajmp  AkhirMenu

      AlarmDurasi:
            cjne  r1, #7, BellJam
            jnb   T_Cek, SetDurasi
            mov   BufferWaktu+2, #0b3h
            mov   BufferWaktu+1, BufferProg+8
            mov   r0, #BufferProg+8
            ajmp  AkhirMenu

            SetDurasi:
                  acall UbahWaktu
                  cjne  a, #11h, X_Ubah
                  ajmp  T_Reset

      BellJam:
            mov   r0, #BufferProg+9
            jnb   T_Cek, SetChime
            mov   BufferWaktu+2, #0c1h
            mov   BufferWaktu+1, BufferProg+9
            ajmp  AkhirMenu

            SetChime:
                  mov   a, @r0
                  inc   a
                  cjne  a, #2, X_Ubah
                  ajmp  W_Reset

      UbahWaktu:
            clr   ac
            clr   c
            mov   a, @r0
            swap  a
            anl   a, #0fh
            xch   a, b
            mov   a, @r0
            anl   a, #0fh
            da    a
            swap  a
            orl   a, b
            swap  a
            ret


      AkhirMenu:
            jnb   T_Set, $
            jnb   T_Cek, $
            setb  Buzzer
            mov   r0, #BufferWaktu+2
            ajmp  Peraga

Berikut adalah program yang berkaitan dengan penekan tombol CEK yang bisa digunakan untuk pengaturan tapi juga untuk peragaan lainnya selain jam dan menit yaitu tanggal/bulan, tahun dan waktu alarm.

MenuCek:
      clr   LED_Detik
      clr   Buzzer
      jnb   Menu, ProsesDsp
      ajmp  MenuMenit

      ProsesDsp:
            mov   r4, #5
            jb    Dsp, DspBerikut
            setb  Dsp
            mov   r1,#0
            ajmp  DspTanggal

      DspBerikut:
            inc   r1
            cjne  r1, #3, DspTanggal
            jnb   T_Cek, $
            setb  Buzzer
            ajmp  AmbilWaktu

      DspTanggal:
            cjne  r1, #0, DspTahun
            mov   BufferWaktu+1, BufferWaktu+4
            mov   BufferWaktu+2, BufferWaktu+5
            ajmp  AkhirMenu

      DspTahun:
            cjne  r1, #1, DspAlarm
            mov   BufferWaktu+1, BufferWaktu+6
            mov   BufferWaktu+2, #20h
            ajmp  AkhirMenu

      DspAlarm:
            mov   BufferWaktu+1, BufferWaktu+8
            mov   BufferWaktu+2, BufferWaktu+9
            ajmp  AkhirMenu

Untuk melengkapi program seutuhnya, diperlukan 2 buah modul untuk antar muka yang ada pada I2C.TXT dan DS1307.TXT yang sudah pernah aku sampaikan pada tulisanku sebelum ini.

$include (C:\tesasm\I2C.txt)
$Include (C:\tesasm\DS1307.txt)

End

Nah seperti itulah Sobat semua rancangan kita mengenai Jam dengan LED 7 segmen yang dilengkapi dengan alarm yang dapat disetel waktunya dan setiap jam juga ada bell chime. Masih banyak fasilitas yang dapat dikembangkan dalam pengimplementasiannya. Jadi bukan sekedar penampil waktu biasa.

DS1307 memiliki kapasitas sebesar 56 byte yang jika diinginkan dapat diisi dengan setidaknya 27 waktu alarm. Tapi penulis tidak ingin membayangkan jika hampir setiap jam alat kita membunyikan alarm belum lagi ditambah dengan bell chime. Tapi bel chime bisa di non-aktifkan dan keluaran untuk buzzer bisa digunakan untuk apa saja.

AT89C51 memiliki 32 bit gerbang I/O. Untuk rangkaian di atas masih menyisakan bahkan 1 byte gerbang yang benar-benar belum digunakan yaitu P3 ditambah 6 bit gerbang lainnya. Fasilitas serial pada P30 dan P31 juga perlu diberdayagunakan, belum lagi gerbang interupsi P32 dan P33, selain itu gerbang pewaktu P34 dan P35.

Aku pernah mencoba melengkapinya dengan remot audio/video yang ada di rumah, atau terhubung dengan PC melalui RS-232 baik menggunakan kabel maupun IR. Atau mengganti tombol dengan keypad. Bahkan yang masih terpasang tapi akhirnya tampilan LEDnya dihilangkan adalah pewaktu nyala lampu terprogram untuk semua lampu rumah.

Pokoknya sebagai penghobi elektronika adalah suatu yang menyenangkan mengotak-atik perangkat elektronik khususnya buatan sendiri.



Sudah ya, terima kasih sudah membaca artikel aku. Semoga bermanfaat dan bisa diterapkan oleh sobat semua.

Salam....