Elektronik / Mikrodenetleyici Projeleri/

8051 mikrodenetleyici ile aşağı yukarı sayıcı devresi

Sponsorlu Bağlantılar

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.

Sayıcı devre şeması
program-denetleyiciler-8051-labaratuar-projesi

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-baglantisi
7447 entegresine ait bacak bağlantısı

ortak-anod-7-segment-display-bacak-baglantisi
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 dosyaları 8051 mikrodenetleyici ile aşağı yukarı sayıcı devresi

Dosya indirme LINK listesi (TXT formatında) link-5453.zip şifre-pass: 320volt.com

  • yusufcan

    4 lü display devresi yapmak istiyorum ama programsız şemesını gönderebilirmisiniz tabi 7447 entegresi ile

  • gorkemsengun

    okul içinmi istiyorsun bu devreyi