Jam digital ini menggunakan_dengan LED 7-segment common anode (jangan hinggatertukar dengan common catode). Ada 4 buah 7-segment, masing-masing menunjukkan satuan menit, puluhan menit, satuan jam serta puluhan jam. Keempat 7-segment tadi dinyalakan dengan metoda multiplex. Dinyalakan bergantian setiap 5ms (0.005 detik). Setiap waktu cuma ada 1 buah 7-segment yang menyala, segment lainya padam. Berturut-turut dinyalakan 7-segment untuk satuan menit, puluhan menit, satuan jam serta puluhan jam, demikian seterusnya. Mata kami tak bisa mengikuti penggantian yang demikian cepat jadi seakan-akan semua 7-segment menyala bersamaan. Metoda Multiplex dipakai karena, MCU ini memiliki jumlah port yang terbatas.
Transistor, Q1, Q2, Q2 serta Q4 bertugas untuk menyalakan (memadamkan) 7-Segment. Transistor menghantar saat/ketika basis transistor tersebut dibangun rendah melewati R8, R9, R10 serta R11. Transistor yang menghantar (menyumbat) membikin 7-segment menyala (padam).
Jam ini juga menyediakan battery cadangan jadi bila sewaktu-waktu ajaran listrik terputus, jam ini masih berjalan. Bila battery cadangan tak terpasang serta ajaran listrik terputus, maka jam ini wajib dicocokkan kembali, pasti faktor ini merepotkan. Untuk menghemat battery, 7-segment dibangun padam saat/ketika battery cadangan aktif. Battery cadangannya merupakan adalah "Coin" (type Lithium CR2023) 3 Volt, supaya lumayan kecil dipasang di PCB.
Rangkaian battery cadangan merupakan dioda D1, D2 serta D3 serta C1. Dioda D2 untuk mencegah arus catu masuk kedalam battery. Dioda D1 bermanfaat untuk mencegah ajaran listrik dari battery masuk ke dalam 7-segment. D3 bermanfaat untuk kompensasi kehilangan tegangan dampak D1 serta D2. C1 bermanfaat supaya tegangan tak jatuh dengan-cara tiba tiba (akan mengacaukan kerja MCU), saat/ketika battery cadangan aktif. Dengan adanya C1, tegangan bakal turun dengan-cara berangsur-angsur.
Perhatikan D1 serta D2 bukan dioda silikon biasa, melainkan dioda Schottky type 1N 5817. Sekalipun dioda ini sedikit lebih mahal, tapi jangan diganti dengan dioda silicon biasa sejenis 1N4001. Alasannya merupakan tegangan minimum supaya MCU P16F84a bisa bekerja merupakan 2Volt. Tegangan baterai 3V dikurangi dengan kehilangan tegangan pada dioda silicon 0.6 Volt berubah 2.4 Volt. Terbukti tegangan 2.4 Volt ini telah lumayan untuk MCU, namun ketahuilah tegangan battery terus lama terus turun saat/ketika digunakan.
Battery berubah tak bertujuan saat/ketika tegangan telah terlampau rendah. Kehilangan tegangan dioda Schottky cuma 0.4 Volt. Umur pakai battery bakal lebih lama andai kami menggunakan_dengan dioda Schottky.
Kalau dioda Schottky sulit diperolah di kota anda, boleh diganti dioda 1N4001 serta gunakan battery dengan tegangan lebih tinggi. Boleh gunakan 3 buah battery seng-karbon yang dipasang seri, tegangan total 3x1.5 Volt = 4.5 Volt. Cuma saja, battery ini wajib dipasang di luar PCB. Pada prinsipnya tegangan battery wajib lebih kecil dari tegangan catu 5 Volt, dengan demikian battery tak aktif saat/ketika tegangan catu bekerja.
Jam digital ini dibekali pula dengan saklar tekan s1 serta s2 masing-masing bermanfaat untuk mencocokkan menit serta untuk mencocokkan jam.
Cara kerja ditinjau dari program :
Dalam membahas program untuk jam digital ini, saya bakal mengangap kamu merupakan programmer C. Itu dikarenakan itu, saya cuma memberi sedikit catatan mengenai program C tersebut.Bagian yang terpenting dari program ini merupakan bagaimana membikin bilangan menit bertambah setiap satu menit terlampaui. Faktor ini terselenggara dengan mekanisme interupsi yang terjadi setiap kali pencacah (counter) timer over flow.
Timer ini tertanam di dalam MCU. Timer over flow setiap 0x10000 = 65536 siklus mesin. Saat/ketika terjadi interupsi (timer over flow) manfaat interrupt dipanggil (baris 068). Variabel num menyimpan banyaknya siklus dalam satu menit. Besarnya num rutindikurangi dengan banyaknya siklus overflow (baris 069). Satu menit terlampaui bila variabel num telah habis (menjadi negatif). Saat/ketika itu terjadi bilangan menit ditambahkan (baris 071 - 073)
Haruslah dihitung banyaknya siklus mesin untuk 1 menit. Hitung dulu perioda siklus mesin. Periode siklus mesin merupakan 4 kali periode clock. Itu dikarenakan dalam faktor ini saya menggunakan_dengan xtal 4Mhz maka :
siklus mesin = 4 x perioda clock
siklus mesin = 4 x 1/4Mhz
siklus mesin = 1µS.
Jadi 1menit = 60 S = 60 juta µS = 60 juta siklus mesin. Itu dikarenakan itu saya mendefinisikan konstanta menit sebagai 60 juta (baris 011). Andai kamu menggunakan_dengan frekuensi kristal yang berlainan umpama 8Mhz maka menurut perhitungan di atas 1 siklus mesin merupakan 0.5µS. Jadi 1 menit merupakan 120 juta siklus (dengan x'tal 8Mhz). Itu dikarenakan itu bila kamu menggunakan_dengan xtal 8Mhz kamu wajib merubah menit berubah 120 juta (baris 011), itu dikarenakan bila tak maka jam kamu bakal ngawur.
Bagian program lain yang butuh dicatat merupakan bagaimana menterjemahkan pola-pola 7-segment berubah angka-angka. Faktor ini dimungkinkan dengan menyimpan pola tersebut pada Array yang bernama LED (baris 019).
Sebelum MCU digunakan, terlebih dahulu register tertentu haruslah diset supaya berlangsung sebagaimana kami kehendaki. Register ini kami sebut Special Function Register (FSR). Saya tak butuh membahas panjang lebar, silahkan lihat lembar data 16f84a. Baris 080 - 081 untuk memilih port mana yang dipakai untuk output (7-segment serta basis transistor) serta port mana yang dipakai sebagai input (tombol tekan). Baris 086-087 untuk mengaktifkan timer serta memampukan interrupt timer.
Baris 094 untuk mengecek apakah tombol menit ditekan (polling). Bila ditekan, bilangan menit bakal ditambahkan. Sedang baris 096 untuk mengecek tombol jam. Bila ditekan bilangan jam bakal ditambahkan. Sebelum polling, program bakal memanggil manfaat display sebanyak 25 kali dalam loop for (baris 091). Manfaat display untuk mengatur multiplex. Itu dikarenakan suatu 7-segment dinyalakan dalamwaktu 5 ms serta ada 4 buah 7-segment, maka waktu yang dibutuhkan untuk memanggil display sebanyak 25 kali merupakan = 25x4x5ms = 500ms = setengah detik. Jadi bila kamu menekan tombol, bilangan (menit bisa juga jam) bakal ditambahkan setiap setengah detik sekali.
Selanjutnya silahkan periksa tahap lain dari Program dengan bahasa C ini. Kamu sebagai programer C pasti bisa memahaminya dengan baik.
Selanjutnya silahkan periksa tahap lain dari Program dengan bahasa C ini. Kamu sebagai programer C pasti bisa memahaminya dengan baik.
001 /* Program jam digital untuk MCU p16f84a 002 Digital clock program for p16f84a MCU 003 oleh : Hartono , www.gemar-elektronika.com 004 April 2012 005 Compiler Micro C for PIC 006 by Mikroelektronika, www.mikroe.com 007 please don't delete this comment 008 jangan hapus komemtar ini */ 009 010 long int num; 011 const long int menit = 60000000; //banyaknya siklus dalam 1 menit (xtal 4Mhz) 012 const long int timer_ovr = 0x00010000; //banyaknya siklus timer 013 char cacah; 014 char h0 = 0; //satuan jam 015 char h1 = 0; //puluhan jam 016 char m0 = 0; //satuan menit 017 char m1 = 0; //puluhan menit 018 char over_flow; 019 const char led[10] = {0x08, 0x3e, 0x11, 0x14, 0x26, 0x44, 0x40, 0x1e, 0x00, 0x04}; 020 021 //rutin untuk menunda waktu sebesar 5ms 022 void tunda(void){ 023 Delay_ms(5); 024 } 025 026 //rutin untuk menambah menit 027 void inc_minute(void){ 028 m0++ ; over_flow = 0; 029 if (m0 == 10){ 030 m0 = 0; 031 m1++ ; 032 if (m1 == 6) 033 {m1 = 0; over_flow = 1;} 034 } 035 } 036 037 //rutin untuk menambah jam 038 void inc_hour(void){ 039 h0++ ; 040 if (h0==10){h0 = 0; h1++ ;} 041 if (h0==4 && h1 == 2){h0 = 0; h1 = 0;} 042 } 043 044 //rutin untuk multiplex 7 segment 045 void display(void){ 046 PORTA = 0b11111111; 047 PORTB = led[m0]; 048 PORTA = 0b11111110; 049 tunda(); 050 051 PORTA = 0b11111111; 052 PORTB = led[m1]; 053 PORTA = 0b11111101; 054 tunda(); 055 056 PORTA = 0b11111111; 057 PORTB = led[h0]; 058 PORTA = 0b11111011; 059 tunda(); 060 061 PORTA = 0b11111111; 062 PORTB = led[h1]; 063 PORTA = 0b11110111; 064 tunda(); 065 } 066 067 // rutin layanan interrupt 068 void interrupt(void){ 069 INTCON.T0IF = 0; 069 num -= timer_ovr; 070 if (num < 0){ 071 num += menit; 072 inc_minute(); 073 if (over_flow) inc_hour(); 074 } 075 } 076 077 /* -----------ini adalah program utama---------------------- */ 078 void main(void) { 079 //mengatur arah data pada port 080 TRISB = 0b10000000; 081 TRISA = 0b10000; 082 //mengatur timer0 083 OPTION_REG = 0b11010111; 084 085 //memampukan interrupt timer 086 INTCON.GIE = 1; 087 INTCON.T0IE = 1; 088 089 num = menit; 090 while (1){ 091 for (cacah = 0; cacah < 25; cacah++){ 092 display(); 093 } 094 if (PORTB.RB7 == 0) //periksa apakah tombol menit ditekan 095 {inc_minute(); num = menit;} 096 if (PORTA.RA4 == 0) //periksa apalah tombol jam ditekan 097 {inc_hour(); num = menit;} 098 } 099 }
Untuk Penjelasan selanjutnya kunjungi http://gemar-elektronika.com/hastakarya/jam-digital.html?start=2