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
Yorum Gönder