Elektronik / Mikrodenetleyici Projeleri/

8051 ile A-D Çeviricili Lcd Göstergeli Voltmetre

Sponsorlu Bağlantılar

ADC çevirici Yapısı:
Dış dünyadaki fiziksel büyüklüklerin çok büyük bir kısmı analog değerlerdir. Örneğin ısı, sıcaklık, ağırlık, nem oranı, ışık şiddeti, ses şiddeti vs. gibi büyüklükler hep analog olarak değişirler. Dijital sistemlerin dış dünya ile bağlantılarını sağlamak için; ölçülen fiziksel büyüklüklerin dijital sistemin anlayabileceği sayısal değerlere dönüştürülmeleri gerekir.

Analog gerilim büyüklüklerinin belli gerilim aralıklarıyla temsil edilen lojik 1 veya 0 değerlerine dönüştürülmeleri gerekir. İşte bu işi yapan sistemlere ‘Analog-Dijital Çevirici’ler (Analog-Digital Converter, ADC) denir.

Analog-Dijital çeviricilerde bulunan en önemli kavram “bit çözünürlüğü”dür.Bit çözünürlüğü analog bir işaretin kaç tane bit ile ifade edildiğini gösterir.

Diğer bir deyişle işaretin kaç bit ile örneklendiğidir.ADC’nin bit çözünürlüğü ne kadar fazla olursa analog işareti örnekleme doğruluğu/duyarlılığı da o kadar artar. 8-bitlik bir ADC ,maksimum 28=256 adet farklı değer ile bir analog işareti örnekleyebilmektedir.ADC’nin örnekleyeceği işaretin maksimum 5v ise her bir adım büyüklüğü şöyle bulunabilir: Adım Büyüklüğü= Örneklenecek Maksimum Büyüklük


ADC 0808 Tüm devresi

ADC 0808 analog/ sayısal çeviricisinin 8 adet analog giriş (IN0-IN7) ve 8 bitlik sayısal çıkış (OUT0-OUT7) bulunmaktadır.Çevirici hangi girişin çevrilerek sayısal çıkışlara aktarılacağını 3 bitlik ADD A ,ADD B ve ADD C adres uçlarına göre karar vermektedir. ADC 0808’in çalışabilmesi için saat (Clock) ucuna yaklaşık frekans değerleri 10 Khz-1280 Khz arasında olan saat işareti uygulanmalıdır.Vref (+) ucu örneklenecek analog işaretin maksimum genliğini Vref (-) ise örneklenecek işaretin minimum değerini belirtmek için kullanılmaktadır.Uygulamalarda Vref (-) genellikle toprağa bağlanır.START,OE (Output Enable) ve EOC (End of Conversion) uçları ADC 0808’in kontrol uçlarıdır.

Bir ADC ‘nin analog /dijital çevrimi gerçekleştirmesi yapılması gerekli işlemler şunlardır:

Normalde lojik ‘0’ olan START ucuna Şekil 4.2 ‘de görüldügü gibi ,kısa süreliğine lojik ‘1’ gönderilmelidir.

Birden fazla kanal (anlog giriş) kullanılacaksa kanal seçimi için gerekli adres bilgisi ADD A,ADD B,ADD C uçlarına gönderilmelidir.

EOC ucu analog işaretin sayısala çevrimi süresince lojik ‘0’, çevrim bittiğinde ise lojik ‘1’ değerindedir;bu nedenle çevrim bitene (EOC=1 olana ) kadar beklenmelidir.

EOC=1 olması ile birlikte normalde lojik ‘0’ seviyesinde olan OE ucu kısa bir süreliğine lojik ‘1’ e kurulmalı ve bu sayede çevrim bilgisinin dijital çıkışlara ulaşması sağlanmalıdır.

Keil µVision2 yazılımı :
Günümüzde MCS-51 ailesi mikrodenetleyicileri için standart geliştirme yazılımı haline gelmiştir.Projede kaynak kod yazımı ve Hex kod dönüşümü yapılmıştır.Yazılan kodların hatalarının tespiti ve ayıklanması sağlanmıştır.

Keil µVision2 yazılımı ile Proje Dosyasının Oluşturulması:

Proje menüsünden New Projeckt sekmesi ile yeni bir proje dosyası oluşturulabilir.

Projeyi yeni bir klasör açılarak saklaması sağlanarak uygulama için gerekli mikrodenetleyici nin seçilmesi gerekir.ATMEL ailesi altında bulunan AT89C51 mikrodenetleyicisi seçilmiştir.

File menüsünden New sekmesi ile boş sayfaya projenin kaynak kodu C dili ile yazılarak .c
uzantılı olarak saklanmıştır.

C uzantılı olarak kaydedilen kaynak kod dosyasının derlenmesi yapılmıştır.Bunun için Project penceresi altındaki ,Target1 sekmesi altındaki Source Group 1 seçeneğindeyken farenin sağ tuşunun tıklanması ile Add Files to Group ‘Source Group 1’ seçilmelidir.

Programın Hex uzantılı makine kodunun oluşturulması için Option for Target ‘Target1’
Penceresi içindeki Output sekmesinde bulunan ‘Creat Hex File’ kontrol kutusunun işaretlenmesi gereklidir.

AT89C51 mikrodenetleyicisinde bulunan genel özellikler şunlardır:

  • MCS-51 ailesi mikrodenetleyicileri ile uyumlu
  • 4 Kbyt yeniden programlanabilir flash bellek
  • 1000 kez yeniden yazma silme
  • 4V-5,5V çalışma gerilimi
  • 0-20Mhz çalışma frekansı
  • 3 düzeyli kod koruma
  • 128×8-bit dahili ram
  • 32 adet G/Ç pini
  • 2 adet 16-bit zamanlayıcı/sayıcı
  • 8 kesme kaynağı
  • Seri haberleşme arabirimi
  • Düşük güç tüketim modları(uyuma,boşta)

8051 Mikrodenetleyicisinin Uç Fonksiyonları

Projede kullanılan elemanlar:

  • AT89C51 mikrodenetleyicisi
  • ADC 0808
  • LCD ekran LM020L
  • 22pf kondansatör 2adet
  • 10uf kondansatör
  • 8.2K direnç
  • 12Mhz kristal
  • 1K Potansiyometre

Devre Şeması

Projenin C dili ile kaynak kodu

/***********************************************/
 /*	PROJE ADI:ADC iLE VOLTMETRE		 /*
 /*	ADI SOYAD:EBRU AĞIRCAN		             /*
 /*	NO       :010303047					 /*
 /* BÖLÜM    :ELEKTRONİK ÖGR.			 /*
 /***********************************************/
  
  #include                // işlemci başlık dosyası
  #include "lcd.h"                            //  lcd başlık dosyası
  #include                         //  C dili başlık dosyası
  #define  veri   P3                           //  ADC çıkışlarına bağlı port 
  #define  start  P2_7                       //  Çevrimin başladığı uç
  #define  EOC    P2_6                    //  Çevrimin sonlandığı uç
  #define  OE     P2_5                      //  ADC’nin çıkışının yetkilendirildiği uç
  char olcum[15];
  float hesaplanan_gerilim;	 // Okunan değere göre hesaplanan Analog gerilim
  float	adim_degeri;	 // ADC’nin bir adımı
  int maks_gerilim=5;                     // ADC’nin örnekleyeceği maksimum değer
  int bit_sayisi=256;	// ADC’nin örnekleme sayısı 
 
  void main (void)
  
  {	 lcdac();	// Lcd açılış işlemleri 
             Komut(sil);
             veri=0xFF;                         // P1’i giriş olarak ayarla
            
             /* ADC adım Büyüklügünün Hesaplanması*/
             adim_degeri=(float)maks_gerilim/bit_sayisi;
	
             Veridizi("OLCUM=",1000);
	
            while(1)
	{  
	   start=1;	// Çevrime başla
	   start=0;                     
	   while(!EOC);           // Çevrim Bitene kadar dön

           	   OE=1;                      // Çıkışı yetkilendir
                /*P1’den okunan dijital değerin analog karşılığını hesapla*/
	   hesaplanan_gerilim=veri*adim_degeri;
	   OE=0;                                                            // Çıkışı pasif yap
	  
               sprintf(olcum,"%.2f",hesaplanan_gerilim); // Hesaplanan gerilimi  lcd ‘ye yazdır
	   Veridizi(olcum,3000);
     
	 }
	 }

Projenin Lcd Başlık Dosyası:

#include <89c51rd2.H>
/*LCD’de kulanılan komutların tanımlanması*/
		
#define sil 1	// Ekranı temizler
#define basadon 2	//imleci sol üst köşeye getir
#define solayaz	4	// imlecin belirttiği adres azalarak gider
#define sagayaz	6	// imlecin belirttiği adres artarak gider
#define imlecgizle 12	// Göstergeyi aç,kürsör görünmesin
#define imlecyanson	15	// Yanıp sönen blok kürsör
#define imlecgeri 16	//  kürsörü bir karakter geri kaydır 
#define kaydirsaga 24	// göstergeyi bir karakter sağa kaydır
#define kaydirsola 28	// göstergeyi bir karakter sola kaydır 
#define ekranikapat 8	//  göstergeyi kapat
#define birincisatir 128	// Lcd’nin ilk satır başlangıç adresi
#define ikincisatir 192	// ikinci satır başlangıç adresi
#define karakuretadres 64	// karakter üreteci adresini belirle

/*LCD’de Kullanılan fonksiyon seçimi*/
#define ciftsatir8bit 56	// 8-bit ara birim,2 satır ,5*7 piksel
#define ciftsatir4bit 48	// 8-bit ara birim,1 satır ,5*7 piksel
#define teksatir8bit 40	// 4-bit ara birim,2 satır ,5*7 piksel
#define teksatir4bit 32	// 4-bit ara birim,1 satır ,5*7 piksel

/*LCD Girişlerinin Tanımlanması*/ 
#define Data P1
#define RS P2_2
#define RW P2_1
#define EN P2_0

/*LCD Gecikme Fonksiyonu*/
void gecikme(long int sure){
long int i;
for (i=1;i<=sure;i++){;
  }
}
void lcdhazir(){	 //LCD hazır olana kadar bekle Fonksiyonu
Data=0xFF;
RS=0;
RW=1;
EN=1;
gecikme(200);
while(Data&0x7F==0x80);
 }
 void Komut(int komut){  // LCD ‘ye komut yazdırma fonksiyonu
 lcdhazir();
 RS=0;
 RW=0;
 EN=1;
 Data=komut;
 EN=0;
 gecikme(1000);
 }
 void Veri(char veri,long int hiz){	//LCD’ye tek bir komut yazdırma fonksiyonu
 lcdhazir();
 RS=1;
 RW=0;
 EN=1;
 Data=veri;
 EN=0;
 gecikme(hiz);
 }
 void Veridizi(char veri[],long int hiz){ // LCD’ye Karakter Dizisi Yazdırma Fonksiyonu
 int i=0;
 while(veri[i]!=0){
 lcdhazir();
 RS=1;
 RW=0;
 EN=1;
 Data=veri[i];
 EN=0;
 i++;
 gecikme(hiz);
  }
 }
 void lcdac(void){ // LCD başlangıç ayarlarını yapan Fonksiyon

 Komut(imlecgizle);
 Komut(128+5);
 Komut(birincisatir);
 Komut(sagayaz);
 }

Hazırlayan: Ebru Ağırcan Projenin Kaynak Dosyaları 8051 ile A-D Çeviricili Lcd Göstergeli Voltmetre

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

Emeği geçen Kişilere Teşekkürler

  • yusuf

    hex kaynak dosyası yok.ayrıca c dilinde yazılmış kodları hex e dönüştürmek istedim keil de hata verdi.bakarsanız sevinirim.

  • ted

    guzel bir calisma ancak lcd.h kutuphanesi verilmemis ne yazik ki.ve proteusta potansiyometre hata veriyor

  • haci tümay

    hoca hex dosyası çalışmıyor.. keil hata veriyor.