#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...