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.
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.
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.
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.
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 bacak bağlantıları
1. Toprak
2. Çıkış
3. Besleme +5V
Fan,Led,Bazır,Buton: Bu elemanlar standart bildiğimiz elemanlardır.
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:
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 simülasyon dosyası ve ccs c kod dosyaları;
Şifre-Pass: 320volt.com
Yayım tarihi: 2010/02/09 Etiketler: ccs c projeleri, ccsc, dijital kimlik kartı, DS1302, DS18B20, led uygulamaları, microchip pic projeleri, PIC16F877 örnekleri, Termometre
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…
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..
Hocam include ettiğiniz ds18b20.c dosyasınıda alabilirmiyim??
yazı ve dosyaya eklendi iyi çalışmalar
teşekkür ederim. Bide bu projede saat ayarlaması nasıl yapılıyor yada yapılabiliyor mu??
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ş
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?
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.
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.
hocam bu devrenin baskı devresi nerede
HOCAM SAATİ NASIL AYARLIYORUZ DEVREDE ÇOK GÜZEL OLMUŞ ELİNİZE SAĞLIK….