Mungkin
bagi sebagian pembaca Jam Digital merupakan hal yang sangat sederhana
atau sudah terlalu umum, tapi dari Jam Digital bisa dipelajari
prinsip-prinsip dasar kontrol dengan microcontroller, antara lain sistem tampilan 7 ruas dan pemakaian timer.
Gambar 1
Jam Digital dengan AT89C2051
Jam Digital dengan AT89C2051
Rangkaian
lengkap Jam Digital ini terlihat pada Gambar 1, dilengkapi 4 buah
tampilan 7 ruas LED untuk menampilkan waktu, terdiri atas angka-angka
puluhan jam, satuan jam, puluhan menit dan satuan menit. Tombol SW1 dan SW2 dipakai untuk mengatur tampilan waktu, saat SW1 ditekan angka pada tampilan jam akan bertambah setiap detik, sedangkan SW2 dipakai untuk mengatur angka tampilan menit dengan cara yang sama.
Kristal 12 MHz dan kapasitor C1 dan C2 membentuk rangkaian oscilator pembangkit frekuensi kerja AT89C2051, rangkaian ini merupakan rangkaian baku,
artinya bentuk rangkaian oscilator ini selalu seperti ini untuk semua
rangkaian AT89C51, kecuali untuk keperluan yang lain nilai kristalnya
saja yang mungkin berbeda.
Kombinasi kapasitor C3 dan tahanan R8 juga merupakan rangkaian baku, komponen ini dipakai untuk membentuk rangkaian ‘power on reset’, artinya rangkaian yang akan otomatis me-reset AT89C2051 setiap kali AT89C2051 mulai menerima sumber daya listrik.
Melihat
rangkaian pada Gambar 1, memang tidak bisa dijelaskan bagaimana Jam
Digital ini bekerja, karena rangkaian itu hanyalah bagian tampilan dan
tombol pengatur waktu waktu saja, ‘Jam’ yang sesungguhnya berupa
program yang disimpan di dalam ROM yang ada di dalam IC AT89C2051.
Sistem tampilan 7 ruas
Untuk menampilkan waktu dipakai 4 buah tampilan 7 ruas LED yang dibentuk dengan IC2 dan IC3 (masing-masing IC berisikan 2 tampilan angka), dengan demikian untuk menampilkan 4 buah angka diperlukan 28 LED, kalau ke-28 LED ini dinyala-padamkan dengan cara biasa, maka diperlukan 28 saklar dan rangkaian menjadi rumit sekali. Cara yang umum dipakai adalah sistem tampilan 7 ruas yang di-multiplek seperti nampak dalam Gambar 1, sedangkan Gambar 2 memperlihatkan detil sistem tampilan ini.
Gambar 2
Sistem Tampilan 7 Ruas
Sistem Tampilan 7 Ruas
Setiap
tampilan angka dibentuk dengan 7 buah LED (Light Emitting Diode),
masing-masing diode itu ditandai sebagai ruas ‘a’ sampai dengan ‘g’,
anode dari ketujuh LED itu sudah dihubungkan jadi satu di dalam IC.
Katode ruas ‘a’ dari angka puluhan jam dihubungkan dengan katode ruas
‘a’ dari angka satuan jam dan seterusnya. Demikian pula dengan ruas ‘b’;
ruas ‘c’ dan lain sebagainya.
Saklar
Ruas P10..P16 dipakai untuk menentukan ruas mana yang akan dinyalakan,
misalkan untuk membentuk angka 1 maka saklar P11 (ruas b) dan saklar
P12 (ruas c) dalam posisi ‘on’. Sedangkan Skalar Digit dipakai untuk
menentukan tampilan angka mana yang dipakai, misalkan angka 1 tadi ingin
ditampilkan pada tampilan puluhan jam, maka posisi skalar pada Q1.
Jika posisi ‘on’ pada Saklar Digit digilir dari Q1, Q2, Q3 dan Q4 kemudian kembali ke Q1 dan seterusnya secara cepat, maka angka 1 di atas akan nampak pada semua tampilan angka!
Selanjutnya,
andaikan sebelum merubah posisi Saklar Digit kombinasi Skalar Ruas
diatur terlebih dulu, maka angka yang tertampil dalam sistem tampilan 7
ruas ini bisa diatur dengan tepat.
Dalam Gambar 1 terlihat Saklar Ruas dibentuk dengan kaki P1.0 sampai kaki P1.6
AT89C2051, sedangkan Saklar Digit dibentuk dengan sebuah transistor
PNP dan sebuah tahanan yang masing-masing dikendalikan lewat kaki P3.0 sampai kaki P3.3.
Proses
pengaturan sistem tampilan seperti yang dibahas diatas, diatur oleh
AT89C2051 lewat potongan program yang biasanya dinamakan sebagai ScanDisplay seperti berikut :
1 ScanDisplay:
2 MOV P1,RuasJam10
3 MOV P3,#%11110111
4 ACALL TungguSebentar
5 ;
6 MOV P1,RuasJam1
7 MOV P3,#%11111011
8 ACALL TungguSebentar
9 ;
10 MOV P1,RuasMenit10
11 MOV P3,#%11111101
12 ACALL TungguSebentar
13 ;
14 MOV P1,RuasMenit1
15 MOV P3,#%11111110
16 ACALL TungguSebentar
17 SJMP ScanDisplay
Potongan program di atas bisa dijelaskan sebagai berikut : RuasJam10, RuasJam1, RuasMenit10 dan RuasMenit1
merupakan variabel tempat menampung kombinasi ruas dari angka yang
akan ditampilkan, isi dari variabel ini akan dirubah dibagian lain dari
program sesuai dengan perubahan waktu. Isi variabel–variabel ini
diumpankan langsung ke Port 1 (baris 2, 6, 10 dan 14 pada potongan
program di atas), untuk mengendalikan Saklar Ruas.
Saklar
Digit dibentuk dengan transistor PNP, jadi untuk meng-on-kan
diperlukan tegangan ‘0’ pada salah satu kaki Port 3, seperti terlihat
pada baris 3, 7, 22 dan 15. Perhatikan posisi angka ‘0’ pada keempat
baris itu, akan nampak ‘0’ tersebut ber-‘jalan’ dari kiri ke kanan yang
setara dengan Saklar Digit bergilir ‘on’ dari Q1 sampai Q4.
TungguSebentar
merupakan sub-rutin yang berfungsi untuk menunda waktu (delay), agar
angka yang ditampilkan bisa tertahan sesaat sebelum berganti. Pada baris
17, aliran program di alihkan kembali ke baris 1, sehingga potongan
program ini akan bekerja terus menerus tanpa henti menampilkan angka.
Jam Digital
Jam
Digital dalam proyek ini, sesungguhnya hanya berupa program. Pada
dasarnya Jam Digital adalah sistem pencacah (counter) bertingkat,
dimulai dari pencacah menit yang mencacah dari 0 sampai 59 dan melimpah
kembali ke 0, dan pencacah jam dari 0 sampai 23 yang mencacah setiap
kali ada limpahan dari pencacah menit, hal ini bisa direalisasikan
dengan program berikut:
1 JamDigital:
2 INC Menit
3 MOV A,Menit
4 CJNE A,#60,Keluar
5 MOV Menit,#0
6 INC JAM
7 MOV A,Jam
8 CJNE A,#24,Keluar
9 MOV Jam,#0
10 Keluar:
11 RET
Menit
dan Jam pada potongan program ini, adalah variabel yang berfungsi
sebagai pencacah menit dan pencacah jam. Sub-rutin JamDigital ini akan
dijalankan setiap menit sekali, sehingga perubahan nilai pada variable
Menit dan variable Jam persis mencerminkan perubahan waktu.
Interupsi Timer
Setelah membentuk sub-rutin JamDigital
di atas, persoalan berikutnya adalah bagaimana agar sub-rutin itu
benar-benar bisa dijalankan satu kali setiap menit, untuk keperluan ini
dipakai fasilitas timer yang dimiliki AT89C2051.
Jam Digital yang dibuat selalu menjalankan program ScanDisplay terus menerus tanpa henti, dengan mengggunakan fasilitas interupsi dari timer, program ScanDisplay
di atas dihentikan sebentar setiap 50 mili detik, pada saat itu
AT89AT2051 menggerakan untaian pencacah 20 dan pencacah 60, pencacah 20
akan melimpah sekali per detik, dan pencacah 60 akan melimpah sekali
per menit. Pada saat terjadi limpahan pencacah 60, AT89C2051 akan
menjalankan sub-rutin JamDigital di atas.
1 TimerInterrupt:
2 MOV TL0,#-50000
3 MOV TH0,#>-50000/256
4 DJNZ Pencacah20,Terus
5 MOV Pencacah20,#20
6 DJNZ Pencacah60,Terus
7 MOV Pencacah60,#60
8 ACALL JamDigital
9 Terus:
10 RETI
Baris 2 dan 3 di atas yang mempertahankan agar AT89C2051 menjalankan rutin TimerInterrupt setiap
20 mili detik, baris 4 sampai 7 merupakan untaian pencacah 20 dan
pencacah 60, saat pencacah 60 melimpah pada baris 8 AT89C2051
menjalankan sub-rutin JamDigital.
Agar
mekanisme interupsi timer ini bisa bekerja seperti apa yang
diharapkan, pada awal program ditambahkan potongan program berikut :
1 ANL TMOD,#%11110000
2 ORL TMOD,#000001
3 MOV TL0,#-50000
4 MOV TLH,#-50000/256
5 SETB ET0
6 SETB EA
7 SETB TR0