
8051 mikrodenetleyici ile aşağı yukarı sayıcı devresi
26.03.2021 tarihinde güncellenen 02.02.2009 tarihinde yayımlanan 8051 mikrodenetleyici ile aşağı yukarı sayıcı devresi ile 2758 yazısı var. Yazar gevv
8051 ile AŞAĞI YUKARI SAYICI
Bu devrenin temel prensibi tuş takımından girilen sayıya göre aşağı veya yukarı sayma yapmasıdır. Aşağı sayma yapabilmesi için tuş takımından # basılması ve yukarı sayma yapabilmesi için ise * basılması gerekir.
8051 programlanırken dikkat edilmesi gereken hususlar tuş takımının algılanması, TIMER doğru şekilde kullanılmasıdır.
Devrede Kullanılan Elemanlar
- At89c81RC2 (1 adet)
- 7447 (BCD den 7 Segment dönüşüm sürücüsü) (2 adet)
- 7 Segment Display (2 adet)
- Tuş Takımı (1 adet)
- 330ohm (14 adet)
- 8.2Kohm (1 adet)
- 22pF (2 adet)
- 10uF (1 adet)
- XTAL 12MHz (1 adet)
Kullanılan Elemanlara Ait Bacak Bağlantıları
7447 entegresine ait bacak bağlantısı
Ortak Anod 7 Segment Display bacak bağlantısı
Keil Programın Kodları
#include#define segment P1 // Onlar basamağına ait çıkış #define KLAV P2 // Tuş takımı int birler_basamagi,onlar_basamagi,kare_tusu; int girilen_sayi,onlar_basamagi; int tekrar ; bit say; int o; void tarama() interrupt 1 // Her 1msn'de kesme oluşur (Gösterge taramasının oluşturulması) { TH0=0xFC; TL0=0x17; // 1 msn için yükleme P3=birler_basamagi; segment=onlar_basamagi; } void sure() interrupt 3 { // Her 50 msn'de kesme oluşur. 1 sn'lik süre elde etmek için int sayac; TH1=0x3C; TL0=0xAF; //50 msn için yükleme sayac++; if (sayac==20)// 50msn x 20 = 1 sn değeri için { sayac=0; if (o==11) //# tuşuna basılmış ise { tekrar--; if (tekrar>=0) { //Aşağı sayma işlemi if(birler_basamagi==0) { birler_basamagi=9; if(onlar_basamagi==0) onlar_basamagi=9; else onlar_basamagi--; } else birler_basamagi--; } else { // 0'a ulaşıldı ise TR1=0; // T1 zamanlayıcısını durdur girilen_sayi=0; // Bir sonraki giriş için sayıyı sıfırla } } else if (o==10)//* tuşuna basılmış ise { tekrar++; if (tekrar<=99) { // Yukarı sayma işlemi if(birler_basamagi==9) { birler_basamagi=0; if(onlar_basamagi==9) onlar_basamagi=0; else onlar_basamagi++; } else birler_basamagi++; } else { // 99'a ulaşıldı ise TR1=0; // T1 zamanlayıcısını durdur girilen_sayi=0; // Bir sonraki giriş için sayıyı sıfırla } } } } unsigned char klavyeOku(void) { // Keypad'ten girilen sayının tespiti unsigned char i = 0; unsigned char x = 0; /*Sırasıyla Birinci,ikinci ve üçüncü sütuna sıfır göndermek için gerekli tablo */ unsigned tablo[] = {0x7f,0xbf,0xdf}; KLAV = 0x0F; // Satırların hepsi 1 while((KLAV & 0x0F) == 0x0F) // Bir tuşa basılana kadar dön ; for(i=0; i < 3;i++) { KLAV = tablo[i]; // Sütunlara sırasıyla sıfır gönder x = KLAV & 0x0F; // Satırların tespiti için son dört // bitin elde edilmesi switch(x) { case 7: // D satırı aktif (*, 0 veya # tuşlarından biri) { while((KLAV & 0x0F) != 0x0F);//Buton bırakılana kadar dön if (i==1) // Basılan Tuş 0 ise { return 0; //Sıfır değerini gönder } else if(i==0) { say=1; // Sayma işleminin yetkilendirilmesi return 10; //* tuşuna basıldığında 10 değerini gönder } else if(i==2) { say=1; // Sayma işleminin yetkilendirilmesi return 11; //# tuşuna basıldığında 11 değerini gönder } } break; case 11: // C satırı aktif (7, 8 veya 9 tuşlarından biri) { while((KLAV & 0x0F) != 0x0F);//Buton bırakılana kadar dön return 7+i; // (i'ye göre 7,8 veya 9 değerini gönder) } break; case 13: // B satırı aktif (4, 5 veya 6 tuşlarından biri) { while((KLAV & 0x0F) != 0x0F);//Buton bırakılana kadar dön return 4+i; // (i'ye göre 4,5 veya 6 değerini gönder) } break; case 14: // A satırı aktif (1, 2 veya 3 tuşlarından biri) { while((KLAV & 0x0F) != 0x0F);//Buton bırakılana kadar dön return 1+i; // (i'ye göre 1,2 veya 3 değerini gönder) } break; } } } void main(void) { TMOD=0x11; // T0 16-bit zamanlayıcı,T1 16-bit zamanlayıcı TH0=0xFC; // Gösterge tarama frekansı için 1000 (1 msn) TL0=0x18; // 65536-1000=64536 Hex karşılığı 0xFC18 TH1=0x3C; // 1 sn'lik süre elde etmek için 50000x20 saymalı TL1=0xB0; // 65536-50000=15536 Hex karşılığı 0x3CB0 ET0=1; // T0 kesmesinin yetkilendirilmesi ET1=1; // T1 kesmesinin yetkilendirilmesi TR0=1; // T0'ın çalıştırılması EA=1; // Bütün kesmelerin yetkilendirilmesi while(1) { onlar_basamagi=klavyeOku(); // Keypadden onlar basamağını gir birler_basamagi=klavyeOku();//Keypadden birler basamağını gir girilen_sayi=(10*onlar_basamagi)+birler_basamagi; // sayı kare_tusu=klavyeOku(); // # yada * tuşlarının tespiti o=kare_tusu; if (kare_tusu==11 && say==1 || kare_tusu==10) { // * veya # tuşuna basıldı ise TR1=1; //T1 i çalıştır say=0; //Sayma yetkilendirmeyi sıfırla tekrar=girilen_sayi; } } }
Hazırlayan: Erkan ÇAĞLAR
keil kod ve proteus simülasyon Dosya indirme LINK listesi (TXT formatında) link-5453.zip şifre-pass: 320volt.com
4 lü display devresi yapmak istiyorum ama programsız şemesını gönderebilirmisiniz tabi 7447 entegresi ile
okul içinmi istiyorsun bu devreyi