31 Ocak 2024 Çarşamba

ds18b20 seven segment termometre

 ds18b20 seven segment termometre 16f628a işlemci ile yapıldı. eksi -55 ile +125 derece değerleri arasında ölçüm yapılıyor.

ds18b20 kütüphanesinin içinde döngü tarama işlemi yaptırıldı. normal çalışma sisteminde belirli aralıklarla display de yanıp sönme işlemi yapıyordu. ds18b20 kütüphanesinin içindeki kod ile bu durum ortadan kaldırıldı.

main kodu:

#include<16f628a.h>

#INCLUDE <stdlib.h>

#fuses INTRC_IO,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,nomclr

#use delay(clock=4m)

//#use RS232(baud=9600,xmit=pin_a6)

int onlar,birler,yuzler,i;

const int a[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};

void tara()

{

output_high(pin_a3);

output_b(a[birler]);

delay_ms(2);

output_low(pin_a3);

output_high(pin_a2);

output_b(a[onlar]);

delay_ms(2);

output_low(pin_a2);

output_high(pin_a1);

output_b(a[yuzler]);

delay_ms(2);

output_low(pin_a1);

}

void tara2()

{

output_high(pin_a3);

output_b(a[birler]);

delay_ms(5);

output_low(pin_a3);

output_high(pin_a2);

output_b(a[onlar]);

delay_ms(5);

output_low(pin_a2);

output_high(pin_a1);

output_b(a[yuzler]);

delay_ms(5);

output_low(pin_a1);

}

#include "dss18b20.c"

void main()

{

set_tris_a(0b0000000);

set_tris_b(0b0000000);

output_b(0x00);

float sicaklik;

while(true)

{

tara();

sicaklik = ds1820_read();

birler =   (int)sicaklik % 10;

sicaklik = sicaklik /10;

onlar = (int)sicaklik % 10;

yuzler = sicaklik / 10;


//// eksi değerde gösterilecek alan

if(sicaklik < 0.00)

{

sicaklik = abs(sicaklik) * 10  ;

birler = (int)sicaklik % 10;

onlar = sicaklik / 10;

yuzler = 10;

tara2();

}

//// eksi değerde gösterilecek alan

}

}


ds18b20 kütüphane kodları:

#define ONE_WIRE_PIN PIN_a0

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 );


// seven segment display haricinde bu alan aktif getirilip kullanılabilir

//!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;//18b20 icin

//!//result = (float) temp3 / 2.0;//18s20 icin

//!delay_ms(200);

//!return(result);

//!}

//





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();

tara();}

onewire_reset();

onewire_write(0xCC);

onewire_write(0xBE);

temp1 = onewire_read();

temp2 = onewire_read();

temp3 = make16(temp2, temp1);

result = (float) temp3 / 16.0;

for(int i=0;i<25;i++)

{tara();}

return(result);

}






Hiç yorum yok:

Yorum Gönder

Her yorum bilgidir. Araştırmaya devam...