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:
- Rangkaian akan menampilkan peragaan waktu dalam format jam dan menit. Untuk itu setidaknya memerlukan 4 digit LED 7 segmen.
- 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.
- 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....