8051 ile Lcd Göstergeli Kronometre Devresi

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
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)
{}
}
}
}

11/11/2008 7:23 pm
valla kardesım sagol ayrıcada ellerıne saglık gercekten iyi emek etmişsin bizede senin emeğini işleyerek seni mutlu etmek düşer:):)