DS18B20 İçin Sürücü Programı

ds18b20 Maxim/Dallas firması tarafından üretilen DS18B20 sıcaklık algılayıcısı en fazla 0.5 derecelik hata ile -55 ile +125 dereceler arası ölçüm yapabilmekte ve sıcaklık bilgisini sayısal olarak vermektedir. DS18B20 gibi sayısal çıkış veren sıcaklık algılayıcılarının kullanımı ile analog/sayısal dönüştürücü kullanımına gerek kalmamaktadır.

ds18b20bag

Ayrıca parazit besleme özelliği sayesinde harici besleme kaynağına gerek almadan sıcaklık bilgisi okunabilmektedir. Sensörün Pic’e bağlantısı apılırken yapılacak tek şey DQ data hattına 4.7 k’lık bir pull up direnciyle +5 volta bağlanması olacaktır. Aşağıda verilen sürücü programı devrede sadece bir Ds18B20 varken çalışacaktır. 

//Bu kodu ds18b20.c olarak kaydediniz
// (C) copyright 2003 j.d.sandoz / jds-pic !at! losdos.dyndns.org 

#define ONE_WIRE_PIN PIN_C7 // sensörün DQ bacağının bağlanacağı pin
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 / 16.0;
delay_ms(200);
return(result);
}

Bu sürücü programında

DS18B20 için      result = (float) temp3 / 16.0
DS18S20 için      result = (float) temp3 / 2.0  satırları kullanılmalıdır.

Örnek uygulama Progamı:

#include <16F877A.h>
#FUSES NOWDT, XT, PUT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#include “lcd.c” //lcd ait fonksiyonlar programa eklenir
#include “ds18b20.c” //ds18b20 ait fonksiyonlar programa eklenir

void main()
{
float temperature;
lcd_init();
lcd_putc(”\f”); 

while (1)
{
 temperature = ds1820_read();
 printf(lcd_putc,”Sicaklik:\n %3.1f derece”, temperature);
 delay_ms(250;)
 } }
Bu yazı CCS C Sürücü kategorisine gönderilmiş ve , ile etiketlenmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.