8051 mikro denetleyici ile lcd göstergeli kronometre

Hazırlayan: Caner ALTAŞ Projenin Dosyaları 8051-kronometre-devresi Emeği geçen Kişilere Teşekkürler

Devre Tasarımında Kullanılan Yöntemler
Devre tasarımında, ne yapılacağına karar verildikten sonra, maliyeti en düşük ve zamandan en fazla tasarruf sağlayacak yöntemler tercih etmek yada aramak gerekir. Çağımız bilim ve teknolojinin belki at başı koştuğu bir zamana ev sahipliği yapmasından dolayı bu alanda da alternatifler bolca bulunuyor.

Belki önceden olsa, devremizin çalışmasını deneme işlemleri bizim için çok zahmetli ve maliyetli olabilirdi. Fakat şimdi “Gerçek Zamanlı Olmayan” yöntemlerle bu sorun neredeyse çoğu devre tasarımında yolumuzu aydınlatıyor. Günümüzde yaygın olarak kullanılan “Devre Tasarım Programları” zahmeti ve maliyeti en aza indiriyor. Örneğin; Elektronik Workbench, MultiSim, Proteus vb. bilgisayar programları bu konuda hayatımızı kolaylaştırırken; Boardmaker, Ultiboard, Ares vb. programlarda baskı devre çizimlerinde büyük rahatlıklar sağlıyor.

Ben de proje devresini Proteus adlı simülasyon programıyla tasarladım. Bu program kişiye sanal bir laboratuar ortamı sağlıyor. Devre plaket üzerine aktarılmadan önce 8051’in çalıştırılmasına kadar denenebiliyor ve kontrol edilebiliyor.Her türlü laboratuar ortamının sağlanmasının yanı sıra, belki de en rahatlatıcı yanlarından birisi de hataların düzeltilmesi mali bir sorun teşkil etmiyor

Kronometre Açık Devre Şeması
mikrodenetleyici kontrollu kronometre devresi

Programın Yazılması Kullanılan Programlar:
8051 entegresinin programlanması adına kullanılan çok fazla derleyici program mevcut durumda. Size kalan yalnızca sizin için kullanımı en kolay ve en avantajlı olanı seçmek. 8051 programlanabilmesi için olan derleyicilerin en gelişmiş olanları şüphesiz KEIL Uvısıon2 olduğunu düşünüyorum.

Ben de en işime yarayanı ve kolay olanı tercih ederek, projenin hazırlanmasında KEIL kullandım. Sonuçları da gayet mükemmel diyebilirim. Aslında doğrudan ASSEMBLY komutlarıyla da aynı işlemler yapılabilirdi.KEIL gibi derleyicilerin programın yazımına rahatlıklar sağlamasının yanında, en büyük avantajlarının derlenmiş/makine koduna çevrilmiş programın (.HEX) genelde, bellekte, ASSEMBLY kodlarla yazılanlardan daha az yer işgal etmesi ve daha kontrollü çalışması diyebilirim.

8051 Kronometre Uygulamasının C programı

#include <89c51rd2.H>
#include<stdio.h>
#include<math.h>

#define dt   P1
#define RS   P2_7
#define RW   P2_6
#define EN   P2_5
#define b0	 P2_0
#define b1	 P0_1
#define b2   P0_2
#define b3   P0_3

int sls,sn,dk,st,x;

void say (void) interrupt 5 //Timer kesmesi//
	{
	x=1;
	TF2=0;
	TH2=0xD8;  //1 salise için gerekli bayrak değerleri D8EF-FFFF//
	TL2=0xEF;
	sls++;
	if(sls>99)
		{
		sls=0;
		sn++;
		if(sn>59)
			{
			sn=0;
			dk++;
			if(dk>59)
				{
				dk=0;
				st++;
				if (st>23) {st=0;}
				}
			}
		}
	}
void bekle (long int sure)//lcd için gereken zaman gecikmesi//
   {
   long int i;
      for (i=1;i<=sure;i++)
	  {;}
   }
void datakomut (int komut) //lcd için komut fonksiyonu
   {
     RS=0;
	 RW=0;
	 EN=1;
	 dt=komut;
	 EN=0;
	 bekle(1);
	}
void dataveri (char veri[],long int hiz)//char veri yazmak için
   {
    int i=0;
	while(veri [i]!=0)
	   {
	   RS=1;
	   RW=0;
	   EN=1;
	   dt=veri[i];
	   EN=0;
	   i++;
	   bekle(hiz);
	   }
	}
void intveri ( int inte ,long int hiz)//integer veri yazmak için//
   {
       RS=1;
	   RW=0;
	   EN=1;
	   dt=inte;
	   EN=0;
	   bekle(hiz);
	}
int kbul (int a,int b)//kalan bulmak için
{
int c;
while (a>=b)
	{
	a=a-b;
	}
	c=a;
return (c);
}
void lcd(void)//lcd başlangic ayarlari
     {
	  int baslangic[]={12,56,6},t;
	  for (t=0;t<2;t++) datakomut(baslangic[t]);
	  }
void ekran(void)//değerler lcd ye yaziliyor
{
int a,b,d;
datakomut(2);
dataveri(" ",1);

a=kbul(st,10);//saat in küçük hanesi
d=st-a;//saatin sağ tarafini sifirladim
b=d/10;//saatin büyük hanesini buldum
intveri(b+48,1);//ascii kodu için//
intveri(a+48,1);

a=kbul(dk,10);
d=dk-a;
b=d/10;
dataveri(":",1);
intveri(b+48,1);
intveri(a+48,1);

a=kbul(sn,10);
d=sn-a;
b=d/10;
dataveri(":",1);
intveri(b+48,1);
intveri(a+48,1);

a=kbul(sls,10);
d=sls-a;
b=d/10;
dataveri(":",1);
intveri(b+48,1);
intveri(a+48,1);
}
void main (void)
{
int e,i,k;
i=0;
k=0;
e=1;
b0=1;
lcd();
datakomut(1);
T2CON = 0x80;
ET2 = 1;//timer kesmesi aktif
TR2 = 0;
EA = 1;
st=0;
dk=0;
sn=0;
sls=0;
    TH2=0xD8;
	TL2=0xEF;
	while(1)
	{
	 if(e==1)
		{
		while(x)
			{
			ekran();
			x=0; //kesmeden sonra ekranın yazılması için
			}
		}
		while(b1)// buton bire bak (reset)
		{
		st=0;
		dk=0;
		sn=0;
		sls=0;
		TR2=0;
		i=0;//en son hangi tusa basildigini anlamak için
		datakomut(192);
		dataveri("SAYAC RESETLENDI ",1);
		ekran();
		while(b1) {}
		}
		while(b3)//buton 3 e bak (basla dur)
		{
		if(i==0)
			{
			TR2=1;
			e=1;
			i=1;
        datakomut(192);//alt satırın başlangıc adresi
		dataveri("SAYMA BASLADI    ",1);
			}
		else
			{
			TR2=0;
			e=0;
			i=0;
			datakomut(192);
		    dataveri("SAYMA DURDU   ",1);
			}
		 while(b3)
			{}
		}
	while(b2)//buton 2 ye bak ekrani durdur
		{
		if(k==0)
			{
			TR2=1;
			e=0;
			k=1;
			datakomut(192);
			dataveri("EKRAN DURDU    ",1);
			}
		else
			{
			TR2=1;
			e=1;
			k=0;
			datakomut(192);
			dataveri("TEKRAR SAYIYOR     ",1);
			}
		while(b2)
			{}
		}
	}
}