Assembly ile ADuC841 – [7] Zamanlayıcı ve Sayıcı Hesaplamaları Temelleri
8051 Zamanlayıcı ve Sayıcı Hesaplamaları Temelleri
İçindekiler
- Sistem Saat Üreteci ve Makine Çevrimi
- ADUC841 Makine Çevrimi
- Zamanlayıcı/Sayıcı Yapısı
- TMOD Saklayıcısı
- TCON Saklayıcısı
- Çalışma Modları (Mod 0, Mod 1, Mod 2, Mod 3)
- Sayma Değeri Hesaplama (DERS 10.1)
- Temel Zamanlayıcı Algoritması (DERS 10.2)
- Timer 2 (ADUC841)
- Özet ve Hatırlatıcılar
1. Sistem Saat Üreteci ve Makine Çevrimi
Saat Üreteci Nedir?
Mikrodenetleyicinin çalışabilmesi için bir “kalp atışına” ihtiyacı vardır. Bu kalp atışını, yani saat darbelerini üreten birime Saat Üreteci (Clock Generator) denir.
8051 ailesinde tümdevre üzeri (dahili) osilatör mevcuttur. Bu osilatörün çalışabilmesi için XTAL1 ve XTAL2 pinlerine bir kristal veya seramik rezonatör + iki kondansatör bağlanmalıdır.
📌 Pratik Not: Mikrodenetleyiciye bağlanan kristal frekansı, üretici firmanın belirlediği maksimum değeri aşmamalıdır.
- 8051 için max: 16 MHz
- ADUC841 için max: 20 MHz
📐 ŞEKİL 1 — Osilatör Bağlantı Devresi

- Kristal (12 MHz) XTAL1 ve XTAL2 pinleri arasına bağlanır
- Her iki pine 30 pF’lık kondansatör (C1 ve C2) seri olarak eklenir
- Bağlantı Vss (GND) hattına tamamlanır
|
1 2 3 4 5 6 7 8 |
C1=30pF ┤├──────┤ XTAL2 ├── Kristal [8051] ┤├──────┤ XTAL1 ├── C2=30pF │ Vss |
Makine Çevrimi (Machine Cycle)
8051 her bir işlemi makine çevrimi adı verilen birimlerle gerçekleştirir.
Nasıl hesaplanır?
Standart 8051’de:
- 1 Makine Çevrimi = 12 Osilatör Periyodu
Örnek: 12 MHz kristal kullanılırsa;
|
1 2 |
T_makine = 12 / 12.000.000 Hz = 1 µs |
Genel formül:
|
1 2 |
T = (Cycle × 12) / Kristal Frekansı (saniye cinsinden) |
Pratik Örnek
MOV R0, 45h komutu 2 makine çevriminde çalışır. 12 MHz kristal için:
|
1 2 |
T = (2 × 12) / (12 × 10⁶) = 2 × 10⁻⁶ sn = 2 µs |
📐 ŞEKİL 2 — Makine Çevrimi Diyagramı

Şekilde şu yapı gösterilmektedir:
- Her durum (state), P1 ve P2 olmak üzere 2 osilatör periyodundan oluşur
- Durum 1’den Durum 6’ya kadar 6 durum vardır
- Toplamda: 6 × 2 = 12 osilatör periyodu = 1 makine çevrimi
2. ADUC841 Makine Çevrimi
ADUC841, standart 8051’den çok daha hızlıdır. Sebebi şu:
| Özellik | Standart 8051 | ADUC841 |
|---|---|---|
| 1 Makine Çevrimi | 12 osilatör periyodu | 1 osilatör periyodu |
| 12 MHz kristal ile hız | 1 MIPS | 12 MIPS |
ADUC841 formülü:
|
1 2 |
T = Cycle / Kristal Frekansı (saniye cinsinden) |
ADUC841 Örneği
MOV R0, 45h — 2 çevrimlik komut, 12 MHz kristal:
|
1 2 |
T = 2 / (12 × 10⁶) ≈ 0.167 × 10⁻⁶ sn ≈ 0.167 µs |
🔍 Karşılaştırma: Aynı komut standart 8051’de 2 µs sürerken ADUC841’de 0.167 µs sürer. Bu 12 kat hız farkı demektir! (2 / 0.167 ≈ 12)
Geliştirme Kartlarında Kullanılan Frekans
Derste kullanılan ADUC841 geliştirme kartlarında 11.0592 MHz kristal bulunur.
Bu durumda 1 makine çevrimi:
|
1 2 |
T = 1 / (11.0592 × 10⁶) = 90.4 × 10⁻⁹ sn ≈ 90 ns |
📌 Neden 11.0592 MHz? Bu özel frekans, seri haberleşmede hatasız baud rate üretimi için tercih edilir.
3. Zamanlayıcı/Sayıcı Yapısı
Neden Zamanlayıcı/Sayıcı Kullanırız?
Mikrodenetleyici uygulamalarında sıkça şu ihtiyaçlar ortaya çıkar:
- Belirli bir süre beklemek (gecikme oluşturmak)
- Bir olayın kaç kez gerçekleştiğini saymak
- Belirli bir zaman aralığını ölçmek
Bu ihtiyaçlar için yazılım döngüsü kullanmak yerine donanımsal Zamanlayıcı/Sayıcı (Timer/Counter, T/C) birimini kullanmak çok daha verimlidir.
Neden daha verimli?
CPU, zamanlayıcıyı çalıştırdıktan sonra başka işler yapmaya devam edebilir. Zamanlayıcı arka planda bağımsız olarak sayar. Bu nedenle sayma işlemleri işlemcinin performansını etkilemez.
8051 / ADUC841’de Zamanlayıcı Yapısı
ADUC841 ve 8051’de 2 adet 16-bit zamanlayıcı/sayıcı bulunur:
- T/C-0 (Timer/Counter 0)
- T/C-1 (Timer/Counter 1)
- (ADUC841’de bir de T/C-2 bulunur, ileride anlatılacaktır)
Her iki birimin temel özellikleri:
- Yukarı yönde sayar (0’dan max değere doğru)
- İstenirse başlangıç değeri yüklenebilir (o değerden sayılmaya devam eder)
- Aynı donanım, hem zamanlayıcı hem de sayıcı olarak kullanılabilir
Zamanlayıcı mı, Sayıcı mı?
Zamanlayıcı modunda (C/T̄ = 0): Sistem saatinden (osilatörden) gelen darbeler sayılır. Her makine çevriminde sayma değeri 1 artar. Bu mod, geçen süreyi ölçmek için kullanılır.
Sayıcı modunda (C/T̄ = 1): Dış dünyadan gelen darbe sayısı sayılır. P3.4 (T0) veya P3.5 (T1) pinlerine bağlanan dış işaret her 1→0 geçişinde sayma değeri 1 artar.
📐 ŞEKİL 3 — Basitleştirilmiş Zamanlayıcı/Sayıcı Blok Diyagramı

Şekilde gösterilecekler:
- Üst yol (0): OSC → Zamanlayıcı → THi/TLi saklayıcıları
- Alt yol (1): P3.4(T0) veya P3.5(T1) → Sayıcı → THi/TLi saklayıcıları
- Anahtar: 0=Zamanlayıcı, 1=Sayıcı seçimi yapar
Saklayıcılar
Her zamanlayıcı için anlık sayma değerini tutan 8-bitlik iki SFR (Special Function Register) vardır:
| Zamanlayıcı | Yüksek Byte | Düşük Byte |
|---|---|---|
| T/C-0 | TH0 | TL0 |
| T/C-1 | TH1 | TL1 |
- Reset sonrasında bu saklayıcıların değeri 00h‘dir.
- Herhangi bir anda mevcut sayma değeri bu saklayıcılardan okunabilir.
- İstenen başlangıç değeri bu saklayıcılara yazılabilir.
4. TMOD Saklayıcısı
TMOD (Timer Mode Register), zamanlayıcıların çalışma ayarlarını belirleyen kontrol saklayıcısıdır.
⚠️ Önemli: TMOD saklayıcısı bit adreslenemez. Yani tek bir biti değiştirmek için
SETBkomutu kullanılamaz; tüm byte yazılmalıdır.
TMOD Bit Yapısı
|
1 2 3 4 5 6 |
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 ┌────────┬────────┬──────┬──────┬────────┬────────┬──────┬──────┐ │ GATE1 │ C/T̄1 │ M1 │ M0 │ GATE0 │ C/T̄0 │ M1 │ M0 │ └────────┴────────┴──────┴──────┴────────┴────────┴──────┴──────┘ │←────────────── T/C1 ──────────────→│←────────── T/C0 ──────────→│ |
TMOD Bit Açıklamaları
| Bit | İsim | Açıklama |
|---|---|---|
| 7 | GATE1 | T/C-1 için kapı kontrolü. 0: TR1=1 ile aktif olur. 1: TR1=1 VE P3.3(INT1)=1 olmalı |
| 6 | C/T̄1 | 0: Zamanlayıcı (dahili saat), 1: Sayıcı (harici darbe) |
| 5 | M1 | T/C-1 çalışma modu seçimi (M1-M0 tablosuna bakınız) |
| 4 | M0 | T/C-1 çalışma modu seçimi |
| 3 | GATE0 | T/C-0 için kapı kontrolü. Harici start/stop: P3.2(INT0) pini |
| 2 | C/T̄0 | 0: Zamanlayıcı, 1: Sayıcı |
| 1 | M1 | T/C-0 çalışma modu seçimi |
| 0 | M0 | T/C-0 çalışma modu seçimi |
5. TCON Saklayıcısı
TCON (Timer Control Register), zamanlayıcıları başlatıp durdurmak ve taşma bayraklarını kontrol etmek için kullanılır.
✅ Önemli: TCON saklayıcısı bit adreslenebilir. Tek bir biti
SETBveyaCLRkomutuyla değiştirebilirsiniz.
TCON Bit Yapısı
|
1 2 3 4 5 6 |
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 ┌──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┐ │ TF1 │ TR1 │ TF0 │ TR0 │ IE1 │ IT1 │ IE0 │ IT0 │ └──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┘ │←──── T/C1 ────→│←──── T/C0 ────→│←─── Harici Kesme ──→│ |
TCON Bit Açıklamaları
| Bit | İsim | Açıklama |
|---|---|---|
| 7 | TF1 | T/C-1 taşma bayrağı. Taşınca donanım tarafından SET edilir. Kesme kullanılmıyorsa yazılımla temizlenmelidir. |
| 6 | TR1 | T/C-1 çalıştırma biti. TR1=1 → Aktif, TR1=0 → Pasif |
| 5 | TF0 | T/C-0 taşma bayrağı. TF1 ile aynı işlev |
| 4 | TR0 | T/C-0 çalıştırma biti. TR1 ile aynı işlev |
| 3 | IE1 | Harici kesme1 bayrağı (donanım set/temizler) |
| 2 | IT1 | Harici kesme1 algılama kontrolü (0=seviye, 1=kenar) |
| 1 | IE0 | Harici kesme0 bayrağı |
| 0 | IT0 | Harici kesme0 algılama kontrolü |
📐 ŞEKİL 4 ve 5 — T/C Detaylı Blok Diyagramları

Blok diyagramlarında şu 3 temel kontrol mekanizması görülmektedir:
- Giriş kaynağı kontrolü → TMOD’daki C/T̄ biti
- Çalışma kontrolü → GATE, TR, INT pinleri kombinasyonu
- Yenileme modu → Çalışma moduna göre (Mod 0/1/2/3)
6. Çalışma Modları
T/C-0 ve T/C-1, TMOD saklayıcısındaki M1-M0 bitleriyle 4 farklı modda çalışabilir:
| M1 | M0 | Mod | Açıklama |
|---|---|---|---|
| 0 | 0 | Mod 0 | 13-bit zamanlayıcı/sayıcı |
| 0 | 1 | Mod 1 | 16-bit zamanlayıcı/sayıcı |
| 1 | 0 | Mod 2 | 8-bit otomatik yüklemeli zamanlayıcı/sayıcı |
| 1 | 1 | Mod 3 | Bağımsız çalışma modu |
Mod 0 — 13-bit Zamanlayıcı/Sayıcı
TLi’nin düşük 5 biti + THi’nin 8 biti = toplam 13 bit kullanılır.
Maksimum sayma değeri: 2¹³ = 8192 (0 ile 8191 arası)
Her 32 darbede THi 1 artar (TLi’nin 5-bitlik sayma aralığı: 0–31 = 32 darbe).
Taşma: Sayma değeri 8192’ye ulaştıktan sonra gelen ilk darbe ile taşma gerçekleşir → TFi=1 → TLi ve THi sıfırlanır (00h’e düşer).
📐 ŞEKİL 6 — Mod-0 Blok Diyagramı

Şekilde:
- Osilatör → C/T̄ seçim anahtarı → TL1 (5-Bit) → TH1 (8-Bit) → TF1 → Kesme
- TR1 ve Gate1 kontrol lojik kapısı görülür
Mod 1 — 16-bit Zamanlayıcı/Sayıcı
Mod 0’dan tek farkı, TLi’nin 8-bitinin tamamının kullanılmasıdır.
Maksimum sayma değeri: 2¹⁶ = 65536 (0 ile 65535 arası → FFFFh)
Bu, ders anlatımındaki en yaygın kullanılan moddur.
📐 ŞEKİL 7 — Mod-1 Blok Diyagramı

Şekilde Mod 0’dan farkı: TL1 artık 5-bit değil 8-bit olarak gösterilmiştir.
Mod 2 — 8-bit Otomatik Yüklemeli Zamanlayıcı/Sayıcı
Bu mod, otomatik yenileme (auto-reload) özelliği ile öne çıkar.
Çalışma mantığı:
- TLi anlık sayma değerini tutar (8-bit, 0–255 arası sayar)
- TLi → 255’e ulaşır → Taşma gerçekleşir → TFi=1
- THi’deki değer otomatik olarak TLi’ye yüklenir
- TLi bu yeni değerden saymaya devam eder
Ne zaman kullanılır? Sabit periyotlu, tekrarlayan zaman gecikmeleri gerektiğinde (örn. seri haberleşme baud rate üretimi).
📐 ŞEKİL 8 — Mod-2 Blok Diyagramı

Şekilde THi → “Yeniden Yükle” oku → TLi geri beslemesi dikkat çekicidir.
Mod 3 — Bağımsız Çalışma Modu
T/C-1 için: Bu modda T/C-1 durdurulur, son sayma değeri TH1 ve TL1’de tutulmaya devam eder.
T/C-0 için: 2 bağımsız 8-bit’lik yapıya ayrılır:
- TL0: T/C-0’ın kendi kontrol bitleriyle yönetilen, taşmada TF0 bayrağını set eden 8-bit zamanlayıcı/sayıcı
- TH0: TR1 biti ile kontrol edilen ve taşmada TF1 bayrağını set eden 8-bit zamanlayıcı
📐 ŞEKİL 9 — Mod-3 Blok Diyagramı

7. Sayma Değeri Hesaplama
Bu bölüm, video dersinde gösterilen DERS 10.1 içeriğini kapsamaktadır. Zamanlayıcıya yüklenecek başlangıç değerinin nasıl hesaplandığı adım adım açıklanmaktadır.
Temel Kavramlar
Verilen:
- Frekans: f_osc = 11.0592 MHz
- Osilatör periyodu: T_osc = 1 / f_osc ≈ 90.4 ns (≈ 90 ns)
- ADUC841’de 1 makine çevrimi = 1 osilatör periyodu = 90.4 ns
Mod 1’de maksimum sayma süresi (16-bit):
|
1 2 |
t_max = 65536 × 90.4 × 10⁻⁹ sn ≈ 5.92 ms |
💡 Bu değer, zamanlayıcının hiç yüklemeden, 0000h’den başlayarak FFFFh’e kadar sayıp taşmasının ne kadar sürdüğünü gösterir.
N_sayma (Sayma Sayısı) Hesabı
İstenen gecikme süresine (t_sayma) karşılık gelen sayma sayısı:
|
1 2 |
N_sayma = t_sayma / T_osc = t_sayma / 90.4 ns |
Durum 1: t_sayma ≤ t_max (Tek Turda Sığan Gecikme)
Eğer istenilen süre t_max = 5.92 ms’den küçükse, tek bir zamanlayıcı turu yeterlidir.
Zamanlayıcıya yüklenecek değer:
|
1 2 |
N_girilen = N_max - N_sayma = 65536 - N_sayma |
Örnek: 1 ms gecikme (t_sayma = 1 ms)
|
1 2 3 |
N_sayma = 1 × 10⁻³ / 90.4 × 10⁻⁹ ≈ 11062 N_girilen = 65536 - 11062 = 54474 = D4CAh |
Bu değer TH0 ve TL0’a (veya TH1/TL1’e) yüklenir:
|
1 2 3 |
MOV TH0, #0D4h ; Yüksek byte MOV TL0, #0CAh ; Düşük byte |
Durum 2: t_sayma > t_max (Birden Fazla Tur Gereken Gecikme)
İstenen süre 5.92 ms’den büyükse tek tur yetmez. İki yöntem kullanılabilir:
Yöntem i: t_sayma / t_max → Döngü Değeri (tam sayıya yuvarla)
|
1 2 |
döngü_sayısı = t_sayma / t_max |
Bölme sonucu tam bölünmüyorsa → hata oluşur (bölünemeyen durum hatası).
Örnek: 25 ms gecikme
|
1 2 |
25 ms / 5.92 ms ≈ 4.22 → tam sayıya bölünmez → HATA |
Bu durumda farklı bir temel süre seçmek gerekir.
Yöntem ii: Uygun Temel Süre Seçimi
t_sayma değerinin tam bölenlerinden biri olan bir temel süre seçilir:
Örnek: 25 ms için 5 ms temel seçimi
|
1 2 |
döngü_sayısı = 25 ms / 5 ms = 5 ✓ (tam bölündü) |
Şimdi 5 ms için başlangıç değeri hesaplanır:
|
1 2 3 |
N_sayma = 5 × 10⁻³ / 90.4 × 10⁻⁹ ≈ 55310 N_girilen = 65536 - 55310 = 10226 = 27F2h |
Assembly’de 5 döngüyle 25 ms:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
; ---- 25 ms Gecikme Alt Programı ---- ; Temel süre: 5 ms, Döngü: 5 kez MOV TMOD, #01h ; Timer0, Mod 1, Zamanlayıcı TEKRAR: MOV TH0, #27h ; 5 ms için yüksek byte MOV TL0, #0F2h ; 5 ms için düşük byte SETB TR0 ; Timer başlat BEKLE: JNB TF0, BEKLE ; Taşmayı bekle CLR TF0 ; Bayrağı temizle CLR TR0 ; Timer durdur DJNZ R7, TEKRAR ; R7 = 5 ile başlatılmalı ; Burada 25 ms geçti |
⚠️ Yöntem ii için ilk değer girişi gereklidir (döngü sayacı R7’ye başlangıç değeri atanmalı).
Görseli Açıklayan Not
Yüklediğiniz birinci görselde (DERS 10.1 tahtası) şu bilgiler yer almaktadır:
- Üst sağda: f_osc = 11.0592 MHz → T_osc ≈ 90.4 ns
- t_max = 65536 × 90.4 ns ≈ 5.92 ms
- Durum 1: t_sayma ≤ t_max → N_girilen = N_max – N_sayma
- Durum 2: t_sayma > t_max
- i) t_sayma / t_max → döngü değeri (tam bölünmezse hata)
- ii) t_sayma / 5ms → 25ms/5ms = 5 (döngü değeri) ✓
- Sağ üst: TH0/TL0 bloğu ve N_sayma = t_sayma / 90.4 ns formülü
8. Temel Zamanlayıcı Algoritması
Bu bölüm, video dersindeki DERS 10.2 tahtasında gösterilen 6 adımlı temel algoritmanın kapsamlı açıklamasıdır.
6 Adımlı Temel Zamanlayıcı Algoritması
|
1 2 3 4 5 6 7 8 9 10 11 12 |
┌──────────────────────────────────────────────────────┐ │ TEMEL ZAMANLAYlCI ALGORİTMASI │ ├────┬─────────────────────────────────────────────────┤ │ 1 │ İlk ayarla (TMOD) → MOV TMOD, #__h │ │ 2 │ İlk değerleri yükle → MOV TL0, #__h │ │ │ MOV TH0, #__h │ │ 3 │ Başlama koşulu → Probleme göre belirlenir │ │ 4 │ Zamanlayıcıyı başlat → SETB TR0 │ │ 5 │ Taşma bayrağı kontrol→ JNB TF0/TF1, x │ │ 6 │ Taşma bayrağını temizle → CLR TF0/TF1 │ └────┴─────────────────────────────────────────────────┘ |
Her Adımın Detaylı Açıklaması
Adım 1: İlk Ayarla (TMOD)
TMOD saklayıcısına uygun değer yazılır. Hangi biti ne yapacağınızı bilmek gerekir.
Örnek: T/C-0, Mod 1, Zamanlayıcı modu, Yazılımsal start/stop (GATE=0):
|
1 2 3 4 5 6 |
TMOD değeri: Bit7(GATE1)=0, Bit6(C/T̄1)=0, Bit5(M1)=0, Bit4(M0)=0 Bit3(GATE0)=0, Bit2(C/T̄0)=0, Bit1(M1)=0, Bit0(M0)=1 → TMOD = 00000001b = 01h |
|
1 2 |
MOV TMOD, #01h |
Adım 2: İlk Değerleri Yükle
Hesaplanan N_girilen değeri TH0 ve TL0’a ayrı ayrı yüklenir.
|
1 2 3 |
MOV TL0, #düşük_byte MOV TH0, #yüksek_byte |
📌 Değerleri hesaplamak için Bölüm 7’deki formüller kullanılır.
Adım 3: Başlama Koşulu
Zamanlayıcının ne zaman başlatılacağını belirler. Bu, probleme göre değişir:
- Hemen başlat (sonraki adıma geç)
- Bir butona basılınca başlat
- Belirli bir giriş sinyali gelince başlat
Adım 4: Zamanlayıcıyı Başlat
|
1 2 3 4 |
SETB TR0 ; Timer-0 için ; veya SETB TR1 ; Timer-1 için |
Adım 5: Taşma Bayrağını Kontrol Et
TF0 (veya TF1) bayrağı SET olana kadar döngüde bekle:
|
1 2 3 |
x: JNB TF0, x ; TF0=0 ise x etiketine dön (bekle) ; TF0=1 olunca bir sonraki satıra geç |
Alternatif kullanım (etiketle):
|
1 2 |
BEKLE: JNB TF0/TF1, BEKLE |
Adım 6: Taşma Bayrağını Temizle
Kesme yapısı kullanılmıyorsa bayrak yazılımla temizlenmelidir. Aksi halde bir sonraki turda sorun çıkar.
|
1 2 3 4 |
CLR TF0 ; Timer-0 bayrağını temizle ; veya CLR TF1 ; Timer-1 bayrağını temizle |
Tam Örnek Program: 250 µs Gecikme
Problem: 11.0592 MHz kristal, T/C-0, Mod 1 kullanarak 250 µs gecikme üret.
Çözüm:
|
1 2 3 4 5 |
T_osc = 90.4 ns N_sayma = 250 × 10⁻⁶ / 90.4 × 10⁻⁹ ≈ 2765 N_girilen = 65536 - 2765 = 62771 = F533h → TH0 = F5h, TL0 = 33h |
Assembly Kodu:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
; ============================================ ; 250 µs GECİKME PROGRAMI ; Kristal: 11.0592 MHz, Timer0, Mod1 ; ============================================ DELAY_250US: MOV TMOD, #01h ; Adım 1: T0, Mod1, Zamanlayıcı MOV TL0, #33h ; Adım 2: Düşük byte yükle MOV TH0, #0F5h ; Adım 2: Yüksek byte yükle ; Adım 3: Başlama koşulu yok (hemen başlat) SETB TR0 ; Adım 4: Zamanlayıcıyı başlat BEKLE: JNB TF0, BEKLE ; Adım 5: Taşma bayrağı kontrol CLR TF0 ; Adım 6: Bayrağı temizle CLR TR0 ; Timer durdur RET ; Geri dön |
Görseli Açıklayan Not (DERS 10.2 Tahtası)
Yüklediğiniz ikinci görselde (DERS 10.2 tahtası) şu 6 adım yer almaktadır:
- İlk ayarla →
MOV TMOD, #__h - İlk değerler →
MOV TL0, #__hveMOV TH0, #__h - Başlama koşulu → Zamanlayıcının başlatılmasına yönelik probleme göre belirtilen şart
- Zamanlayıcıyı başlat →
SETB TR0 - Taşma bayrağı kontrol →
JNB TF0/TF1, x:x: JNB TF0, x - Taşma bayrağını temizle → (Yazılımla temizlenir)
9. Timer 2 (ADUC841)
ADUC841 mimarisinde standart 8051’den farklı olarak Timer 2 de bulunur.
T2CON Saklayıcısı
Timer 2’nin çalışma ayarları T2CON SFR’si ile yapılır. T2CON bit adreslenebilir.
|
1 2 |
T2CON: | TF2 | EXF2 | RCLK | TCLK | EXEN2 | TR2 | CNT2 | CAP2 | |
| Bit | İsim | Açıklama |
|---|---|---|
| 7 | TF2 | Timer2 taşma bayrağı. RCLK=1 veya TCLK=1 durumunda set edilmez. Yazılımla temizlenir. |
| 6 | EXF2 | T2EX (P1.1) pininde düşen kenar gelince set edilir (EXEN2=1 ise). |
| 5 | RCLK | Seri port Mode1/Mode3’te alma (Rx) için saat kaynağı olarak Timer2 kullanılır. |
| 4 | TCLK | Seri port veri gönderme (Tx) için saat kaynağı olarak Timer2 kullanılır. |
| 3 | EXEN2 | T2EX pininden yakalama/yeniden yükleme işlevi aktif hale gelir. |
| 2 | TR2 | Timer2 çalıştırma biti. 1=Çalışır, 0=Durur. |
| 1 | CNT2 | T2 pininden (P1.0) harici sinyal sayar → Sayıcı modu. |
| 0 | CAP2 | T2EX (P1.1) düşen kenarında yakalama yapılır → Yakalama modu. |
Timer 2 Çalışma Modları
| RCLK veya TCLK | CAP2 | TR2 | Çalışma Modu |
|---|---|---|---|
| 0 | 0 | 1 | 16-Bit Yeniden Yükleme |
| 0 | 1 | 1 | 16-Bit Yakalama |
| 1 | X | 1 | Seri Haberleşme Baud-Rate Üreteci |
| X | X | 0 | Timer 2 Çalışmaz |
Timer 2 Saklayıcıları
| Saklayıcı | Açıklama |
|---|---|
| TH2, TL2 | Anlık sayma değerini tutar (16-bit) |
| RCAP2H, RCAP2L | Otomatik yükleme modunda: yüklenecek değer; Yakalama modunda: yakalanan değer |
📐 ŞEKİL 10 — Timer 2 Yeniden Yükleme Modu

📐 ŞEKİL 11 — Timer 2 Yakalama Modu

10. Özet ve Hatırlatıcılar
Hızlı Formül Kartı
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
┌─────────────────────────────────────────────────────────────┐ │ 8051 / ADUC841 FORMÜLLER │ ├─────────────────────────────────────────────────────────────┤ │ Standart 8051 Makine Çevrimi: │ │ T = (Cycle × 12) / f_kristal │ │ │ │ ADUC841 Makine Çevrimi: │ │ T = Cycle / f_kristal │ │ │ │ 11.0592 MHz kristal → T_osc = 90.4 ns │ │ Mod 1 t_max = 65536 × 90.4 ns ≈ 5.92 ms │ │ │ │ N_sayma = t_istenilen / T_osc │ │ N_girilen = 65536 - N_sayma (Mod 1, 16-bit) │ │ N_girilen = 256 - N_sayma (Mod 2, 8-bit) │ └─────────────────────────────────────────────────────────────┘ |
Hangi Mod Ne Zaman?
| Durum | Önerilen Mod |
|---|---|
| Tek seferlik, uzun süre (≤5.92 ms) | Mod 1 |
| Kısa, tekrarlayan, sabit periyot | Mod 2 (otomatik yükleme) |
| Çok eski kod uyumluluğu (nadiren) | Mod 0 |
| 2 bağımsız 8-bit timer gerekli | Mod 3 |
TMOD Değerlerini Hızlı Hesaplama
T/C-0, Zamanlayıcı, Mod 1:
|
1 2 3 |
GATE=0, C/T̄=0, M1=0, M0=1 → 0001 → 01h MOV TMOD, #01h |
T/C-0, Zamanlayıcı, Mod 2:
|
1 2 3 |
GATE=0, C/T̄=0, M1=1, M0=0 → 0010 → 02h MOV TMOD, #02h |
T/C-1, Zamanlayıcı, Mod 1 (T/C-0 kullanılmıyor):
|
1 2 3 4 5 |
T/C1: GATE=0, C/T̄=0, M1=0, M0=1 → 0001 T/C0: boş → 0000 → TMOD = 00010000b = 10h MOV TMOD, #10h |
Yaygın Hatalar
- TF bayrağını temizlemeyi unutmak → Zamanlayıcı bir sonraki turda hemen taşıyor gibi davranır.
- TH ve TL’yi yanlış sırayla yüklemek → Eğer zamanlayıcı çalışıyorken yükleme yapılırsa bayt tutarsızlığı olabilir. Önce durdur, sonra yükle.
- TMOD’u bit adreslemek → TMOD bit adreslenemez!
SETB TMOD.0çalışmaz. - Mod 2’de TH’yi boş bırakmak → TH, otomatik yükleme kaynağıdır; içinde değer yoksa 00h’den sayılır.
- t_sayma > t_max durumunda tek tur beklentisi → Döngü kullanmak zorunludur.
Örnek ve Uygulamalar
8051 Zamanlayıcı/Sayıcı — Kod + Donanım Örnekleri ile Sınav Rehberi
Makale Hakkında: Bu bölüm, bir önceki teorik makaleye doğrudan bağlıdır. Burada yalnızca uygulama, örnek kod, donanım bağlantısı odaklı çözümler yer almaktadır. Her örnek kendi içinde tam ve bağımsızdır: okuyup anlayın, kopyalayın, değiştirin.
📌 Bu Makalede Neler Var?
| Bölüm | Konu |
|---|---|
| 1 | TMOD değerini elle hesaplama yöntemi |
| 2 | TH/TL başlangıç değeri hesaplama yöntemi |
| 3 | Örnek 1 — Tek gecikme (250 µs) |
| 4 | Örnek 2 — LED yanıp sönme (1 Hz kare dalga) |
| 5 | Örnek 3 — 500 ms gecikme (döngüyle) |
| 6 | Örnek 4 — Kare dalga üretimi (P1.0, farklı duty cycle) |
| 7 | Örnek 5 — Mod 2 (8-bit otomatik yükleme) |
| 8 | Örnek 6 — Timer1 ile baud rate (seri haberleşme başlangıcı) |
| 9 | Örnek 7 — Sayıcı modu (harici darbe sayma) |
| 10 | Örnek 8 — İki timer’ı aynı anda kullanma |
| 11 | Sınav sorusu çözüm kalıpları |
| 12 | Hızlı başvuru kartı |
1. TMOD Değerini Elle Hesaplama
Bu yöntem sınavda en çok sorulan kısımdır. TMOD’un 8 biti tek tek doldurulur.
Adım Adım TMOD Hesaplama
TMOD bit sırası:
|
1 2 3 4 |
Bit: 7 6 5 4 3 2 1 0 GATE1 C/T̄1 M1 M0 GATE0 C/T̄0 M1 M0 ←────── Timer 1 (üst nibble) ──→ ←── Timer 0 (alt nibble) ──→ |
Sorular şu 4 soruya cevap vererek çözülür:
| Soru | Cevap | İlgili Bit |
|---|---|---|
| Hangi timer? T0 mu T1 mi? | — | Alt/üst nibble seçimi |
| Zamanlayıcı mı, sayıcı mı? | Zamanlayıcı → 0, Sayıcı → 1 | C/T̄ biti |
| Start/stop nasıl? | Yazılımsal → GATE=0, Donanımsal → GATE=1 | GATE biti |
| Hangi mod? | 0/1/2/3 | M1-M0 bitleri |
TMOD Değeri Örnekleri (Ezberlemeye Değer)
| Senaryo | Bit Dizisi (7→0) | Hex Değer |
|---|---|---|
| T0, Mod 1, Zamanlayıcı, yazılımsal start | 0000 0001 | 01h |
| T0, Mod 2, Zamanlayıcı, yazılımsal start | 0000 0010 | 02h |
| T1, Mod 1, Zamanlayıcı, yazılımsal start | 0001 0000 | 10h |
| T1, Mod 2, Zamanlayıcı, yazılımsal start | 0010 0000 | 20h |
| T0, Mod 1, Sayıcı, yazılımsal start | 0000 0101 | 05h |
| T0 Mod1 + T1 Mod1, ikisi Zamanlayıcı | 0001 0001 | 11h |
| T0, Mod 1, donanımsal start (GATE=1) | 0000 1001 | 09h |
🎯 Sınav ipucu: “Timer 0, Mod 1, zamanlayıcı modu” diyorsa cevap neredeyse her zaman
MOV TMOD, #01h‘dir.
2. TH/TL Başlangıç Değeri Hesaplama
Genel Formül
|
1 2 3 4 5 6 7 8 9 |
Kristal: 11.0592 MHz → T_makine = 90.4 ns N_sayma = İstenen_Süre / 90.4 ns N_girilen = 65536 - N_sayma (Mod 1, 16-bit için) N_girilen = 256 - N_sayma (Mod 2, 8-bit için) TH = N_girilen'in yüksek byte'ı TL = N_girilen'in düşük byte'ı |
Sık Kullanılan Değerler Tablosu (11.0592 MHz)
Bu tabloyu ezberlemeye gerek yok ama mantığını anlamak şart:
| İstenen Süre | N_sayma | N_girilen | TH | TL |
|---|---|---|---|---|
| 100 µs | 1106 | 64430 = FBEEh | FBh | EEh |
| 250 µs | 2765 | 62771 = F533h | F5h | 33h |
| 500 µs | 5531 | 60005 = EA65h | EAh | 65h |
| 1 ms | 11062 | 54474 = D4CAh | D4h | CAh |
| 5 ms | 55310 | 10226 = 27F2h | 27h | F2h |
| 50 ms | 553100 | Tek turda sığmaz → döngü gerekir | — | — |
⚠️ 50 ms için t_max = 5.92 ms’den büyük → döngü kullanılmalı!
Hex’e Dönüştürme (Sınavda Hızlı Yöntem)
|
1 2 3 4 5 6 7 8 |
Örnek: N_girilen = 54474 (1 ms gecikme için) 54474 ÷ 256 = 212 kalan 202 212 = D4h 202 = CAh → TH0 = D4h, TL0 = CAh |
3. Örnek 1 — Tek Gecikme: 250 µs
Problem
11.0592 MHz kristal, Timer 0, Mod 1 kullanarak 250 µs gecikme üret. P1.0 pinini bu gecikme sonunda HIGH yap.
Hesaplama
|
1 2 3 4 5 6 |
T_osc = 90.4 ns N_sayma = 250 × 10⁻⁶ / 90.4 × 10⁻⁹ ≈ 2765 N_girilen = 65536 - 2765 = 62771 = F533h TH0 = F5h, TL0 = 33h TMOD = 01h (T0, Mod1, Zamanlayıcı, yazılımsal start) |
Assembly Kodu
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
; ================================================ ; ÖRNEK 1: 250 µs Tek Gecikme ; Kristal: 11.0592 MHz | Timer0 | Mod1 ; ================================================ ORG 0000h BASLA: MOV TMOD, #01h ; [1] T0, Mod1, Zamanlayıcı MOV TL0, #33h ; [2] Düşük byte yükle MOV TH0, #0F5h ; [2] Yüksek byte yükle SETB TR0 ; [4] Timer'ı başlat BEKLE: JNB TF0, BEKLE ; [5] TF0=1 olana kadar bekle CLR TF0 ; [6] Bayrağı temizle CLR TR0 ; Timer durdur (isteğe bağlı) SETB P1.0 ; 250 µs geçti → P1.0 HIGH SJMP $ ; Sonsuz döngü (dur) END |
Donanım Bağlantısı
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
8051/ADUC841 ┌────────────┐ │ │ Kristal──┤ XTAL1/2 │ │ │ LED──┤ P1.0 │──── 220Ω ──── LED ──── GND │ │ │ │ └────────────┘ LED bağlantısı: P1.0 → 220Ω direnç → LED anodu → LED katodu → GND |
📌 Dikkat: P1.0 HIGH olduğunda LED yanar (aktif HIGH bağlantı). 8051’de portlar güç gelince HIGH çıkış yapar, bu yüzden LED önce yanıyor olabilir — reset sonrası P1.0 zaten HIGH’dır.
4. Örnek 2 — LED Yanıp Sönme (1 Hz Kare Dalga)
Problem
P1.0’a bağlı LED’i 1 saniyede 1 kez yanıp söndür. (500 ms ON, 500 ms OFF)
Hesaplama
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
İstenen süre: 500 ms t_max = 5.92 ms 500 ms > 5.92 ms → Döngü gerekir! Temel süre seçimi: 5 ms (tam bölünür: 500/5 = 100) 5 ms için: N_sayma = 5 × 10⁻³ / 90.4 × 10⁻⁹ ≈ 55310 N_girilen = 65536 - 55310 = 10226 = 27F2h TH0 = 27h, TL0 = F2h Döngü sayısı = 500 ms / 5 ms = 100 kez |
Assembly Kodu
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
; ================================================ ; ÖRNEK 2: LED Yanıp Sönme — 1 Hz (500ms ON/OFF) ; Kristal: 11.0592 MHz | Timer0 | Mod1 ; ================================================ ORG 0000h ANA: CPL P1.0 ; P1.0'ı tersle (ON ise OFF, OFF ise ON) LCALL GECIKME_500MS ; 500 ms bekle SJMP ANA ; Sonsuz döngü ; ============================================ ; 500 ms GECİKME ALT PROGRAMI ; Temel: 5 ms × 100 döngü = 500 ms ; ============================================ GECIKME_500MS: MOV R7, #100 ; Dış döngü = 100 kez DIS_DONGU: MOV TMOD, #01h ; T0, Mod1, Zamanlayıcı MOV TL0, #0F2h ; 5 ms için düşük byte MOV TH0, #27h ; 5 ms için yüksek byte SETB TR0 ; Timer başlat IC_BEKLE: JNB TF0, IC_BEKLE ; Taşma bekle CLR TF0 ; Bayrağı temizle CLR TR0 ; Timer durdur DJNZ R7, DIS_DONGU ; R7'yi azalt, sıfır değilse tekrar RET ; Ana programa dön END |
Donanım Bağlantısı
|
1 2 3 4 5 6 7 8 9 10 11 12 |
8051/ADUC841 ┌────────────┐ │ │ LED←─┤ P1.0 │ │ │ └────────────┘ Devre: P1.0 ──┬── 220Ω ──── LED ──── GND │ (alternatif: aktif LOW → P1.0 ── 220Ω ── LED ── VCC) |
CPL Komutunun Mantığı
|
1 2 3 4 |
İlk geçiş: P1.0 = 1 → CPL → P1.0 = 0 → LED söner → 500 ms bekle İkinci geçiş: P1.0 = 0 → CPL → P1.0 = 1 → LED yanar → 500 ms bekle Üçüncü geçiş: tekrar... |
💡
CPL P1.0komutu,JB/JNBile koşullu yazmak yerine tek satırda tersler. Sınavda çok kullanışlıdır.
5. Örnek 3 — Farklı Temel Süre Seçimi (10 ms × 50 = 500 ms)
Problem
Aynı 500 ms gecikmeyi bu sefer 10 ms temel süreyle yap.
Hesaplama
|
1 2 3 4 5 6 7 8 |
500 ms / 10 ms = 50 → tam bölünür ✓ 10 ms için: N_sayma = 10 × 10⁻³ / 90.4 × 10⁻⁹ ≈ 110619 110619 > 65536 → 10 ms, Mod1'de tek turda SIĞMAZ! → Farklı temel süre seçilmeli (örn. 5 ms veya 2 ms) |
🚨 tuzakı: 10 ms, 11.0592 MHz’de Mod 1 için sınırı (5.92 ms) aşar. Sınavda bu hatayı görürseniz “t_sayma > t_max, sığmaz” yazmalısınız!
Doğru Yaklaşım: 2 ms × 250 = 500 ms
|
1 2 3 4 5 6 |
2 ms için: N_sayma = 2 × 10⁻³ / 90.4 × 10⁻⁹ ≈ 22124 N_girilen = 65536 - 22124 = 43412 = A994h TH0 = A9h, TL0 = 94h Döngü = 500 / 2 = 250 kez |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
; ================================================ ; ÖRNEK 3: 500 ms Gecikme — 2 ms × 250 döngü ; ================================================ GECIKME_500MS_V2: MOV R6, #250 ; 250 döngü × 2 ms = 500 ms DONGU: MOV TMOD, #01h MOV TL0, #94h ; 2 ms için MOV TH0, #0A9h ; 2 ms için SETB TR0 BEKLE: JNB TF0, BEKLE CLR TF0 CLR TR0 DJNZ R6, DONGU RET |
📌 R6 = 250 yazılabilir. Ama R registerları maksimum 255 değer alabilir. 250 ≤ 255 olduğu için R6 kullanımı geçerlidir.
6. Örnek 4 — Kare Dalga Üretimi (P2.0, %50 Duty Cycle)
Problem
P2.0 pininden 1 kHz frekanslı kare dalga üret.
Hesaplama
|
1 2 3 4 5 6 7 8 9 |
f = 1 kHz → T_periyot = 1 ms %50 duty cycle → t_HIGH = t_LOW = 500 µs 500 µs için: N_sayma = 500 × 10⁻⁶ / 90.4 × 10⁻⁹ ≈ 5531 N_girilen = 65536 - 5531 = 60005 = EA65h TH0 = EAh, TL0 = 65h |
Assembly Kodu
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
; ================================================ ; ÖRNEK 4: 1 kHz Kare Dalga — P2.0 ; Periyot = 1 ms → Her yarı = 500 µs ; ================================================ ORG 0000h BASLA: MOV TMOD, #01h ; T0, Mod1 KARE_DONGU: CPL P2.0 ; P2.0'ı tersle (HIGH↔LOW) ; 500 µs gecikme MOV TL0, #65h MOV TH0, #0EAh SETB TR0 BEKLE: JNB TF0, BEKLE CLR TF0 CLR TR0 SJMP KARE_DONGU ; Sürekli tekrar END |
Çıkış Sinyali Görünümü
|
1 2 3 4 5 6 |
P2.0 ___________ ___________ _____ | | | | | | |_________| |_________| ← 500 µs →← 500 µs →← 500 µs →← 500 µs → ←────────── 1 ms ────────────────────────────→ |
Donanım: Osiloskop ile Ölçüm
|
1 2 3 4 5 6 7 |
8051/ADUC841 ┌────────────┐ │ │ KARE─────┤ P2.0 │────── Osiloskop CH1 DALGA │ │ │ └────────────┘ GND |
7. Örnek 5 — Asimetrik Kare Dalga (%25-%75 Duty Cycle)
Problem
P1.1’de: 100 µs HIGH, 300 µs LOW olan dalga üret.
Hesaplama
|
1 2 3 4 5 6 7 8 9 10 |
t_HIGH = 100 µs: N = 100 × 10⁻⁶ / 90.4 × 10⁻⁹ ≈ 1106 N_girilen_HIGH = 65536 - 1106 = 64430 = FBEEh TH_HIGH = FBh, TL_HIGH = EEh t_LOW = 300 µs: N = 300 × 10⁻⁶ / 90.4 × 10⁻⁹ ≈ 3319 N_girilen_LOW = 65536 - 3319 = 62217 = F309h TH_LOW = F3h, TL_LOW = 09h |
Assembly Kodu
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
; ================================================ ; ÖRNEK 5: Asimetrik Kare Dalga ; HIGH: 100 µs | LOW: 300 µs | T0, Mod1 ; ================================================ ORG 0000h MOV TMOD, #01h ; T0, Mod1, Zamanlayıcı DONGU: ; --- HIGH KISIM: 100 µs --- SETB P1.1 ; P1.1 HIGH yap MOV TL0, #0EEh ; 100 µs TL MOV TH0, #0FBh ; 100 µs TH SETB TR0 BEKLE_H: JNB TF0, BEKLE_H CLR TF0 CLR TR0 ; --- LOW KISIM: 300 µs --- CLR P1.1 ; P1.1 LOW yap MOV TL0, #09h ; 300 µs TL MOV TH0, #0F3h ; 300 µs TH SETB TR0 BEKLE_L: JNB TF0, BEKLE_L CLR TF0 CLR TR0 SJMP DONGU ; Tekrar END |
Dalga Şekli
|
1 2 3 4 5 |
P1.1 ____ ________ ____ ________ | | | | | | | | | |_____| |_____| |_____| | →100←→────300 µs────→100←→────300 µs────→ |
8. Örnek 6 — Mod 2 (8-bit Otomatik Yükleme)
Ne Zaman Mod 2 Kullanılır?
Mod 2, kısa ve sürekli tekrarlayan gecikmeler için idealdir. Özellikle baud rate üretimi için standart seçimdir.
Mod 2 Özellikleri
|
1 2 3 4 5 |
- Yalnızca TLi kullanılır (0–255 arası sayar) - TLi taştığında, THi'deki değer otomatik olarak TLi'ye yüklenir - Manuel yeniden yükleme GEREKMEZ - Maksimum süre: 256 × 90.4 ns ≈ 23.14 µs |
Problem
Timer 0, Mod 2 ile 200 µs gecikme üret. (Uyarı: 200 µs > 23.14 µs → Mod 2’de sığmaz, döngü kullanılmalı!)
📌 Bu tuzakıtır! Mod 2’de tek turda sadece ~23 µs beklenebilir.
Mod 2 İçin Gerçekçi Örnek: 20 µs Gecikme
|
1 2 3 4 5 6 7 |
20 µs için: N_sayma = 20 × 10⁻⁶ / 90.4 × 10⁻⁹ ≈ 221 N_girilen = 256 - 221 = 35 = 23h TL0 = 23h (başlangıç değeri) TH0 = 23h (otomatik yükleme kaynağı — AYNI değer!) TMOD = 02h |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
; ================================================ ; ÖRNEK 6a: Mod 2 — 20 µs Tek Gecikme ; ================================================ ORG 0000h MOV TMOD, #02h ; T0, Mod2, Zamanlayıcı MOV TH0, #23h ; Otomatik yükleme değeri MOV TL0, #23h ; Başlangıç değeri (TH ile aynı!) SETB TR0 ; Timer başlat BEKLE: JNB TF0, BEKLE CLR TF0 ; Bayrak temizle (TR0 devam eder!) CLR TR0 ; Dur END |
⚠️ Kritik fark: Mod 2’de
CLR TR0yapmazsanız timer OTOMATIK devam eder! Bu, baud rate üretimi için istenen davranışdır ama tek gecikme için durdurulmalıdır.
Mod 2 Baud Rate Örneği (9600 bps)
Bu, sınavlarda ve gerçek projelerde en çok kullanılan Mod 2 uygulamasıdır:
|
1 2 3 4 5 6 |
Baud Rate = f_osc / (32 × 12 × (256 - TH1)) 9600 = 11059200 / (32 × 12 × (256 - TH1)) 256 - TH1 = 11059200 / (32 × 12 × 9600) 256 - TH1 = 3 TH1 = 253 = FDh |
|
1 2 3 4 5 6 7 8 9 10 11 |
; ================================================ ; ÖRNEK 6b: 9600 Baud Rate için Mod 2 Kurulum ; Timer1, Mod2 ; ================================================ MOV TMOD, #20h ; T1, Mod2, Zamanlayıcı (0010 0000) MOV TH1, #0FDh ; 9600 baud için MOV TL1, #0FDh ; Başlangıç = TH ile aynı MOV SCON, #50h ; Seri port Mode1, REN=1 SETB TR1 ; Timer1 başlat (baud üretimi başlar) |
9. Örnek 7 — Sayıcı Modu (Harici Darbe Sayma)
Sayıcı Modunun Mantığı
|
1 2 3 4 5 6 7 8 |
C/T̄ = 1 yapılırsa → Timer, dahili saati değil dış pinden gelen darbeleri sayar. Timer 0 için dış pin: P3.4 (T0) Timer 1 için dış pin: P3.5 (T1) Her 1→0 geçişinde sayma değeri 1 artar. |
Problem
P3.4 (T0) pinine bağlı butondan 5 darbe gelince P1.0’ı HIGH yap.
Hesaplama
|
1 2 3 4 |
5 darbe sayılacak → N_girilen = 65536 - 5 = 65531 = FFFBh TH0 = FFh, TL0 = FBh TMOD = 05h (T0, Mod1, Sayıcı: C/T̄=1 → bit2=1 → 0000 0101) |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
; ================================================ ; ÖRNEK 7: Sayıcı Modu — 5 Darbe Sayma ; T0, Mod1, Sayıcı | Pin: P3.4 ; ================================================ ORG 0000h SETB P3.4 ; P3.4'ü giriş yap (HIGH = hazır) MOV TMOD, #05h ; T0, Mod1, SAYICI (C/T̄=1 → 05h) MOV TL0, #0FBh ; 5 darbe için: 65536-5=65531=FFFBh MOV TH0, #0FFh SETB TR0 ; Sayıcıyı başlat BEKLE: JNB TF0, BEKLE ; 5. darbe gelene kadar bekle CLR TF0 CLR TR0 SETB P1.0 ; 5 darbe geldi → P1.0 HIGH SJMP $ ; Dur END |
TMOD = 05h Nasıl Hesaplandı?
|
1 2 3 4 5 6 7 8 |
Bit: 7 6 5 4 3 2 1 0 GATE1 C/T̄1 M1 M0 GATE0 C/T̄0 M1 M0 0 0 0 0 0 1 0 1 → 00000101b = 05h ✓ ↑ C/T̄0=1 → Sayıcı modu |
Donanım Bağlantısı
|
1 2 3 4 5 6 7 8 9 10 11 |
8051/ADUC841 ┌────────────┐ BUTON────┤ P3.4 (T0) │ │ │ LED────┤ P1.0 │ └────────────┘ Buton Devresi: VCC ──── Buton ──── P3.4 ──── 10kΩ ──── GND (Butona basınca P3.4 LOW olur → 1→0 geçişi → sayma +1) |
💡 Buton debounce (titreme) sorunu: Gerçek uygulamada mekanik butonlar tek basışta 5-50 kez “zıplar”. Sınavlarda bu genellikle ideal sinyal olarak kabul edilir.
10. Örnek 8 — İki Timer’ı Aynı Anda Kullanma
Problem
- Timer 0: P1.0’da 200 µs periyotlu kare dalga üret
- Timer 1: P1.1’de 800 µs periyotlu kare dalga üret
(Her iki timer bağımsız çalışır)
Hesaplama
|
1 2 3 4 5 6 7 8 |
T0 → 100 µs ON / 100 µs OFF (200 µs periyot): N_girilen_T0 = 65536 - (100µs / 90.4ns) = 65536 - 1106 = 64430 = FBEEh T1 → 400 µs ON / 400 µs OFF (800 µs periyot): N_girilen_T1 = 65536 - (400µs / 90.4ns) = 65536 - 4425 = 61111 = EEF7h TMOD = 11h (T0 Mod1 + T1 Mod1 → 0001 0001 = 11h) |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
; ================================================ ; ÖRNEK 8: İki Timer Aynı Anda ; T0 → 200µs periyot | T1 → 800µs periyot ; TMOD = 11h ; ================================================ ORG 0000h MOV TMOD, #11h ; T0 ve T1 → her ikisi Mod1 ANA: ; === TIMER 0 KONTROLÜ (P1.0, 100 µs yarı periyot) === JNB TF0, SKIP_T0 ; TF0 set değilse atla CLR TF0 ; Bayrağı temizle CLR TR0 ; Durdur MOV TL0, #0EEh ; Yeniden yükle MOV TH0, #0FBh SETB TR0 ; Tekrar başlat CPL P1.0 ; P1.0 tersle SKIP_T0: ; === TIMER 1 KONTROLÜ (P1.1, 400 µs yarı periyot) === JNB TF1, SKIP_T1 ; TF1 set değilse atla CLR TF1 CLR TR1 MOV TL1, #0F7h ; 400 µs için: EEF7h → TL=F7h MOV TH1, #0EEh ; → TH=EEh SETB TR1 CPL P1.1 ; P1.1 tersle SKIP_T1: ; İlk başlatma (yalnızca bir kez çalışır) ; Not: Gerçekte bu kod başa alınmalı, burada sadeleştirme için gösterildi SJMP ANA END |
Düzgün Yapı (Başlatma + Döngü Ayrı)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
ORG 0000h ; ── İlk kurulum ── MOV TMOD, #11h MOV TL0, #0EEh | MOV TH0, #0FBh | SETB TR0 MOV TL1, #0F7h | MOV TH1, #0EEh | SETB TR1 ; ── Ana döngü ── ANA: JNB TF0, T0_BITTI CLR TF0 MOV TL0, #0EEh MOV TH0, #0FBh CPL P1.0 T0_BITTI: JNB TF1, T1_BITTI CLR TF1 MOV TL1, #0F7h MOV TH1, #0EEh CPL P1.1 T1_BITTI: SJMP ANA END |
11. Örnek 9 — Alt Program Yapısıyla Gecikme (Temiz Kod Yapısı)
Problem
P1 portundaki 8 LED’i sırayla yak (knight rider efekti), her geçişte 100 ms bekle.
Hesaplama
|
1 2 3 4 5 6 7 |
100 ms gecikme: t_max = 5.92 ms → Döngü gerekir Temel: 5 ms → 100/5 = 20 döngü 5 ms için: N_girilen = 10226 = 27F2h TH0 = 27h, TL0 = F2h |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
; ================================================ ; ÖRNEK 9: Knight Rider LED Efekti ; P1 ← 8 LED, her adım 100 ms bekle ; ================================================ ORG 0000h BASLA: MOV A, #01h ; Başlangıç: P1.0 yanık SOL_GIT: MOV P1, A ; LED'i yak LCALL GEC_100MS ; 100 ms bekle RL A ; Sola kaydır (01→02→04→...→80) JNB ACC.7, SOL_GIT ; A'nın 7. biti 0 ise devam (henüz 80h olmadı) SAG_GIT: MOV P1, A LCALL GEC_100MS RR A ; Sağa kaydır (80→40→20→...→01) JNB ACC.0, SAG_GIT ; A'nın 0. biti 0 ise devam SJMP SOL_GIT ; Başa dön ; ============================================ ; 100 ms GECİKME ALT PROGRAMI ; 5 ms × 20 = 100 ms ; ============================================ GEC_100MS: MOV R7, #20 ; 20 döngü × 5 ms = 100 ms YEN_DONGU: MOV TMOD, #01h MOV TL0, #0F2h MOV TH0, #27h SETB TR0 BKL: JNB TF0, BKL CLR TF0 CLR TR0 DJNZ R7, YEN_DONGU RET END |
Donanım Bağlantısı
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
8051/ADUC841 ┌────────────┐ LED7─┤ P1.7 │ LED6─┤ P1.6 │──── Her pine 220Ω direnç + LED LED5─┤ P1.5 │──── ve GND bağlantısı LED4─┤ P1.4 │ LED3─┤ P1.3 │ LED2─┤ P1.2 │ LED1─┤ P1.1 │ LED0─┤ P1.0 │ └────────────┘ 8 LED için standart bağlantı: P1.x ──── 220Ω ──── LED(+) ──── LED(-) ──── GND |
RL ve RR Komutlarının Çalışması
|
1 2 3 4 5 6 7 8 9 |
Başlangıç A = 0000 0001 (P1.0 yanar) RL A A = 0000 0010 (P1.1 yanar) RL A A = 0000 0100 (P1.2 yanar) ... RL A A = 1000 0000 (P1.7 yanar) → ACC.7=1, sol durdu RR A A = 0100 0000 (P1.6 yanar) ... RR A A = 0000 0001 (P1.0 yanar) → ACC.0=1, sağ durdu |
12. Örnek 10 — Donanımsal Start/Stop (GATE=1)
GATE Bitinin Kullanımı
GATE=1 yapıldığında, zamanlayıcı yalnızca TR=1 VE INT pini HIGH olduğunda çalışır. Bu, harici bir sinyal ile timer’ı kontrol etmeye yarar (örn. bir olayın süresini ölçmek).
|
1 2 3 |
Timer 0 için: GATE0=1 → TR0=1 ve P3.2 (INT0) = HIGH olmalı Timer 1 için: GATE1=1 → TR1=1 ve P3.3 (INT1) = HIGH olmalı |
Problem
P3.2 (INT0) pinindeki bir sinyalin yüksek süresini ölç. Timer 0, Mod 1 kullan. (Sinyal genişliği < 5.92 ms)
|
1 2 3 4 5 |
TMOD = 09h (T0, Mod1, Zamanlayıcı, GATE=1) 0000 1001b = 09h ↑ GATE0=1 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
; ================================================ ; ÖRNEK 10: GATE ile Sinyal Süresi Ölçümü ; TMOD = 09h | T0, Mod1, GATE=1 ; ================================================ ORG 0000h MOV TMOD, #09h ; T0, Mod1, Zamanlayıcı, GATE=1 MOV TL0, #00h ; Sıfırdan başla MOV TH0, #00h SETB TR0 ; TR0=1 (INT0 HIGH olunca timer başlayacak) ; P3.2 (INT0) HIGH olduğunda timer otomatik çalışır ; P3.2 LOW olduğunda timer otomatik durur ; INT0 sinyalinin bitmesini bekle BEKLE_YUKSEK: JNB P3.2, BEKLE_YUKSEK ; P3.2 LOW ise bekle (henüz başlamadı) BEKLE_DUSUK: JB P3.2, BEKLE_DUSUK ; P3.2 HIGH ise bekle (sinyal bitmedi) ; Sinyal bitti, süreyi oku MOV R6, TL0 ; Düşük byte'ı kaydet MOV R7, TH0 ; Yüksek byte'ı kaydet CLR TR0 ; R7:R6 çifti ölçülen süreyi makine çevrimi cinsinden tutar ; Süre (sn) = R7:R6 × 90.4 ns SJMP $ END |
13. Soru Çözüm Kalıpları
Bu bölüm, sınavda karşılaşacağınız soru tiplerini ve çözüm kalıplarını gösterir.
Kalıp 1: “X µs / ms gecikme üret” Sorusu
Şablon:
|
1 2 3 4 5 6 7 8 |
; TMOD hesapla (genelde 01h) ; N_girilen hesapla ; TH ve TL'ye yükle ; SETB TR0 ; JNB TF0, BEKLE ; CLR TF0 ; CLR TR0 |
Aklınızda tutun:
- t_sayma ≤ 5.92 ms → Döngüsüz (tek tur)
- t_sayma > 5.92 ms →
MOV R7, #döngü_sayısı+DJNZ R7, ETIKET
Kalıp 2: “Kare dalga üret” Sorusu
Şablon:
|
1 2 3 4 |
; Periyodun yarısını hesapla ; CPL Px.y komutunu ana döngüde kullan ; Her CPL sonrasında yarı periyot kadar bekle |
Kalıp 3: “X darbe say” Sorusu (Sayıcı modu)
Şablon:
|
1 2 3 4 5 |
; TMOD'da C/T̄ = 1 yap (sayıcı modu) ; N_girilen = 65536 - X ; SETB P3.4 (giriş pini HIGH yap) ; Geri kalanı zamanlayıcı gibi |
Kalıp 4: “Mod 2 kullan” Sorusu
Şablon:
|
1 2 3 4 |
; TMOD = 02h (T0) veya 20h (T1) ; TH0 = TL0 = N_girilen (256 - N_sayma) ; TR0 otomatik devam eder → manuel yeniden yükleme yok |
Yapılan Yaygın Hatalar
| Hata | Doğrusu |
|---|---|
MOV TMOD, #0 sonra bit set etmek |
TMOD bit adreslenemez! Tüm byte yazılır |
| TF temizlemeyi unutmak | Her zaman CLR TF0/TF1 yazılır |
| Mod 2’de TH ile TL’yi farklı yazmak | TH ve TL’ye AYNI değer yazılır |
| 10 ms gecikmede döngüsüz kod | 10 ms > 5.92 ms → döngü şart |
| Sayıcı modunda P3.4’ü giriş yapmamak | SETB P3.4 yazılmalı |
DJNZ R7, X sonrasında R7 başlangıcını unutmak |
Her alt program çağrısında R7 sıfırdan başlamalı |
14. Hızlı Başvuru Kartı
Formüller
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Frekans: 11.0592 MHz → T_osc = 90.4 ns Mod 1 (16-bit): t_max = 65536 × 90.4 ns ≈ 5.92 ms N_sayma = t_istenen / 90.4 ns N_girilen = 65536 - N_sayma TH = N_girilen >> 8 (yüksek byte) TL = N_girilen & FFh (düşük byte) Mod 2 (8-bit): t_max = 256 × 90.4 ns ≈ 23.14 µs N_sayma = t_istenen / 90.4 ns N_girilen = 256 - N_sayma TH = TL = N_girilen ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |
TMOD Şifre Tablosu
|
1 2 3 4 5 6 7 |
Alt nibble (Timer 0): Üst nibble (Timer 1): Mod0 = x001 Mod0 = 0001xxxx Mod1 = x001 → 01h Mod1 = 0001xxxx → 10h Mod2 = x010 → 02h Mod2 = 0010xxxx → 20h Sayıcı Mod1 = 05h Sayıcı Mod1 T1 = 50h GATE+Mod1 = 09h |
Kritik Komutlar
|
1 2 3 4 5 6 7 8 9 |
SETB TR0 ; Timer 0 başlat CLR TR0 ; Timer 0 durdur CLR TF0 ; Timer 0 bayrağını temizle JNB TF0, x ; TF0 = 0 iken x'e git (bekle) JB TF0, x ; TF0 = 1 iken x'e git CPL P1.0 ; P1.0'ı tersle SETB P3.4 ; P3.4'ü giriş için HIGH yap DJNZ R7, x ; R7'yi azalt, ≠0 ise x'e git |
Gecikme Değerleri (11.0592 MHz, Mod1, T0)
|
1 2 3 4 5 6 7 8 9 10 |
100 µs → TH0=FBh, TL0=EEh 250 µs → TH0=F5h, TL0=33h 500 µs → TH0=EAh, TL0=65h 1 ms → TH0=D4h, TL0=CAh 5 ms → TH0=27h, TL0=F2h 50 ms → 5 ms × 10 döngü 100 ms → 5 ms × 20 döngü 500 ms → 5 ms × 100 döngü 1 sn → 5 ms × 200 döngü |
15. Bonus: 12 MHz Kristal ile Hesaplama Farkı
bazen 12 MHz kristal verilir. Değerler değişir!
|
1 2 3 4 5 6 7 8 9 10 11 |
12 MHz → T_makine = 1 µs (standart 8051) 0.0833 µs (ADUC841) Standart 8051 için (T_makine = 1 µs): t_max (Mod1) = 65536 × 1 µs = 65.536 ms 1 ms gecikme, 12 MHz 8051: N_sayma = 1000 µs / 1 µs = 1000 N_girilen = 65536 - 1000 = 64536 = FC18h TH0 = FCh, TL0 = 18h |
🔑 ipucu: Soru 12 MHz veriyorsa T_makine = 1 µs hesapla. Soru 11.0592 MHz veriyorsa T_osc = 90.4 ns kullan.
Bu makale, SAÜ EEM 304 ders videoları, ders notları (s.108–118) ve sınav deneyimlerine dayanarak hazırlanmıştır. Tüm örnekler ADUC841 / 8051 Assembly dili ile yazılmıştır.


