25 Ağustos 2026 Salı

iki led ile termometre yapimi

iki led ile termometre yapimi. devre çizimi 12f683 pin'lerini biliyorsaniz kodda nereye ne bağlanacaği yaziyor. iyi çalişmalar

#include <12F683.h>
#fuses INTRC_IO, NOWDT, PUT, NOMCLR, NOPROTECT, NOCPD, NOBROWNOUT
#use delay(crystal=8000000)

// Pin Tanımlamaları
#define DS18B20_PIN PIN_A0
#define LED_ONLAR   PIN_A1  // Sol LED
#define LED_BIRLER  PIN_A2  // Sağ LED

// DS18B20 1-Wire Fonksiyonları
int1 ds18b20_init() {
   int1 ack;
   output_low(DS18B20_PIN);
   output_drive(DS18B20_PIN);
   delay_us(500);
   output_float(DS18B20_PIN);
   delay_us(70);
   ack = !input(DS18B20_PIN);
   delay_us(400);
   return ack;
}

void ds18b20_write_bit(int1 bit_data) {
   output_low(DS18B20_PIN);
   output_drive(DS18B20_PIN);
   delay_us(2);
   if(bit_data) output_float(DS18B20_PIN);
   delay_us(60);
   output_float(DS18B20_PIN);
   delay_us(2);
}

void ds18b20_write_byte(byte data) {
   byte i;
   for(i=0; i<8; i++) {
      ds18b20_write_bit(bit_test(data, i));
   }
}

int1 ds18b20_read_bit() {
   int1 bit_data;
   output_low(DS18B20_PIN);
   output_drive(DS18B20_PIN);
   delay_us(2);
   output_float(DS18B20_PIN);
   delay_us(10);
   bit_data = input(DS18B20_PIN);
   delay_us(50);
   return bit_data;
}

byte ds18b20_read_byte() {
   byte i, data = 0;
   for(i=0; i<8; i++) {
      if(ds18b20_read_bit()) bit_set(data, i);
   }
   return data;
}

signed int8 ds18b20_read_temp_int() {
   byte low_byte, high_byte;
   int16 raw_temp;
   
   if(!ds18b20_init()) return -128; // Sensör hatası
   
   ds18b20_write_byte(0xCC); // Skip ROM
   ds18b20_write_byte(0x44); // Convert T
   
   delay_ms(750); // Dönüşüm süresi
   
   ds18b20_init();
   ds18b20_write_byte(0xCC); // Skip ROM
   ds18b20_write_byte(0xBE); // Read Scratchpad
   
   low_byte = ds18b20_read_byte();
   high_byte = ds18b20_read_byte();
   
   raw_temp = make16(high_byte, low_byte);
   return (signed int8)(raw_temp >> 4); // İşaretli tamsayı sıcaklık
}

// Basamak Gösterim Fonksiyonu (0 için hızlı çift çakar)
void basamak_goster(int pin, int8 deger) {
   int8 i;
   
   if(deger == 0) {
      // 0 Değeri İçin Hızlı Çift Çakar (50ms)
      for(i = 0; i < 2; i++) {
         output_high(pin);
         delay_ms(50);
         output_low(pin);
         delay_ms(50);
      }
   } 
   else {
      // Normal Sayı Değeri İçin Flaş (300ms)
      for(i = 0; i < deger; i++) {
         output_high(pin);
         delay_ms(300);
         output_low(pin);
         delay_ms(300);
      }
   }
}

void main() {
   setup_oscillator(OSC_8MHZ);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   
   output_low(LED_ONLAR);
   output_low(LED_BIRLER);
   
   signed int8 sicaklik = 0;
   int8 mutlak_sicaklik = 0;
   int8 onlar = 0;
   int8 birler = 0;
   
   while(TRUE) {
      sicaklik = ds18b20_read_temp_int();
      
      if(sicaklik != -128) {
         
         // 1. Negatif Sıcaklık Kontrolü
         if(sicaklik < 0) {
            output_high(LED_ONLAR);
            output_high(LED_BIRLER);
            delay_ms(1000); // İki LED de 1 sn sabit yanarak '-' işaretini bildirir
            output_low(LED_ONLAR);
            output_low(LED_BIRLER);
            delay_ms(500);
            
            mutlak_sicaklik = (int8)(-sicaklik);
         } 
         else {
            mutlak_sicaklik = (int8)sicaklik;
         }
         
         // 2. Basamakları Ayırma
         onlar = mutlak_sicaklik / 10;
         birler = mutlak_sicaklik % 10;
         
         // 3. Sol LED (Onlar Basamağı)
         basamak_goster(LED_ONLAR, onlar);
         
         delay_ms(800); // Basamaklar arası geçiş beklemesi
         
         // 4. Sağ LED (Birler Basamağı)
         basamak_goster(LED_BIRLER, birler);
      }
      
      // Ölçüm periyodu arası bekleme
      delay_ms(3000);
   }
}

Hiç yorum yok:

Yorum Gönder

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