AMAÇ: DENEY 9-A : PIC 16F877 ve LM-35 ile SICAKLIK ÖLÇÜM UYGULAMASI 1- Mikrodenetleyici kullanarak sıcaklık ölçümünü öğrenmek EasyPIC7 setinde LM-35 kullanılarak analog giriş yaptırılması Sıcaklığın LCD de görüntülenmesi GEREKLİ MALZEME 1- EasyPIC7 uygulama seti 2- LM-35 Sıcaklık sensörü 3-2x16 LCD Giriş Sıcaklık ölçümü uygulaması genelde endüstriyel ve medikal alanda uygulama sahası çok olan bir çalışmadır. Sıcaklığın mikrodenetleyici tarafından okunarak yazılan çeşitli programlarla çıkışlarına bağlanan LCD ekranda izlenmesi, sıcaklığın belli bir aralıkta sabit tutulması ya da algılanan sıcaklıkla başka çıkışların kontrol edilmesi gibi birçok uygulama sahası mevcuttur. Sıcaklık ölçüm işlemlerinde pek çok ölçüm sensörü kullanılmakla beraber en basit ve kullanışlı olan modellerden biri LM-35 tir. LM-35 sıcaklık sensörünün uygulamada en çok karşılaşılan kılıf tipi ve bağlantısı Şekil 9.1 de verilmiştir. Şekil 9.1 LM-35 Sıcaklık Sensörü Kılıf yapısı ve Bağlantısı EasyPic 7 Deney seti üzerinde ise sıcaklık ölçüm deneylerinde kullanılmak üzere 1 adet LM-35 ve 1 adet DS1820 sıcaklık sensörü bağlantısı mevcuttur. Denet seti üzerindeki LM-35 sıcaklık sensörüne ilişkin ölçüm devresi Şekil 9.2 de verilmiştir. Set üzerindeki J25 jumper ı yardımıyla sensörden gelen analog bilgi istenirse RE1/AN6 girişine istenirse de RE2/AN7 girişine yönlendirilebilmektedir. 9A-1
Şekil 9.2 EasyPic 7 Deney Seti Üzerinde Analog Sıcaklık Ölçüm Devresi Örnek program: #include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası #fuses XT,NOWDT,NOPROTECT,NOBROWNOUT, NOLVP,NOPUT, NOWRT,NODEBUG,NOCPD #device ADC=10 // 10 bitlik ADC kullanılacağı belirtiliyor. #use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör // frekansı belirtiliyor. #use fast_io(b) //Port yönlendirme komutları B portu için geçerli #include <lcd_easy7.h> // lcd kütüphane dosyası tanıtılıyor unsigned long int bilgi; // İşaretsiz 16 bitlik tam sayı tipinde değişken tan. float voltaj,sicaklik; // ondalıklı tipte değişkenler tanıtılıyor void main ( ) { 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ışı 9A-2
setup_ccp1(ccp_off); setup_ccp2(ccp_off); // CCP1 birimi devre dışı // CCP2 birimi devre dışı set_tris_b(0x00); set_tris_d(0x00); set_tris_e(0x0f); output_d(0x00); // PORTB tamamen çıkış tanıtılıyor. // PORTD tamamen çıkış tanıtılıyor. // PORTE nin ilk 4 biti giriş tanıtılıyor. // PORTD temizleniyor. setup_adc(adc_clock_div_32); setup_adc_ports(all_analog); // ADC clock frekansı fosc/32 //RA0/AN0 girişi analog lcd_init(); // LCD hazırlanıyor set_adc_channel(6); // RE1/AN6 ucundaki sinyal A/D işlemine tabi tutulacak delay_us(20); // Kanal seçiminde sonra bu bekleme süresi verilmelidir printf(lcd_putc,"\fsicaklik="); // LCD'ye yazı yazdırılıyor while(1) // sonsuz döngü { bilgi=read_adc(); // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor voltaj=(0.0048828125*bilgi); // Dijitale çevirme işlemine uğrayan sinyalin // mv olarak gerilimi hesaplanıyor sicaklik=(voltaj*100); // Her 10mV'ta 1 derece artma lcd_gotoxy(1,10); // İmleç 1. satır 10.sütunda printf(lcd_putc,"%5.1f'c",sicaklik); // LCD'ye sıcaklık değeri yazdırılıyor delay_ms(100); // 100 msn gecikme lcd_gotoxy(2,1); // İmleç 2. satır 1. sütunda printf(lcd_putc," Voltaj="); // LCD'ye Voltaj yazdırılıyor lcd_gotoxy(2,10); // İmleç 2. satır 10.sütunda printf(lcd_putc,"%5.2f V",voltaj); // LCD'ye voltaj değeri yazdırılıyor delay_ms(100); // 100 msn gecikme if(sicaklik>24) 9A-3
output_d(0x00); // Eğer sıcaklık>24 ise portd=00000000 if(sicaklik>25) output_d(0x01); // Eğer sıcaklık>25 ise portd=00000001 if(sicaklik>26) output_d(0x03); // Eğer sıcaklık>26 ise portd=00000011 if(sicaklik>27) output_d(0x07); // Eğer sıcaklık>27 ise portd=00000111 if(sicaklik>28) output_d(0x0f); // Eğer sıcaklık>28 ise portd=00001111 if(sicaklik>29) output_d(0x1f); // Eğer sıcaklık>29 ise portd=00011111 if(sicaklik>30) output_d(0x3f); // Eğer sıcaklık>30 ise portd=00111111 if(sicaklik>31) output_d(0x7f); // Eğer sıcaklık>31 ise portd=01111111 if(sicaklik>32) output_d(0xff); // Eğer sıcaklık>32 ise portd=11111111 } } Yukarıdaki program kodu CCS-C ile yazılıp derlendikten sonra EasyPIC7 uygulama setine yüklendiğinde RE1 analog girişine bağlı LM-35 sensörünün okuduğu sıcaklık bilgisi LCD ekranda hem sıcaklık bilgisi olarak hemde okunulan analog değer Voltaj bilgisi olarak gösterilmektedir. Daha sonra ise sensörden okunan sıcaklık değerinin alacağı sayısal bilgiye göre PORTD de bulunan LED ler belirli bir sırayla yakılıp söndürülmektedir. Yöntem 1. EasyPIC 7 anakartı üzerindeki LM35 soketi bölümüne sensörü takıp, JUMPER ını RE1 konumuna getiriniz. 2. EasyPIC 7 üzerinde J17 jumper ını VCC konumuna, SW3.4 Switch ini ve SW4.6 Switch ini ON olarak ayarlayınız. 3. E portunun pull-down olmasına dikkat ediniz. 4. EasyPIC7 ile birlikte gelen LCD yi, kartın gücünü keserek, yerine dikkatlice takınız. 5. EasyPIC 7 kartını, USB kablo ile bilgisayarınıza bağlayın. 6. Yazdığınız programa ait oluşturduğunuz HEX dosyasını mikroprog Suite for PIC programına yükleyiniz. 9A-4
7. MikroProg Suite for PIC programının WRITE komutunu kullanarak bu dosyayı EasyPIC7 anakartı üzerindeki Mikrodenetleyici ye transfer ediniz. Transfer ve doğrulama (Verify) işlemi biter bitmez program işlemeye başlayacaktır. 8. Ekranda oluşan görüntünün parlaklığı ve görünebilir olması için P4 LCD CONTRAST trimpotunu uygun pozisyona getiriniz. ÖDEV LM-35 sıcaklık sensöründen gelen sıcaklık bilgisi LCD ekranda 1. Satırda gösterilecek. Sıcaklık değeri 22 0 C ile 25 0 C arasında ise LCD ekranda 2. Satırda 1.KADEME SOĞUTMA yazarak RD1 de bağlı olan LED i yakacak, eğer sıcaklık değeri 25 0 C ile 28 0 C arasında ise LCD ekranda 2. Satırda 2.KADEME SOĞUTMA yazarak RD2 de bağlı olan LED i yakacak, sıcaklık değeri 28 0 C ile 31 0 C arasında ise LCD ekranda 2. Satırda 3.KADEME SOĞUTMA yazarak RD3 de bağlı olan LED i yakacak programı yazınız. 9A-5