Skema jam digital P16F84A -->

Translate

Skema jam digital P16F84A

skema jam digital led skema jam digital tanpa program segment digital clock circuit  rangkaian skema elektronika


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 }

SEMUA ISI  ADALAH  HASIL KUMPULAN PENCARIAN DAN BEBERAPA SUMBER MEDIA BUKU MAJALAH DLL, KAMI TIDAK BERTANGGUNG JAWAB ATAS KEGAGALAN YANG DISEBABKAN OLEH GAMBAR YANG DIMUAT DI BLOG INI.