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 Emeği geçen hazırlayan kişilere teşekkürler.
Keil kod ve proteus simülasyon;
Şifre-Pass: 320volt.com
Yayım tarihi: 2009/02/02 Etiketler: 7 segment display, 7447 entegresi, 8051, atmel avr projeleri, keil, Mikro Denetleyici, ortak anod, sayıcı devresi
4 lü display devresi yapmak istiyorum ama programsız şemesını gönderebilirmisiniz tabi 7447 entegresi ile
okul içinmi istiyorsun bu devreyi