Elektronik / Mikrodenetleyici Projeleri/

Termometreli saatli masaüstü kimlik kartı ccs pic16f877

Sponsorlu Bağlantılar

Hazırlayan: Murat ATLIHAN KOCAELİ ÜNİVERSİTESİ MEKATRONİK MÜHENDİSLİĞİ – Devre PIC16F877 üzerine kurulu yazılımı CCS C ile hazırlanmış değişik bir uygulama. Emeği geçen hazırlayan kişilere teşekkürler

Proje Tanıtım: Bu projede amaçladığımız bir kimlik kartı tasarlamaktır. Ayrıca bu kimlik kartına saat ve termometre de ekleyerek daha güzel bir görünüme kavuşturulmuştur. Kişi hem istediği zaman saati, haftanın gününü, tarihi ve sıcaklığı bu kimliğe bakarak öğrenebilir. Ayrıca bu kimliğe son olarak kişiyi tanıtan bilgiler de eklenerek masaüstü kimlik kartı tasarlanmıştır. Ayrıca kullanıcı istediği zaman devredeki fan sayesinde ortamı soğutabilir.

16f877-lcd-fan-devre-ccs

Bu projede kullanılan araç-gereçler:

  • Pic16F877
  • DS1302 Dijital saat entegresi
  • DS18b20 Sıcaklık sensörü
  • Fan
  • Led
  • Bazır
  • 3 adet buton
  • BC237 transistör
  • 5V DC Röle
  • 32,768 KHz ve 4 MHz kristal
  • 3V yassı pil
  • Anahtar
  • 1 adet 10K ve 1K potansiyometre
  • 3 adet 10K, 1 adet 5K, 1 adet 470 ohm ve 1 adet 300 ohm
  • 2 adet 22 pf kondansatör

Pic16F877: PIC 16F87X ve 16F8X serisi öncelikle, PIC 16CXX ailesinin özelliklerini taşır. PIC 16CXX’de Harvard mimarisi kullanılmıştır. Von Neuman mimarisinde, veri ve program belleğine aynı yoldan erişilebilirken, bu mimaride program belleği ve veri belleğine erişim farklı boylarda yapılır. Veri yolu (databus) 8 bit genişliğindedir. Aynı anda, veri belleğine 8 bit genişliğindeki bu yolla erişilirken; program belleğine program yolu ya da adres yolu (program bus / adress bus) denilen 14 bit genişliğindeki diğer bir yolla erişilir.

Bunun için PIC 16F87X ve PIC 16F84’de komut kodları (opcode), 14 bittir. 14 bitlik program belleğinin her bir adresi, bir komut koduna (Instruction Code / Instruction Word) karşılık gelir. Dolayısıyla her komuta bir çevrim süresinde (cycle) erişilir ve komut kaydedicisine yüklenir. Komut kaydedicisi, CPU tarafından kullanılan bir kaydedicidir ve dallanma komutları dışındaki bütün komutlar, aynı çevrim süresinde çalıştırılırlar.

pic16f877a

pic16f877-komut

2X16 LCD: Bilgilerimizi ekranda görmemizi sağlar. Bu LCD 16X2 LCD’dir. Bunun anlamı 16 sütun ve 2 satır demektir. Bilgiler bu iki satırda gösterilir. Ayrıca anot ve katotlara lojik 1 ve 0 verilirse LCD arka ışığı aktif edilir.

lcd

Pin Sembol Açıklama Pin Sembol level Açıklama
1 Vss 0V Toprak 7~14 DB0~DB7 H/L Veri Girişi
2 Vdd +5V Besleme Gerilimi 15 A Arka Işık Anot:+4.2V
3 V0 Keskinlik Ayarı 16 K Arka Işık Katot:0V
4 R/S H/L H: Data

L: Instruction Code

5 R/W H/L H: Bilgi okuma

L: Bilgi Yazma

6 E H,H-L Sinyali aktifler

DS1302: DS1302 Dijital Saat Entegresi Bu entegre dijital saat entegresidir, bacak bağlantıları ve devreye bağlanış şekli aşağıdaki gibidir.

DS1302

1.Vcc2: +5V besleme girişidir.
2.X1: Entegrenin kristal girişidir. Burada 32.768 KHz’lik kristal kullanılır.
3.X2: Entegrenin kristal çıkıdır.
4.GND: Toprak.
5.CE: Bu bit okuma ve yazmada lojik 1 olmalıdır.
6.I/O: Giriş-çıkış pinidir.
7.SCLK: Senkronize bilgi hareketi girişidir.
8.Vcc1: Saatin +5V besleme gerilimi kesildiğinde dahi saati hafızasında tutması için verilmesi gereken gerilimdir. Değeri +3V’tur.

DS18b20: Sıcaklık Sensörüdür. Dijital termometrelerde kullanılır.

ds18b20

DS18b20 bacak bağlantıları

1. Toprak
2. Çıkış
3. Besleme +5V

Fan,Led,Bazır,Buton: Bu elemanlar standart bildiğimiz elemanlardır.

fan-led-bazir-buton

BC237: BC237 transistörü devrede anahtarlama yapmak için kullanılır.

DC Röle: Röle de transistör gibi anahtaralama elemanı olarak kullanılır.

Kristal:Kristaller devrede osilatör olarak kullanılırlar ve genelde bacaklarına kapasitelerle birlikte toprağa bağlanırlar.

Yassı Pil ve Anahtar: Pil gerilim sağlamak amacıyla, anahtar ise bu kısa devre edilerek bu gerilimin devre içinde akım üreterek azalmasını sağlar.

Devrenin Proteusta Benzetimi:

isis-devresi

Devrenin CCS C Kodları

#include "16f877.h"
#use delay (clock=4000000)
#fuses NOWDT,XT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#define use_portb_lcd TRUE         //B portu lcd için ayrılıyor
#define RTC_SCLK PIN_c6            //DS1302 için pin tanımlamaları
#define RTC_IO   PIN_c5            //
#define RTC_RST  PIN_c4             //
#include "ds1302.c"               //ds1302 ait fonksiyonlar programa eklenir
#include "lcd.c"                  //lcd ait fonksiyonlar programa eklenir
#include "ds18b20.c"            //ds18b20 ait fonksiyonlar programa eklenir
#include <stdlib.h>            //rnd()fonksiyonunu aktif yapabilmek için ekledik
#include <time.h>  

            //
void yaz(char dizi1[],char dizi2[]);
void yan_son_yaz(char dizi1[],char dizi2[]);
void harf_harf_yaz(char dizi1[],char dizi2[]);
void kayan_yaz(char dizi1[],char dizi2[]);
int eleman_sayisi(char dizi[]);
void ortala(char dizi[],satir);
void efekt_sec(char dizi1,char dizi2,int efekt);
//Global değişkenler
int saniye,dakika,saat,gun,ay,yil,haftanin_gunu,sayi,efekt,j,i,k,rastgele=0; //ds1302 değişkenleri

///PROGRAM
void main(void)
{
float sicaklik;

   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
   set_tris_a(0xFE); 

   lcd_init();  // LCD başlangıç ayarları yapılıyor
   rtc_init();  // DS1302 başlangıç ayarları yapılıyor

   //rtc_set_datetime(18,6,9,5,19,25); // Tarih ve Saat ayarları yapılıyor
   rtc_get_time(saat,dakika,saniye);
   while(1)
   {
      k=0;
      srand(saniye);
      sayi=rand()%5;//0'dan 4'e kadar rastgele sayı atamak için

      if (sayi==0)
      {
      do{
         sicaklik = ds1820_read()/8,0;             // DS1302?den saat,dakika,saniye bilgileri alınıyor
         rtc_get_time(saat,dakika,saniye);         //DS1302?den gün,ay,yil ve günün isim bilgisi alınıyor
         rtc_get_date(gun,ay,yil,haftanin_gunu);   

         printf(lcd_putc,"\f%3.1f%cC  %02d/%02d/%02d\n",sicaklik,223,gun,ay,yil);   //LCD'ye sıcaklık,gün,ay,yıl bilgileri yazdırılıyor

         switch(haftanin_gunu)
         {
            case 1: printf(lcd_putc,"PAZ"); break; // Eğer "1? ise LCD'ye PAZ yaz
            case 2: printf(lcd_putc,"PZT"); break; // Eğer "2? ise LCD'ye PZT yaz
            case 3: printf(lcd_putc,"SAL"); break; // Eğer "3? ise LCD'ye SAL yaz
            case 4: printf(lcd_putc,"CRS"); break; // Eğer "4? ise LCD'ye CRS yaz
            case 5: printf(lcd_putc,"PER"); break; // Eğer "5? ise LCD'ye PER yaz
            case 6: printf(lcd_putc,"CUM"); break; // Eğer "6? ise LCD'ye CUM yaz
            case 7: printf(lcd_putc,"CTS"); break; // Eğer "7? ise LCD'ye CTS yaz
         }
         printf(lcd_putc,"     %02d:%02d:%02d",saat,dakika,saniye);     // LCD'ye saat,dakika ve saniye değerlerini yaz
         delay_ms(100);
         k++;
      }
      while(k<10);
      lcd_putc("\f");
      }
      else if(sayi==1)
      {
      char dizi1[]="MURAT ATLIHAN";
      char dizi2[]="050224020";
         srand(saniye);
         efekt=rand()%4;
         efekt_sec(dizi1,dizi2,efekt);
      }
       else if(sayi==2)
      {
      char dizi1[]="KOCAELI";
      char dizi2[]="UNIVERSITESI";
         srand(saniye);
         efekt=rand()%4;
         efekt_sec(dizi1,dizi2,efekt);
      }
      else if(sayi==3)
      {
      char dizi1[]="MEKATRONIK";
      char dizi2[]="MUHENDISLIGI";
         srand(rastgele);
         efekt=rand()%4;
         efekt_sec(dizi1,dizi2,efekt);
      }
      else if(sayi==4)
      {
      char dizi1[]="DERELI/GIRESUN";
      char dizi2[]="IZMIT/KOCAELI";
         srand(saniye);
         efekt=rand()%4;
         efekt_sec(dizi1,dizi2,efekt);
      }
   if(input(PIN_A1) == 0)
      {
      output_high(PIN_A0);
      delay_ms(50);
      }
   else if(input(PIN_A2) == 0)
      {
      output_low(PIN_A0);
      delay_ms(50);
      }
   }
}

void yaz(char dizi1[],char dizi2[])
{
int N1,N2,satir1,satir2;
   satir1=1;
   N1=eleman_sayisi(dizi1);
   ortala(dizi1,satir1);
   printf(lcd_putc,dizi1);
   satir2=2;
   N2=eleman_sayisi(dizi1);
   ortala(dizi2,satir2);
   printf(lcd_putc,dizi2);
   delay_ms(3000);
   lcd_putc("\f");
}

void yan_son_yaz(char dizi1[],char dizi2[])
{
int N1,N2,satir1,satir2,i;
   N1=eleman_sayisi(dizi1);
   N2=eleman_sayisi(dizi2);
   satir1=1;
   satir2=2;
   for(i=0;i<3;i++)
   {
      ortala(dizi1,satir1);
      printf(lcd_putc,dizi1);
      ortala(dizi2,satir2);
      printf(lcd_putc,dizi2);
      delay_ms(300);
      lcd_putc("\f");
      delay_ms(300);
   }
}

void harf_harf_yaz(char dizi1[],char dizi2[])
{
int N1,N2,satir1,satir2,i;
   lcd_send_byte(0,0x0d);
   N1=eleman_sayisi(dizi1);
   N2=eleman_sayisi(dizi2);
   satir1=1;
   satir2=2;
   ortala(dizi1,satir1);
   for (i=0;i<N1;i++)
   {
      printf(lcd_putc,"%c",dizi1[i]);
      delay_ms(100);
   }
   ortala(dizi2,satir2);
   for (i=0;i<N2;i++)
   {
      printf(lcd_putc,"%c",dizi2[i]);
      delay_ms(100);
   }
   lcd_send_byte(0,0x0C);
   delay_ms(1000);
   lcd_putc("\f");
   }

void kayan_yaz(char dizi1[],char dizi2[])
{
int N1,N2,satir1,satir2,j;
   N1=eleman_sayisi(dizi1);
   satir1=1;
   N2=eleman_sayisi(dizi2);
   satir2=2;

   for (i=0;i<2;i++)
   {
      for(j=0;j<16+N1;j++)
      {
         if (j==N1+16)
         {
         j=0;
         }
         else
         {
         lcd_gotoxy(16-j,satir1);
         printf(lcd_putc,dizi1);
         lcd_gotoxy(16-j+(N1-N2)/2,satir2);
         printf(lcd_putc,dizi2);
         delay_ms(100);
         lcd_putc("\f");
         delay_ms(50);
         }
      }
   }
}

int eleman_sayisi(char dizi[])
{
int i,N=0;
for (i=0;dizi[i]!='\0';i++)
   {
   N++;
   }
   return N;
}

void ortala(char dizi[],satir)
{
int N;
   N=eleman_sayisi(dizi);
   lcd_gotoxy((16-N)/2+1,satir);
}

void efekt_sec(char dizi1,char dizi2,int efekt)
{
switch(efekt)
         {
            case 0: yaz(dizi1,dizi2); break;
            case 1: yan_son_yaz(dizi1,dizi2); break;
            case 2: harf_harf_yaz(dizi1,dizi2); break;
            case 3: kayan_yaz(dizi1,dizi2); break;
         }
}

DS18B20.c:

#define ONE_WIRE_PIN PIN_C7
void onewire_reset()

{
output_low(ONE_WIRE_PIN);
delay_us( 500 ); 		//1-wire resetleme için sıfıra çekilir
output_float(ONE_WIRE_PIN); //1-wire bir yapılır
delay_us( 500 ); 		// sensörün hazırlanması için beklenir.
output_float(ONE_WIRE_PIN);
}

void onewire_write(int data)
{
int count;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); // Sensöre yazma işlemine başlamak için  1-wire sıfıra çekilir.
output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // yazılacak bilgi 1-wire'da
delay_us( 60 ); // Yazma işlemi zamanı doldurulur.
output_float(ONE_WIRE_PIN); // 1-wire bir yapılır,
delay_us( 2 ); // 1us'den fazla beklenir.
}
}

int onewire_read()
{
int count, data;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); //Sensördem okuma işlemi içinl 1-wire sıfıra çekilir.
output_float(ONE_WIRE_PIN); //1-wire bir yapılır,
delay_us( 8 ); // Sensörün kendine gelmesi beklenir,
shift_right(&data,1,input(ONE_WIRE_PIN)); // sonuc bilgisi alınır.
delay_us( 120 ); //Okuma işlemi zamanı doldurulur.
}
return( data );
}

float ds1820_read()
{
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;
onewire_reset();
onewire_write(0xCC);
onewire_write(0x44);
while (busy == 0)
busy = onewire_read();
onewire_reset();
onewire_write(0xCC);
onewire_write(0xBE);
temp1 = onewire_read();
temp2 = onewire_read();
temp3 = make16(temp2, temp1);
result = (float) temp3 / 2.0;
delay_ms(200);
return(result);
}

Projenin Maliyeti:

Malzeme

-Pic16F877 – 10tl
-LCD – 10tl
-DS1302 Dijital saat entegresi – 6tl
-DS18b20 Sıcaklık sensörü – 4tl
-Fan – 5tl
-Led – 0.5tl
-Bazır – 2tl
-3 adet buton – 3 x 1,5=4,5tl
-BC237 transistör – 1tl
-5V DC Röle – 2tl
-32,768 KHz ve 4 MHz kristal – 2,5+2=4,5tl
-3V yassı pil – 3tl
-Anahtar – 2tl
-1 adet 10K ve 1K potansiyometre – 2tl
-3 adet 10K, 1 adet 5K, 1 adet 470 ohm ve 1 adet 300 ohm – 1tl
-2 adet 22 pf kondansatör – 0.5tl

TOPLAM: 58 TL

Projeye ait proteus isis simülasyon dosyası ve ccs c kodları: Termometreli saatli masaüstü kimlik kartı ccs pic16f877

Dosya indirme linkleri (TXT formatında) link-9099.zip şifre-pass: 320volt.com

  • FxDev

    877’de 1 pot tamamen boş, diğer portlarda bir yığın boş noktalar var. Sadece 16f628 ile halledilecek bir proje…
    Yapmak isteyenlere duyurmak istedim…

  • Kaan

    1 Adet 10K ve 1K pot:2TL iyi fiyatmış valla :) toplam 58 Tl ise ben bunu maksimum 35 e alırım.güzel proje sağolun..

  • ömer aydoğan

    Hocam include ettiğiniz ds18b20.c dosyasınıda alabilirmiyim??

  • yazı ve dosyaya eklendi iyi çalışmalar

  • ömer aydoğan

    teşekkür ederim. Bide bu projede saat ayarlaması nasıl yapılıyor yada yapılabiliyor mu??

  • mkilickap

    gevv arkadaşım gerçekten çok güzel açıklayıcı şeyler gönderiyorsun bu arada
    cizgide elektronik animasyonlarınıda izledim.
    Eline sağlık çok açıklayıcı olmuş

  • Abdullah

    Sayın gevv isis te simulasyonda saat tarih göstermiyor. pic.c yi tekrar compile ettiğimde ds18b20 için hata veriyor. Bir de acaba bu devrede 4×20 lcd ve 4×40 lcd (daha uzun metinler için?) kullanmak için ne gibi değişiklikler yapmak lazım?

    • Furkan

      Proje paylaşılalı 7 yıl geçmiş.Fakat benim gibi faydalanacak arkadaşlar yinede vardır.Hatanın çözümü şu.Öncelikle DS18B20 kaynak kodunu açıyorsun.Kaynak kodun başlangıcında ‘DS18B20.c:’ ile başlıyor.Bu yeri sil.Eğer internetten bakarsan ds1b20’nin kaynak kodları bu tanımlama ile başlamıyor.Sonra kaydet ve Program Files/PICC/DRIVERS klasörüne kopyalayıp yapıştır.Sonra ‘Pic’ c kodunu açıp compile dediğinde hatasız bir şekilde çalışıyor.Emeği geçen arkadaşlara teşekkürler ve selamlar.

  • AYTAÇ DÜRGEN

    arkadaşa emeğinden ötürü teşekkür ediyorum. Üniversitemizden birşeylerle uğraşanları ve projelerini görmek gerçekten beni gururlandırıyor.

    Ayrıca bu proje için 16f628a yeterli olur diyen arkadaşım; Bu pic donanımsal olarak onewire sda scl ve sck donanımları mevcut değildir. Evet bir sürü pin ve portları kullanılmamıştır ama 1f6f877 donanımı uygun bir pıc tir.

    Koü tef elektrik 4 örgün.

  • atakan

    hocam bu devrenin baskı devresi nerede