PIC ile Termometre Devresi

Katılım
21 Nis 2010
Mesajlar
1
Puanları
1
Yaş
35
pic ile termometre devresi dönem ödevim . şemanız vb. lazım.
 
ds18b20 yada lm35 diye araştır oldukça fazla devre ve sema bulursun ds ler digital çıkış verir lm35 den analog çıkış alırsın tam olarak nasıl bir şey yapmak istiyorsan ona göre seçim yap 7 segment yada lcd display demi gösterim olacak
 
ya bu devrenin şemasini malzeme listesini felan nasi bulacagiz
 
pic programı bu
----------------------------------------------------------------------

/******************************************************
PIC16F877 ile LM35 Sıcaklık Sensörü Uygulaması
PIC PROG/DEKA : Port B jumper'ı LCD konumunda olmalı
*******************************************************/
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#device ADC=10 // 10 bitlik ADC kullanılacağı belirtiliyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(a) //Port yönlendirme komutları A portu için geçerli

#define use_portb_lcd TRUE // LCD B portuna bağlı

#include <lcd.c> // lcd.c dosyası tanıtılıyor

unsigned long int bilgi; // İşaretsiz 16 bitlik tam sayı tipinde değişken tanımlanıyor
float voltaj,sicaklik; // ondalıklı tipte değişkenler tanıtılıyor

//********** ANA PROGRAM FONKSİYONU*******

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ışı
setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

set_tris_a(0x01); // RA0 Giriş olarak yönlendiriliyor

setup_adc(adc_clock_div_32); // ADC clock frekansı fosc/32
setup_adc_ports(AN0); //RA0/AN0 girişi analog

lcd_init(); // LCD hazır hale getiriliyor

set_adc_channel(0); // RA0/AN0 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)*1000; // Dijitale çevirme işlemine uğrayan sinyalin mV olarak gerilimi hesaplanıyor
sicaklik=(voltaj/10)+2; // Her 10mV'ta 1 derece artma

lcd_gotoxy(10,1); // İ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
// Gösterilecek ondalıklı değerin toplam basamak sayısı 5 olacak.
// Gösterilecek değerin ondalıklı kısmı ise 1 basamak olacak. %5.1f
// komutu ile bu işlemler yaptırılmıştır.
delay_ms(100); // 100 msn gecikme
}
}
 
sicaklik=(voltaj/10)+2; // Her 10mV'ta 1 derece artma
Burada +2 eklediğimizde sıfır derecede 2 gösteriyor. Acaba oradaki +2 değerinin amacı nedir? Açıklayabilir misiniz
 
bu tür hazır istemlere çok karşı birisi olarak sana çalışan bir termometre ve saat devresi yolluyorum.belki başka bir ihtiyacı olanda çıkar.


#include <16f877A.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#device ADC=10 // ADC yi 10 bit ayarla
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD//sigortalar
#use delay(CLOCK=4000000)//kristal frenkası bildiriliyor.
#define use_portb_lcd TRUE//lcd PORT B ye bağlanacak
#include <ONURDS1302.C>//RTC kütüphanesini ekle
#include <ONURLCD_pd.c> //LCD kütüphanesini ekle
//buton tanımlamaları
#define set pin_a5
#define sol pin_e0
#define yukari pin_e1
#define asagi pin_e2

// değişken tanımlamaları

unsigned int saniye,dakika,saat,gun,ay,yil,haftanin_gunu;
unsigned int gun1,ay1,yil1,saat1,dakika1,derece1,deger=1;
unsigned long int bilgi; // digital bilgi değişkeni
float voltaj,sicaklik; // analog değer değişkeni
void goruntule()// verileri ekranda görüntüleme fonksiyonu
{
lcd_gotoxy(1,1);
printf(lcd_putc,"%02d:%02d:%02d",saat,dakika,saniye);
lcd_gotoxy(1,2);
printf(lcd_putc,"%02d/%02d/20%02d"gun,ay,yil);}
void main ( )
{

set_tris_a(0x0F);
setup_adc(adc_clock_div_32); // ADC clock frekansını ayarla fosc/32
setup_adc_ports(AN0); //RA0/AN0 girişi analog
set_adc_channel(0); // RA0/AN0 ucundaki sinyale A/D işlemi uygula
delay_us(20); //kanal seçimi beklemesi
enable_interrupts(GLOBAL); // Tüm kesmeler aktif
lcd_init();//lcd yi hazırla
while(1) // sonsuz döngü hazırla
{
anadongu:
bilgi=read_adc(); // digital değeri yükle
voltaj=(0.0048828125*bilgi)*1000;
sicaklik=(voltaj/10); // Her 10mV'ta 1 derece artma
rtc_init();//rtc yi hazırla
rtc_get_time(saat,dakika,saniye);//rtc den saat bilgilerini al
rtc_get_date(gun,ay,yil,haftanin_gunu);//rtc den takvim bilgilerini al
goruntule();//fonksiyonu çağır ve verileri ekranda görüntüle
if(saniye==59)//gecen zaman 1 dakika ya eşit mi ?
{
lcd_gotoxy(10,1);
printf(lcd_putc,"%fßC" sicaklik);
delay_ms(250);// 1000 ms bekle
}
if(input(set))// SET tuşuna basılırsa menü ye git ve sonsuz döngüden çık
{
while(input(set));// butonun bırakılmasını bekle
lcd_putc("\f");//lcd'yi temizle
goto ayar;//menü isimli alt programa git
}
output_c(0x01);
delay_ms(500);//600 ms bekle
/////sonsuz döngünün sonu işlemleri tekrarla
}
ayar:// saat ayarlama alt programı
lcd_gotoxy(1,1);
printf(lcd_putc,"%02d:%02d:%02d",saat,dakika,saniye);
lcd_gotoxy(1,2);
printf(lcd_putc,"%02d:%02d:%02d",gun,ay,yil);
if(input(set))
{
while(input(set));
deger++;
}
if(input(sol))
{
while(input(sol));
deger--;
if(deger==0)
deger=1;
}
switch(deger)
{
case 1:
{
lcd_gotoxy(1,1);
lcd_putc('z');
delay_ms(100);
if(input(yukari))
{
while(input(yukari));
saat++;
if(saat==24)
saat=0;
}
if(input(asagi))
{
while(input(asagi));
saat--;
if(saat==255)
saat=23;
}
}
break;
case 2:
{
lcd_gotoxy(4,1);
lcd_putc('z');
delay_ms(10);
if(input(yukari))
{
while(input(yukari));
dakika++;
if(dakika==60)
dakika=0;
}
if(input(asagi))
{
while(input(asagi));
dakika--;
if(dakika==255)
dakika=59;
}
}
break;
case 3:
{
lcd_gotoxy(1,2);
lcd_putc('z');
delay_ms(100);
if(input(yukari))
{
while(input(yukari));
gun++;
if(gun==32)
gun=1;
}
if(input(asagi))
{
while(input(asagi));
gun--;
if(gun==255)
gun=31;
}
}
break;
case 4:
{
lcd_gotoxy(4,2);
lcd_putc('z');
delay_ms(100);
if(input(yukari))
{
while(input(yukari));
ay++;
if(ay==13)
ay=1;
}
if(input(asagi))
{
while(input(asagi));
ay--;
if(ay==255)
ay=12;
}
}
break;
case 5:
{
lcd_gotoxy(7,2);
lcd_putc('z');
delay_ms(100);
if(input(yukari))
{
while(input(yukari));
yil++;
if(yil==100)
yil=0;
}
if(input(asagi))
{
while(input(asagi));
yil--;
if(yil==255)
yil=99;
}
}
break;
}
if(deger==6)
{
rtc_init(); // DS1302 başlangıç ayarları yapılıyor
rtc_set_datetime(gun,ay,yil,haftanin_gunu,saat,dakika);
lcd_send_byte(0,0x0c);
lcd_putc("\f");
deger=1;

goto anadongu;
}
goto ayar;


goto anadongu;//anadongüye git sonsuz döngüye gir.
}
 
SAOLUN HERKESE İYİ GÜNLER
 
Arkadaşlar Bana Pic İle Çalışan Bir Dijıtal Termometre Lazım Yardımcı Olabılecek Olan Varmı? İsis Halini Çizerek Bana Atarsanız Çok Sevinirim Dönem Ödevi Olarak Aldık Söyle Lise 3 Öğrencisine Yakışır Bişey Lazım Bana Pic Programınıda Var İse Verirseniz On Numara Olur.Şimdiden Tşk Ediyorum İlgilenenlere Hayırlı Akşamlar.
 

Forum istatistikleri

Konular
128,385
Mesajlar
917,170
Kullanıcılar
450,271
Son üye
plcotomasyon-1

Yeni konular

Geri
Üst