Berikut ini adalah contoh sederhana bagaimana cara memprogram mikrokontroller AT89C51/52/55 untuk menghidupkan Led melalui port parallel. Simulasi dilakukan dengan menggunakan software Proteus 7.1 SP2
Rangkaian minimum untuk menghidupkan 8 LED melalui port 1 ditunjukkan pada gambar di bawah ini.
Konfigurasi yang digunakan pada rangkaian LED di atas adalah konfigurasi Common Anode (CA). Dimana untuk menghidupkan LED pada port 1 maka pada port tersebut harus diberikan nilai "0". Jika "0" kita berikan ke port 0 maka keluaran dari latch akan menghidupkan FET sehingga baik kaki port 0 maupun resistor pullup internal akan di pull-low(secara internal juga), sehingga LED yang terhubung secara Common Anode bisa menyala. Sedangkan jika menggunakan rangkaian Common Kathode maka untuk menyalakan LED butuh penulisan "1". Namun penulisan "1" ini menyebabkan port 0 menjadi masukan berimpedansi tinggi(karena adanya resistor pullup internal) dan hanya cocok untuk masukan, bukan keluaran(arus dari pullup internal tidak kuat untuk menyalakan LED karena ordenya mikroampere sedangkan keluaran bisa mencapai sekitar 3,8 mA). Hal ini berlaku juga untuk port 2 dan port 3. Penggunaan resistor 330 ohm sebagai pembatas arus, sehingga dengan tegangan Vcc 5 Volt maka arusnya sekitar 15 mA dan ini cukup untuk menghidupkan LED (yang biasanya hanya membutuhkan 10 mA).
Program pertama: Menghidupkan LED berkelompok empat LED mati-hidup secara bergantian (flip-flop).
Baris 9-13 merupakan program utama, sedangkan baris 1-5 dan 15-20 merupakan baris komentar sekaligus berisi keterangan program, baris 7 digunakan agar instruksi ditulisakan mulai alamat 0h. Baris 9 digunakan untuk mengirimkan data biner ke port 1 agar lampu LED4-LED7 (P1.4-P1.7) menyala, kemudian diikuti dengan delay lalu bergantian LED0-LED3 (P1.0-P1.3) dinyalakan. Kemudian delay lagi. Proses ini diulang dari awal dengan instruksi SJMP MULAI pada baris 13. Baris 22-29 merupakan subrutin DELAY. Adapun perhitungan waktu delay-nya adalah sebagai berikut:
1: DELAY: MOV R0,#5H ; 1 x (1 cycle)
2: DELAY1: MOV R1,#0FFH ; 5 x (1 cycle)
3: DELAY2: MOV R2,#0 ; 255 x 5 = 1.275 (1 cycle)
4: DJNZ R2,$ ; 256 x 255 x 5 = 326.400 (2 cycle)
5: DJNZ R1,DELAY2 ; 255 x 5 = 1.275 (2 cycle)
6: DJNZ R0, DELAY1 ; 5 x (2 cycle)
7: RET
Baris ke-4 dikerjakan sebanyak 326.400 kali karena instruksi tersebut dikerjakan selama dua siklus maka waktu totalnya adalah 326.400 x 2 = 652.800 siklus, masih ditambahkan dengan pengulangan kedua (baris 2 dan 5) sebesar 1.275 x 3 siklus = 3.825 siklus dan pengulangan ketiga, DELAY1, sebesar 5 x 3 siklus = 15 siklus. Sehingga total siklus = 652.800 + 3.825 + 15 = 656.640 siklus.
Jika kristal yang kita gunakan memiliki frekuensi 12 MHz maka waktu yang dibutuhkan untuk menyelesaikan subrutin delay ini adalah 656.640 siklus 1 mikrodetik = 0,656 detik. Untuk pewaktuan yang lebih akurat bisa digunakan timer (dibahas nanti saja).
Adapun hasil simulasinya menggunakan software Proteus adalah sebagai berikut :
Pada program LED di atas diketik dengan menggunakan Notepad++ dan disimpan dengan ekstensi .a51, bisa juga disimpan dengan ekstensi yang lain seperti .asm dan lain-lain. Pada kesempatan ini disimpan sebagai .a51 karena program ini akan di-compile menjadi hex dengan bantuan compiler ASEM-51. Kemudian program yang semula berekstensi .a51 akan menjadi .hex sehingga bisa dimasukkan pada simulasi dengan Proteus seperti di atas. Jika simulasi dengan Proteus berhasil maka jika kita mencetak PCB kemudian memproduksi rangkaiannya bisa dipastikan 90% berhasil. Dengan demikian kita bisa mengurangi kerugian akibat kegagalan rangkaian.
Berikut ini adalah simulasi pada saat meng-compile program.a51 menjadi program.hex yang kemudian akan dimasukkan ke dalam mikrokontroller 89C51 pada simulasi proteus maupun pada keadaan sebenarnya.
sumber : http://www.blog.depohar50.info/2009/11/menghidupkan-led-melalui-port-parallel.html