PIC16F877 LCD GÖSTERGELİ SICAKLIK TAKİP DEVRESİ

PIC16F877 LCD GÖSTERGELİ SICAKLIK TAKİP DEVRESİ

Öncelikle bu yazımı okuyan herkese selamlarımı sunuyorum. Bir önceki yazımda Arduino UNO kullanarak “Kuluçka Sıcaklık ve Nem Takip Sistemi” adlı bir proje yapmıştım. Şimdi ise sizlere bir önceki projemin çalışma mantığını kullanarak ve PIC16F877A mikrodenetleyici ile meydana getirdiğim bir uygulamadan bahsetmek istiyorum. 

Günümüzde birçok alanda en yaygın olarak kullanılan mikrodenetleyicilerden biri olan PIC16F877A’yı kullanarak yaptığım bu uygulamada lcd ekranda LM35 sıcaklık sensöründen aldığım değerleri gösterdim ve bu sıcaklık değer aralıklarının dışarısına çıktığında çeşitli uyarılar vermesini sağladım.


Kullandığım mikrodenetleyici için derleyici olarak CCS S programını kullandım. Simülasyon için ise Proteus programından yardım aldım.


KULLANDIĞIM MALZEMELER

PIC16F877A
                  LM35 sıcaklık sensörü
      2*16 LCD ekran
  Katod display
        10K ayarlı direnç
           22 pF kondansatör
                8 MHz kristal osilatör
           Kırmızı ve Mavi led


CCS S de derlediğim kodu Proteus simülasyon programı yardımıyla simule ettiğim devredeki PIC16F877A’ya yükledim. Elde ettiğim sonuçların ekran görüntüleri ile kendi kurduğum devrenin fotoğraflarını aşağıda paylaştım.









DEVRENİN KODLARI

#include <16f877a.h>
#device ADC=10;
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=8000000)


#use fast_io(e)
#use fast_io(d)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)

#define use_portb_lcd TRUE

#include<lcd.c>

const int digit2[2]={0x76, 0x38};


int i,k;
int a,b;
unsigned long int bilgi;
float voltaj,sicaklik;

void main()
{
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
  

   set_tris_d(0x00);
   set_tris_c(0x00);
   set_tris_a(0x01);
   set_tris_b(0x00);
   set_tris_e(0x00);
   output_d(0x00);
   output_c(0x00);
   
  
   setup_adc(adc_clock_div_32); //ADC çalışma frekansı Fosc/32
   setup_adc_ports(ALL_ANALOG); //Denetleyicide A/D çevrimi için ayrilan tüm pin'lerin analog giris için kullanılacağını belirtir.
  
   lcd_init();
  
   set_adc_channel(0); //RA0/AN0 ucundaki sinyal A/D işlemine tabi tutulacak.
   delay_us(20);
  


 while(1)
   {
    
     bilgi=read_adc();
     voltaj=(0.0048828125*bilgi);
     sicaklik=(voltaj*100);
   
    
          i=sicaklik;
  
    
     if(i<26)
    {
   
      printf (lcd_putc, "\fsicaklik ");
      delay_ms(5);
      printf (lcd_putc, "\nnormalin altinda ");
      delay_ms(5);
  
  
    for(a=0;a<=3;a++)
   {
     output_d(0x01);
     delay_ms(200);
     output_d(0x02);
     delay_ms(200);
     output_d(0x04);
     delay_ms(200);
    }
   
     output_c(digit2[1]);
     delay_ms(500);
   
   
    }
    
   
         if( i == 26 )
     {
        
       output_c(0x00);
       delay_ms(5);
       output_d(0x00);
       delay_ms(5);
    
      printf (lcd_putc, "\f  sicaklik 26 ");
      delay_ms(5);
      printf (lcd_putc, "\n  derece ");
      delay_ms(5);
   
           }


          if(  i == 27 )
     {
        
        
       output_c(0x00);
       delay_ms(5);
       output_d(0x00);
       delay_ms(5);
      
      printf (lcd_putc, "\f  sicaklik 27 ");
      delay_ms(5);
      printf (lcd_putc, "\n  derece ");
      delay_ms(5);
      
       }
    
 
       if( i == 28 )
     {
       
       output_c(0x00);
       delay_ms(5);
       output_d(0x00);
       delay_ms(5);
     
      printf (lcd_putc, "\f  sicaklik 28 ");
      delay_ms(5);
      printf (lcd_putc, "\n  derece ");
      delay_ms(5);
     
     }
    
   
       if( i == 29 )
     {
     
       output_c(0x00);
       delay_ms(5);
       output_d(0x00);
       delay_ms(5);
      
      printf (lcd_putc, "\f  sicaklik 29 ");
      delay_ms(5);
      printf (lcd_putc, "\n  derece ");
      delay_ms(5);
      
    }
    
   if( i == 30 )
     {
       
       output_c(0x00);
       delay_ms(5);
       output_d(0x00);
       delay_ms(5);
      
      printf (lcd_putc, "\f  sicaklik 30 ");
      delay_ms(5);
      printf (lcd_putc, "\n  derece ");
      delay_ms(5);
   
     }
    
  if( i == 31 )
     {
       
       output_c(0x00);
       delay_ms(5);
       output_d(0x00);
       delay_ms(5);
      
      printf (lcd_putc, "\f  sicaklik 31 ");
      delay_ms(5);
      printf (lcd_putc, "\n  derece ");
      delay_ms(5);
        
     }
    
 
      if( i == 32 )
     {
       
       output_c(0x00);
       delay_ms(5);
       output_d(0x00);
       delay_ms(5);
     
      printf (lcd_putc, "\f  sicaklik 32 ");
      delay_ms(5);
      printf (lcd_putc, "\n  derece ");
      delay_ms(5);
   
     }

       if (i>32)
    {
   
      printf (lcd_putc, "\fsicaklik ");
      delay_ms(5);
      printf (lcd_putc, "\nnormalin ustunde ");
      delay_ms(5);
    
     for(b=0;b<=3;b++)
   {
     output_d(0x08);
     delay_ms(200);
     output_d(0x10);
     delay_ms(200);
     output_d(0x20);
     delay_ms(200);
    }
   
     output_c(digit2[0]);
     delay_ms(500);
    
     }
}
}






Yorumlar