Assembly ile ADuC841 – [6] TÜM DEVRE UÇ FONKSİYONLARI
Giriş: Neden 8051?
Eğer gömülü sistem dünyasına adım atmak istiyorsanız, 8051 mikrodenetleyicisi tam size göre bir başlangıç noktasıdır. 1980 yılında Intel tarafından geliştirilen bu entegre, onlarca yıldır hem öğretim ortamlarında hem de endüstriyel uygulamalarda vazgeçilmez bir yer edinmiştir.
8051’in bu kadar popüler olmasının en büyük nedeni sadeliği ile güçlülüğünü bir arada sunmasıdır. 40-pinlik yapısı, net ve anlaşılır pin fonksiyonları ile donanım tasarımını adım adım öğrenmek için ideal bir zemin oluşturur. Üstelik piyasada onlarca muadili ve türevi mevcuttur — ADuC841 bunların belki de en bilinenidir.
Bu makalede 8051’i sıfırdan ele alacak; tümdevre yapısından port mimarisine, reset devresinden Assembly komutlarına kadar her konuyu örnekler üzerinden anlatacağız. Bir konuyu iyice özümsemeden bir sonrakine geçmeyeceğiz.
Bölüm 1 — 8051 Tümdevre Yapısı ve Pin Fonksiyonları
1.1 40-Pin DIP Gövdesi
Standart 8051, 40 uçlu DIP (Dual In-line Package) yapısına sahiptir. Yani entegre, iki sıra halinde dizilmiş toplam 40 pinden oluşur. Bu pinlerin dağılımı şu şekildedir:
- 32 pin — Giriş/Çıkış portları (P0, P1, P2, P3)
- 2 pin — Besleme: Vcc (+5 V, pin 40) ve Vss (GND, pin 20)
- 2 pin — Osilatör bağlantıları: XTAL1 (pin 19) ve XTAL2 (pin 18)
- 1 pin — Reset: RST (pin 9)
- 3 pin — Harici hafıza erişimi: ALE/PROG, PSEN, EA/Vpp
Portlar salt I/O işlevi görmekle kalmaz; P0, P2 ve P3’ün pinleri ek (ikincil) fonksiyonlara da sahiptir. Bu, sınırlı pin sayısından maksimum işlevsellik elde etmenin akıllıca bir yoludur.
1.2 Besleme Uçları
8051’in beslenmesi son derece basittir:
- [object Object] +5 volt pozitif besleme. Bu pine mutlaka kararlı, gürültüsüz bir +5 V gerilim uygulanmalıdır. Gerilim dalgalanmaları mikrodenetleyicinin hatalı çalışmasına yol açar.
- [object Object] Negatif besleme, yani toprak (GND). Tüm devre referansı bu noktaya bağlanır.
✔ İpucu: Besleme hattına mümkün olduğunca Vcc pininin yakınına 100 nF’lık bir seramik kondansatör bağlayın. Bu, yüksek frekanslı gürültüyü süzerek kararlı çalışmayı destekler.
Bölüm 2 — RST (Power-on Reset) Devresi
2.1 Reset Nedir ve Neden Gereklidir?
Bir mikrodenetleyiciyi ilk kez çalıştırdığınızda ya da yeniden başlatmak istediğinizde, tüm iç yazmaçların bilinen bir başlangıç değerine getirilmesi gerekir. Bu işleme reset denir.
8051’de reset, RST pini (pin 9) üzerinden gerçekleştirilir. Geçerli bir reset işlemi için RST pinine en az 2 makine çevrimi boyunca Lojik 1 (yüksek seviye) uygulanmalı; bu süre dolduktan sonra pin Lojik 0’a çekilmelidir.
2.2 RC Reset Devresi
En yaygın ve ekonomik reset yöntemi, bir direnç (R) ve kondansatörden (C) oluşan basit RC devresidir. Besleme gerilimi (+5 V) uygulandığı anda kondansatör boş olduğundan RST pinini otomatik olarak Lojik 1’e çeker. Kondansatör zamanla şarj olur ve pin Lojik 0’a düşer; işte bu noktada mikrodenetleyici çalışmaya başlar.
Tipik RC değerleri: C = 10 µF ve R = 8,2 kΩ. 100 Ω’luk seri direnç ise transistör ve koruma amaçlıdır. Zaman sabitinin en az 2 makine çevrimi sağlayacak biçimde seçilmesi gerekir.
Formül: RC zaman sabiti (τ = R × C) ≥ 2 makine çevrimi süresi olmalıdır. 12 MHz kristal için 1 makine çevrimi ≈ 1 µs; dolayısıyla τ ≥ 2 µs şarttır. Yukarıdaki değerler bu koşulu rahatlıkla sağlar.
2.3 Reset Sonrasında Ne Olur?
Geçerli bir reset işlemi tamamlandığında 8051’in iç yazmaçları aşağıdaki başlangıç değerlerine getirilir:
| Yazmaç | Reset Değeri | Açıklama |
|---|---|---|
| PC (Program Counter) | 0000h | Program 0. adresten çalışmaya başlar |
| SP (Stack Pointer) | 07h | Yığın 07h adresinden başlar |
| P0 | FFh (11111111) | Tüm bitler 1 → giriş modunda |
| P1 | FFh (11111111) | Tüm bitler 1 → giriş modunda |
| P2 | FFh (11111111) | Tüm bitler 1 → giriş modunda |
| P3 | FFh (11111111) | Tüm bitler 1 → giriş modunda |
⚠ Dikkat: Reset sonrası tüm port pinleri Lojik 1 seviyesine çekilir ve GİRİŞ olarak atanır. Bu nedenle, çıkış olarak kullanmak istediğiniz pinleri Assembly kodunuzun başında açıkça yönlendirmeniz gerekir.
Bölüm 3 — Osilatör ve Saat Üreteci (XTAL1 & XTAL2)
3.1 Saat Darbeleri Neden Gereklidir?
Bir mikrodenetleyici, her işlemi belirli bir zaman referansına göre sırayla gerçekleştirir. Bu referansı sağlayan şey periyodik saat darbeleridir. 8051’de saat üreteci, XTAL1 (pin 19) ve XTAL2 (pin 18) pinlerine bağlanan harici bir kristal ve iki kondansatörden oluşur.
3.2 Standart Bağlantı Şeması
Tipik bir 12 MHz osilatör bağlantısı şu bileşenlerden oluşur:
- [object Object] — Üretici firmanın izin verdiği maksimum frekansı aşmayın.
- [object Object] — Her iki kristal ucuna birer kondansatör bağlanır, diğer uçları toprağa (GND) gider.
Makine çevrimi (machine cycle), 8051’in çoğu komutu kaç adımda tamamladığını belirleyen temel zaman birimidir. 12 MHz kristal ile:
- 1 makine çevrimi = 12 saat darbesi = 1 µs
- Yani saniyede 1.000.000 makine çevrimi tamamlanabilir.
Bölüm 4 — Giriş/Çıkış Portları (P0, P1, P2, P3)
8051’in 40 pininin 32’si dört porta ayrılmıştır: P0, P1, P2 ve P3. Her port 8 bittir; yani toplam 32 bağımsız giriş/çıkış pinine sahipsiniz. Portlar hem 8 bit bütünüyle (byte) hem de bit tek tek okunup yazılabilir.
Önemli Not: Reset sonrası tüm portların tüm bitleri 1 olur ve portlar GİRİŞ moduna alınır.
4.1 Port 1 (P1) — En Sade Port
P1, 8051’in en “saf” I/O portudur. Giriş/çıkış işlevi dışında başka bir görevi yoktur — yani harici hafıza erişimi veya seri haberleşme gibi ikincil fonksiyonları bulunmaz.
P1’in her biti dahili olarak pull-up direnci içerir. Bu, pini Lojik 1’e çekici bir direnç anlamına gelir; dolayısıyla P1’i giriş olarak kullanırken harici pull-up eklemenize gerek yoktur.
Her P1 Pininin İç Yapısı
Her bir P1 biti üç ana elemandan oluşur:
- [object Object] Yazılan değeri saklar. Komut çalıştığında veri bu latche yazılır.
- [object Object] Latchteki değere göre pinin fiziksel seviyesini belirler.
- [object Object] Dış dünyadan gelen sinyali dahili veri yoluna aktarır.
P1 ile Basit LED Yakma — Assembly Örneği
Aşağıdaki örnek, P1.0 pinine bağlı bir LED’i yakıp söndürür. LED’in anot tarafı P1.0’a, katot tarafı ise seri bir direnç üzerinden toprağa bağlıdır.
| ; 8051 Assembly Kodu |
| ; ───────────────────────────────────────────── |
| ; P1.0 pinine bağlı LED yakma/söndürme örneği |
| ; ───────────────────────────────────────────── |
| ORG 0000h ; Program 0. adresten başlar (reset vektörü) |
| BASLA: |
| SETB P1.0 ; P1.0 = 1 → LED SÖNER (aktif-düşük devre) |
| ACALL GECIKME ; Kısa gecikme |
| CLR P1.0 ; P1.0 = 0 → LED YANAR |
| ACALL GECIKME ; Kısa gecikme |
| SJMP BASLA ; Döngüyü başa al → sonsuz yanıp-sönme |
| ; ── Gecikme alt programı (~250 ms @ 12 MHz) ── |
| GECIKME: |
| MOV R0, #250 ; Dış sayaç 250 |
| D1: MOV R1, #250 ; İç sayaç 250 |
| D2: DJNZ R1, D2 ; R1–, sıfır değilse D2’ye dön |
| DJNZ R0, D1 ; R0–, sıfır değilse D1’e dön |
| RET ; Alt programdan dön |
| END |
Burada SETB P1.0 komutu P1.0’ı Lojik 1 yapar, CLR P1.0 ise Lojik 0’a çeker. DJNZ komutu (Decrement and Jump if Not Zero) bir sayacı azaltarak gecikme döngüsü oluşturur.
4.2 Port 0 (P0) — Çift Fonksiyonlu, Open-Drain
P0, diğer portlardan önemli bir farkla ayrılır: dahili pull-up direnci yoktur. Bu nedenle P0’ın mimarisi açık-kolektörlü (open-drain) olarak tasarlanmıştır.
Pratikte bu şu anlama gelir: P0’ı çıkış olarak kullanmak istiyorsanız, her pine harici olarak Vcc’ye bağlı bir pull-up direnci eklemeniz zorunludur. Aksi takdirde pin yalnızca giriş olarak çalışabilir.
P0’ın İkincil Fonksiyonu: Adres/Veri Yolu
8051 harici bir belleğe (ROM veya RAM) erişmek istediğinde, P0 pinleri AD0–AD7 olarak işlev görür. Bu durumda P0:
- Önce düşük adres baytını (A0–A7) dışarı verir.
- Ardından veri (D0–D7) alışverişi için kullanılır.
Bu çok işlevlilik (multiplexing) sayesinde az pin ile hem adres hem veri taşınabilir.
⚠ Dikkat: P0 pinlerini I/O olarak kullanırken harici pull-up direnci eklemeyi unutmayın. Aksi takdirde çıkış doğru çalışmaz.
P0 ile Port Yazma Örneği
| ; 8051 Assembly Kodu |
| ; P0 üzerinden 8 LED sürmek (harici pull-up gerekli) |
| ; P0 = 55h = 0101 0101 → alternatif LEDler yanar |
| ORG 0000h |
| MOV P0, #55h ; P0 = 0101 0101 → LED deseni yaz |
| SJMP $ ; Burada bekle (sonsuz döngü) |
| END |
4.3 Port 2 (P2) — Yüksek Adres Baytı
P2, harici hafıza erişiminde yüksek adres baytını (A8–A15) oluşturur. P0 ile birlikte kullanıldığında, 8051 toplam 16 bitlik bir adres üretebilir; bu da 64 kByte harici hafıza alanı anlamına gelir.
Harici hafıza kullanılmadığında P2, sıradan bir 8-bit I/O portu gibi kullanılabilir. P1 gibi dahili pull-up dirençlerine sahiptir.
4.4 Port 3 (P3) — İkincil Fonksiyonlar Portu
P3, 8051’in en “yetenekli” portudur. Her biti, standart I/O işlevi yanı sıra özgün bir ikincil fonksiyon taşır. Bu sayede mikrodenetleyici; seri haberleşme, harici kesmeler, zamanlayıcı darbe girişleri ve harici hafıza kontrol sinyallerini yalnızca P3 pinleri üzerinden yönetebilir.
| Pin | İsim | İkincil Fonksiyon |
|---|---|---|
| P3.0 | RxD | Seri haberleşme — veri giriş pini |
| P3.1 | TxD | Seri haberleşme — veri çıkış pini |
| P3.2 | INT0 | Harici kesme 0 / T/C-0 start-stop |
| P3.3 | INT1 | Harici kesme 1 / T/C-1 start-stop |
| P3.4 | T0 | T/C-0 için harici darbe girişi |
| P3.5 | T1 | T/C-1 için harici darbe girişi |
| P3.6 | WR | Harici hafızaya yazma işareti |
| P3.7 | RD | Harici hafızadan okuma işareti |
P3.0 / P3.1 ile Seri Haberleşme — Kavramsal Örnek
| ; 8051 Assembly Kodu |
| ; Seri port başlatma (9600 baud, 12 MHz kristal) |
| ORG 0000h |
| MOV SCON, #52h ; Mod 1 (8-bit UART), REN=1 (alım aktif) |
| MOV TMOD, #20h ; T1 → Mod 2 (otomatik yükleme) |
| MOV TH1, #0FDh ; 9600 baud için yükleme değeri |
| SETB TR1 ; T1’i başlat |
| ; Tek karakter gönder: ASCII “A” = 41h |
| GONDER: |
| MOV SBUF, #41h ; Gönderi tamponuna “A” yaz |
| BEKLE: |
| JNB TI, BEKLE ; Gönderim bitmedi mi? Bekle |
| CLR TI ; Gönderim bayrağını sıfırla |
| SJMP $ |
| END |
Bölüm 5 — Harici Hafıza Erişim Pinleri
8051’in dahili program ve veri hafızası sınırlıdır. Daha büyük programlar ya da daha fazla veri alanı gerektiğinde harici hafıza entegreleri bağlanır. Bu erişimi üç özel pin yönetir:
5.1 ALE/PROG — Adres Kilit Etkinleştirme
ALE (Address Latch Enable), P0 pinleri üzerinden çıkan düşük adres baytını (A0–A7) dış bir latch entegresine (ör. 74LS373) kilitlemek için kullanılır. Her makine çevriminde ALE periyodik olarak yüksek gönderilir.
5.2 PSEN — Program Deposu Etkinleştirme
PSEN (Program Store Enable), harici program belleğinden komut okunurken aktif olur. EA/VPP = 0 iken 8051, komutları dahili ROM yerine harici ROM’dan okur; bu esnada PSEN pini düşük seviyeye çekilerek harici ROM’un çıkış tamponlarını aktif eder.
5.3 EA/VPP — Harici Erişim
Bu pin, 8051’in program kodunu nereden okuyacağını belirler:
- [object Object] Dahili ROM kullanılır. Standart kullanım budur.
- [object Object] Tüm kod harici ROM’dan okunur.
⚠ Dikkat: EA/VPP pini asla boşta bırakılmamalıdır. Mutlaka Vcc veya GND’e bağlanmalıdır; aksi takdirde mikrodenetleyici düzensiz çalışır.
Bölüm 6 — Port Okuma ve Yazma Komutları
8051’de bir port pinine veri yazarken ya da okurken iki farklı davranış ortaya çıkabilir. Bunu anlamak, özellikle Oku/Değiştir/Yaz komutlarında kritik önem taşır.
6.1 Pin Okuma Komutları — Fiziksel Pinden Okur
Bu komutlar çalıştığında, portun fiziksel (elektriksel) durumu okunur. Yani pin üzerindeki gerçek voltaj seviyesi alınır. Dışarıdan bir giriş sinyali okumak için bunları kullanırsınız.
| Komut | Açıklama | Örnek |
|---|---|---|
| MOV A, Px | Port değerini A yazmaçına kopyala | MOV A, P1 |
| JNB Px.y, <adres> | Bit 0 ise belirtilen adrese atla | JNB P1.2, BUTON_BASILI |
| JB Px.y, <adres> | Bit 1 ise belirtilen adrese atla | JB P3.2, KESME_GELDI |
| MOV C, Px.y | Pin durumunu Carry bayrağına aktar | MOV C, P2.0 |
Buton Okuma Örneği
P1.2’ye bağlı bir butonu (aktif-düşük) okuyan ve P1.0 LED’ini kontrol eden kod:
| ; 8051 Assembly Kodu |
| ; P1.2 butonu → P1.0 LED kontrolü |
| ; Buton basılıyken LED yanar (aktif-düşük mantık) |
| ORG 0000h |
| DONGU: |
| JNB P1.2, LED_YAK ; P1.2 = 0 ise buton basılı → LED yak |
| SETB P1.0 ; Buton basılı değil → LED söndür (1 = söner) |
| SJMP DONGU |
| LED_YAK: |
| CLR P1.0 ; LED yak (0 = yanar) |
| SJMP DONGU |
| END |
6.2 Oku/Değiştir/Yaz (Read-Modify-Write) Komutları
Bu komutlar çok farklı bir şekilde çalışır. Portun fiziksel pinini değil, dahili latch (tutucu) değerini okurlar; işlem yapar ve sonucu tekrar latch’e yazarlar. Tüm bu adımlar donanım tarafından otomatik gerçekleştirilir.
Bu ayrım neden önemlidir? Düşünün: pine dışarıdan bir yük bağlıysa, latch değeri ile fiziksel pin değeri farklı olabilir. Pin okuma komutları bu dış yükten etkilenirken, Oku/Değiştir/Yaz komutları latch’teki değeri baz alır; dolayısıyla dış yükten bağımsız çalışır.
| Komut | İşlem | Örnek |
|---|---|---|
| ANL Px, a | Lojik VE (AND) | ANL P1, A |
| ORL Px, a | Lojik VEYA (OR) | ORL P2, #55h |
| XRL Px, a | Lojik ÖZEL-VEYA (XOR) | XRL P3, #0AAh |
| CPL Px.x | Biti tersle (Complement) | CPL P1.3 |
| SETB Px.y | Belirtilen biti 1 yap | SETB P0.3 |
| CLR Px.y | Belirtilen biti 0 yap | CLR P3.6 |
| INC Px | Port değerini 1 artır | INC P2 |
| DEC Px | Port değerini 1 azalt | DEC P3 |
| DJNZ Px, <adres> | Azalt, sıfır değilse atla | DJNZ P1, DONGU |
| JBC Px.x, <adres> | Bit=1 ise atla, sonra biti sıfırla | JBC P2.0, DEVAM |
6.3 ANL Komutu — Detaylı İnceleme
ANL komutunun iki farklı kullanımı, Oku/Değiştir/Yaz mantığını mükemmel biçimde gösterir:
ANL P1, A → P1 hedef operand
Bu kullanımda donanım şu adımları sırayla gerçekleştirir:
- P1 latch’inin mevcut değerini oku.
- Akümülatördeki (A) değer ile AND işlemi yap.
- Sonucu P1 latch’ine geri yaz.
ANL A, P1 → P1 kaynak operand
Bu kullanımda ise P1’in fiziksel pin değeri okunur; AND işlemi yapılır ve sonuç yalnızca A yazmaçına yazılır. P1 latch’i değişmez.
| ; 8051 Assembly Kodu |
| ; P1’in yalnızca üst nibleini (4-7. bitler) koru, alt nibbleyi temizle |
| ; Önce: P1 = 1011 1101 |
| ; Maske: #F0h = 1111 0000 |
| ; Sonra: P1 = 1011 0000 |
| ORG 0000h |
| ANL P1, #0F0h ; P1 AND 11110000 → alt 4 bit sıfırlandı |
| SJMP $ |
| END |
6.4 3 Durumlu Buffer (3-State Buffer)
8051’de kullanılan tampon (buffer) yapısı 3 durumludur (tri-state). Kontrol sinyali (c) ile çıkış aktif veya yüksek empedanslı duruma getirilebilir:
| Kontrol (c) | Giriş (x) | Çıkış (y) |
|---|---|---|
| c = 1 | 1 | 1 — İletim aktif |
| c = 1 | 0 | 0 — İletim aktif |
| c = 0 | * (fark etmez) | Z∞ — Yüksek empedans (devre dışı) |
Yüksek empedans durumu (Z∞), çıkışın ne Lojik 0 ne de Lojik 1 olduğu, tamamen elektriksel olarak kopuk göründüğü bir durumdur. Bu özellik, birden fazla cihazın aynı veri yolunu paylaştığı sistemlerde çakışmayı önler.
Bölüm 7 — ADuC841: Gelişmiş Bir 8051 Türevi
ADuC841, Analog Devices firmasının geliştirdiği, standart 8051 mimarisi üzerine inşa edilmiş gelişmiş bir mikrodenetleyicidir. 52 pinlik PQFP gövdesiyle standart 8051’den 12 fazla pine sahiptir.
7.1 Ekstra Pinlerin Dağılımı
ADuC841’deki 12 ilave pinin 6 tanesi, entegrenin ilave çevre birimlerine (DAC0, DAC1, SDATA, MOSI, CREF, VREF) ait giriş/çıkış uçlarıdır. Diğer 6 tanesi ise bu çevre birimlerinin besleme uçlarını (AVDD, AGND, DVDD, DGND) oluşturur.
7.2 8051’den Farkları
ADuC841’in temel farklılıkları şöyle özetlenebilir:
- [object Object] Standart 8051 ile aynı şekilde kullanılır; ancak P2 ve P3’e ek alternatif fonksiyonlar eklenmiştir.
- [object Object] ADuC841’de P1 portunda önemli bir değişiklik yapılmıştır: port mimarisindeki değişiklik nedeniyle P1 pinleri dijital çıkış olarak KULLANILAMAZ. P1 pinleri yalnızca analog giriş kanalları (ADC0–ADC6) ve T/C-2 kontrol girişleri olarak çalışır.
- [object Object] Çok kanallı, yüksek hassasiyetli bir analog-dijital çevirici içerir.
- [object Object] İki bağımsız dijital-analog çevirici sunar.
⚠ Dikkat: ADuC841 kullanırken P1 portunu dijital I/O olarak yapılandırmaya çalışmayın. Bu port yalnızca analog amaçlıdır.
Bölüm 8 — Kapsamlı Assembly Örneği: Sayaç ile LED Çubuğu
Bu son bölümde öğrendiğimiz her şeyi bir araya getiren bütünleşik bir örnek sunacağız. Amaç, P1 portuna bağlı 8 LED’i ikili sayaç (binary counter) olarak kullanmak; her saniyede bir saymak ve P3.2’deki bir buton ile sayacı sıfırlamaktır.
Devre Bağlantısı
- P1.0 – P1.7: 8 adet LED (aktif-düşük, 470 Ω seri direnç ile)
- P3.2 (INT0): Sıfırlama butonu (aktif-düşük, pull-up dahili)
- Kristal: 12 MHz
| ; 8051 Assembly Kodu |
| ; ═══════════════════════════════════════════════════════════ |
| ; 8051 İkili Sayaç — P1 LED çubuğu, P3.2 buton sıfırlama |
| ; Kristal: 12 MHz | 1 saniye gecikme ≈ 250×250×16 döngü |
| ; ═══════════════════════════════════════════════════════════ |
| ORG 0000h |
| AJMP BASLA ; Reset vektöründen atla |
| ORG 0030h ; Ana program |
| BASLA: |
| MOV P1, #00h ; P1 = 0 → tüm LEDler başlangıçta söner |
| MOV R2, #00h ; Sayaç değeri = 0 |
| ANA_DONGU: |
| MOV P1, R2 ; Sayaç değerini LED portuna yaz |
| ACALL BIR_SANIYE ; 1 saniye bekle |
| JNB P3.2, SIFIRLA ; Buton basılı (0) → sıfırla |
| INC R2 ; Sayacı artır |
| CJNE R2, #100, ANA_DONGU ; 100’e kadar say, sonra tekrar başla |
| MOV R2, #00h ; 100 = sıfırla |
| SJMP ANA_DONGU |
| SIFIRLA: |
| MOV R2, #00h ; Sayacı sıfırla |
| MOV P1, #00h ; LEDleri söndür |
| ACALL BIR_SANIYE ; Buton debounce (titreme önleme) |
| SJMP ANA_DONGU |
| ; ── 1 Saniye Gecikme Alt Programı ────────────────────── |
| ; 12 MHz @ 1 makine çevrimi = 1 µs |
| ; 250 × 250 × 16 µs ≈ 1.000.000 µs = 1 saniye |
| BIR_SANIYE: |
| MOV R0, #16 ; Dış döngü 16 kez |
| D1: MOV R1, #250 ; Orta döngü 250 kez |
| D2: MOV R3, #250 ; İç döngü 250 kez |
| D3: DJNZ R3, D3 ; İç döngü |
| DJNZ R1, D2 ; Orta döngü |
| DJNZ R0, D1 ; Dış döngü |
| RET |
| END |
Bu örnekte öğrendiklerimizin şu kısımlarını kullandık:
- [object Object] — Port yazma: sayaç değerini LED portuna aktar
- [object Object] — Pin okuma: buton durumunu fiziksel pinden oku
- [object Object] — Sayacı artır
- [object Object] — Karşılaştır ve atla
- [object Object] — Gecikme döngüsü için sayaçlı atlama
Özet: 8051 Portlarının Karşılaştırması
| Port | Pull-up | Harici Pull-up? | İkincil Fonksiyon |
|---|---|---|---|
| P0 | YOK (Open-Drain) | Evet, zorunlu | AD0–AD7 (Adres/Veri) |
| P1 | DAHİLİ | Hayır | Yok (salt I/O) |
| P2 | DAHİLİ | Hayır | A8–A15 (Yüksek adres) |
| P3 | DAHİLİ | Hayır | UART, INT, Timer, WR, RD |
— Gömülü Sistem Tasarımı Serisi —


