Elektronik / Mikrodenetleyici Projeleri/

AT89S52 ADC0808 ile Renk Algılayıcı Devresi

Sponsorlu Bağlantılar

Bu renk algılayıcı okuyacağınız yüzeye LDR yi yaklaştırdığınızda yüzeyin rengini kırmızı, sarı, mavi olarak okur. Farklı yüzeydeki yüzeylerin kırmızı, sarı ve mavi ışıkları farklı olarak yansıtmalarını dayanak alarak çalışır. Yüzeyden yansıyacak ışıkları göndermek için 3 led,bu ledlerin verdiği direnç değerini okumak için LDR, okunan ledin hangisi olduğunu görmek için LCD, LCD nin parlaklık ayarını yapmak için potansiyometre ve farklı değerlerde dirençler, AT89S52 mikrodenetleyici ve ADC den oluşmaktadır.

LDR den alınan analog bilgiyi dijital bilgiye çevirmek için ADC0808 analog dijital çevirici entegresi kullandım.Bu projeyi dahili ADC özelliği olmayan bir mikrodenetleyici ile yaptım.Aynı devre dahili ADC si olan bir denetleyici ile daha kolay bir şekilde yapılabilirdi.

Renk Algılayıcı Devre Şeması
rekn algılayıcı devre seması

Kullanılan Elemanlar

  • 3x Ultra bright led
  • 3×220 ohm direnç
  • 820 ohm direnç
  • 1k direnç
  • LDR
  • AT89S52 mikrodenetleyici
  • 2satır 16 karakter LCD
  • 2x20p,1x10pf kondansatör
  • 12MHz chryristal
  • 10k potansiyometre
  • L7805 entegre
  • ADC 0808

Devrenin Çalışması

Devrede mikrodenetleyicinin 18 ve 19. uçarına XT osilator bağlı. Osilator denetleyicinin in çalışması için gerekli palsi üretiyor.Devrede işığı ölçülmek istenen ledler direkt kaynağa bağlı. Adc 0808 in çıkışları mic.denetleyicinin P1 Portuna bağlı. ADC0808 in analog girişine gelen dijital bilgi 8 bitlik sayısal değere döniştürüldükten sonra P1 portuna aktarılıyor.Bu sayısal değerler programda işleme tabi tutulduktan sonra lcd ye hangi rengin algılandığı gönderiliyor.

Proteusta çizilen devrede LDR olmadığı LDR yerine lineer potansiyometre kullanıldı. ADC 0808 in IN7(analog giriş ucu) ucuna gelen voltajın sayısal değere dönüştürülmesi işlemi de şu şekilde yapılır;

ADC sonuçta dijital bir eleman olduğu için portlarında birim zamanda sadece 1 ve 0 bilgisini üretir..

Yani 0-5v arsındaki değerlere duyarlıdır diyemeyiz. ADC gelen bilgiyi 0-255 arasında bir değere dönüştürür ve gelen bilginin 256 birim çözünürlüğü olur.Bu uygulama için 8 bitlik adc yeterlidir.

Örnek olarak adc ucuna 2.1 volt verilirse bu porttan okunacak değer 107-108 gibi bir sayı olacaktır (2.1*256/5).

LDR nin aldığı direnç değerlerine göre ADC ucuna gelen voltaj değerleri, sayısal değerlere bu şekilde dönüştürüldü.

Ölçülen değerlere göre ADC ucuna gelen voltajların sayısal karşılığı bu aralıklarda seçildi.

kalt=36,kust=60; malt=64,must=88; salt=114,sust=152(kalt=kırmızı alt sınırı, kust=kırmızı üst sınırı).

Keil Program Kodu

Aşağıdaki programda lcd.h başlık dosyası kullanılarak mikro denetleyicinin hangi portlarının lcd ye bağlanacağı tanımlandı. Aynı zamanda lcd yi kontrol etmek için bu dosyanın içinde gerekli fonksiyonlar tanımlandı. Programın içindeki değişkenlerde define komutu kullanılarak programın başlangıcında tanımlandı.

Program çalışmaya başladığında while(1) sonsuz döngüsünün içine giriyor.P3 veri değişkeni olarak tanımlandı ve P1 pruna gelen bilgi veri değişkeninin içine atılıyor.Start=1;start=0; komutlarıyla ADC 0808 in çevrime başlaması sağlanıyor. ADC çevrime başlayınca IN7 analog ucuna gelen analog gerilim değerini 8 bitlik sayısal değere çeviriyor.

Bu değer P1 portuna yani veri değişkeninde tutuluyor.Veri değişkenindeki if döngüsünde işleme girdikten sonra hangi değer aralığında ise o aralığa tekabul eden renk ismi lcd ye gönderiliyor. ADC 0808 in çevireme girmesi 10 nolu ucuna bağlı olan osilator sayesinde sağlanıyor. Programda EOC ucu lojik 1 olduğunda Oe yetkilendiriliyor ve analog giriş şıkışa sayısal olarak aktarılıyor.

#include 
#include "lcd.h"
 #include 
 #define  veri   P3
 #define  start  P2_3
 #define  EOC    P2_4
 #define  OE     P2_5
 void main (void)
 {
  lcdac();
  Komut(sil);
  veri=0xFF;
  while(1)
  { 
   Komut(128);
   Veridizi("taranan renk:",0);
	
	
		

   start=1;    // Çevrime basla
   start=0;

   while(!EOC)
  {;}
   			
   OE=1; 
   			  		
    Komut(192);
				
     if(veri>36 && veri<60)
			   		        Veridizi("kirmizi      ",100);
				 
else if(veri>64 && veri<88)
				 	
Veridizi("mavi        ",100);
				   	  
					 
else if(veri>114 && veri<152)
				 
 Veridizi("sari        ",100);
				
  else
	Veridizi("hatali olcum",100);		
					
				   
	    		
OE=0;  }  }

Devrede kullanılan elemanların özellikleri

Bu uygulamada paralel lcd modeli olan HD++/(= kullandım.

Pin 1'ye VSS denir ve GND' ye gitmeye yarar.

Pin 2'ye VDD denir ve +5V'luk güç destek pinidir.

Pin 3'e VLC denir ve potentiometer bağlanarak parlaklık için karar vermeye yarar.

Pin 4'e RS denir ve ekranın instructions ya da data'yı getirmesi bu pine bağlıdır.

Pin 5'e R/W denir ve LCD'nin sending ya da receiving yaptığını denetler.

Pin 6'e Enable denir. Bu alçaktan yükseğe ya da tekrar alçağa gittiğinde LCD 4,5 ya da 7-14 okur.

Pin 7-14 pinleri data bus line'dır ve DB0-DB7 olarak adlandırılır. Bunlar LCD'ye ana data bitlerini gönderirler ve ekranda nereye ne yazıldığını denetlerler.

Pin 15 ve 16 pinleri yalnızca ekran üzerindeki arka ışığı, +5V 'u ve pin 15 ile +5V arasındaki 3.8 Ohm'la GND'ye karşılık gelir.

LCD ye karakter veya değer göndermek için gerekli başlık dosyası

#define sil 1
#define basadon 2
#define solayaz	 4
#define sagayaz	 6
#define imlecgizle 12
#define imlecyanson	 15
#define imlecgeri 16
#define kaydirsaga 24
#define kaydirsola 28
#define ekranikapat 8
#define birincisatir 128
#define ikincisatir 192
#define karakuretadres 64
#define ciftsatir8bit 56
#define ciftsatir4bit 48
#define teksatir8bit 40
#define teksatir4bit 32
#define Data P1
#define RS P2_2
#define RW P2_1
#define EN P2_0
void gecikme(long int sure)
{
long int i;
for (i=1;i<=sure;i++){;
  }
}
void lcdhazir(){
Data=0xFF;
RS=0;
RW=1;
EN=1;
gecikme(200);
while(Data&0x7F==0x80);
 }
 void Komut(int komut){
 lcdhazir();
 RS=0;
 RW=0;
 EN=1;
 Data=komut;
 EN=0;
 gecikme(1000);
 }
 void Veri(char veri,long int hiz){
 lcdhazir();
 RS=1;
 RW=0;
 EN=1;
 Data=veri;
 EN=0;
 gecikme(hiz);
 }
 void Veridizi(char veri[],long int hiz){
 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){
 Komut(imlecgizle);
 Komut(ciftsatir8bit);
 Komut(sagayaz);
 }

Bir adc nin en önemli özelliği bit çözünürülüğüdür.Bit çözünürlüğü analok bir değerin kaç bitle ifade edildiğini gösterir.8 bitlik bir adc analog girişi 256 parçaya böler , yani örnekler.

8 bitlik bir adc de her adımın büyüklüğü 5/256=0.01953125 şeklindedir.Bu değer 00000000 sayısal değerine karşılık gelir.sayısal değerin her 1 bit artışında bu değer toplana toplana artar.

Analog girişimize 5 volt geldiğinde (eğer besleme kaynağımız tam 5 volt ise) çıkıştan 128 decimal dedeğeri yani 11111111 sayısal değeri alınır. Bunun yarısı 2.5 volt girişe uygulandığında çıkıştan 128 yani 10000000 değeri alınır.

Benim kullandığım entgrede 8 analog giriş 8 dijital çıkış var.Hangi anlog girişin seçileceği ADDa,ADDB ,ADDC uçları ile seçiliyor.Vref(+) ucuna örneklenecek gerilimin maksimum değeri ,Vref(-) ucunada örneklenecek gerilimin minumum değeri uygulanır.Start, OE ve EOC uçları ADC nin kontrol uçlarıdır.

ADc nin çevirimi gerçekleştirebilmesi için yapılması gerkenler:

  • Normalde lojik 0 olan start ucuna kısa süreli lojik 1 gönderiliyor.
  • Kulaanılacak analog kanal seçimi aypılır.
  • EOc ucu analog işaretin sayısal çevirimi süresince lojik o , çevirim bittiğinde lojik 1 değerindedir, bu nedenle çevirim bitene kadar (EOC=1) olana kadar beklemelidir.
  • EOC nin 1 olması ile normalde lojik 0 seviyesinde olan OE ucu kısa bir süreliğine lojik 1 e kurulmalıdir. Busayede çevirim bilgisinin dijital çıkışa aktarılması sağlanır.

Projeyi Hazırlayan: Hakan Böyün Projenin Dosyaları AT89S52 ADC0808 ile Renk Algılayıcı Devresi

Dosya indirme LINK listesi (HTML formatında) link-3590.zip şifre-pass: 320volt.com
Emeği geçen Kişilere Teşekkürler

  • fırat

    değerli emektar burada 2 tane program var acaba bunların 2 sini birleştirip mi kulancaz yoksa 1. program yeterli mi
    saygılar

    • Amacınız sadece devreyi yapıp kullanmak ise dosya içindeki .hex yazılımını AT89S52 denetleyicisine yüklemeniz yeterli

      Ana kod ilk olan ikincisi derleme sırasında yanında durmalı diye biliyorum dikkat ederseniz ilk kodda “include “lcd.h” ile lcd başlık dosyası ile edilmiş

      ek olarak http://320volt.com/isis-basit-devre-kurulumu-keil-c-yazilim-hex-derleme video işinize yarayabilir

  • FIRAT

    değerli emektar ilginize teşekkür ediyorum.malzeme listesinde L7805 entegrasi mevcut olup şemada yeri yoktur bu entegre nereye takılacak.ayrıca ldr nereye yerleştireceğimi bilemedim projenin özetinde,ldr isiste olmadığı için potansiyometre kullanılmış,devrede yalnış var mı bana yardımcı olabilirmisiniz

  • Ömer Kıran

    değerli kardeşim 7805 5V regülatör entegerisidir devreden ayrı kurulacak çok basit bi devre bu entegre sadece devreye gerekli olan 5V elde etmek için kullanılır.

  • Ömer Kıran

    yalnız fırat kardeşim benim bir sorum olacaktı bu AT89S52 nin kaç adet analog giriş ve çıkışı var ?