﻿#include <avr/io.h>
#include <util/delay.h>

#define DS18B20_DDR DDRB
#define DS18B20_Port PORTB
#define DS18B20_Pin PINB
#define DS18B20_Bit 0

#define SKIP 0xCC
#define CONVERT 0x44
#define READ 0xBE


volatile unsigned char Status=0, OneWireStatus=0, High=0, Low=0;
int Full=0;

void OneWire_BusLow (void)
{
	DS18B20_DDR|=(1<<DS18B20_Bit);
}

void OneWire_BusHigh(void)
{
	DS18B20_DDR&=~(1<<DS18B20_Bit);
}

unsigned char OneWire_Reset()
{
	unsigned char Device= 0;
	OneWire_BusLow();
	_delay_us(650);
	OneWire_BusHigh();
	_delay_us(65);
	if ((DS18B20_Pin&(1<<DS18B20_Bit))==0)
	{
		Device=1;
	} 
	else
	{
		Device=0;
	}
	while((DS18B20_Pin&(1<<DS18B20_Bit))==0);
	return Device;
}

void OneWire_SendBit(unsigned char SBit)
{
	OneWire_BusHigh();
	OneWire_BusLow();
	if (SBit==1)
	{
		_delay_us(7);
		OneWire_BusHigh();
		_delay_us(70);
	} 
	else
	{
		_delay_us(70);//-90
		OneWire_BusHigh();
		_delay_us(7);
	}
}

void OneWire_SendByte(unsigned char SByte)
{
	for (unsigned char i=0; i<8; i++)
	{
		OneWire_SendBit(SByte&0x01);
		SByte>>=1;
	}
}

unsigned char OneWire_ReciveBit()
{
	unsigned char RBit=0;
	OneWire_BusHigh();
	OneWire_BusLow();
	_delay_us(7);
	OneWire_BusHigh();
	_delay_us(7);
	if ((DS18B20_Pin&(1<<DS18B20_Bit))==1)
	{
		RBit=1;
	}
	else
	{
		RBit=0;
	}
	_delay_us(70);
	return RBit;
}

unsigned char OneWire_ReciveByte()
{
	unsigned char RByte=0, RTmp=0;
	for (unsigned char j=0;j<8; j++)
	{
		RByte>>=1;
		RTmp=OneWire_ReciveBit();
		if (RTmp==1)
		{
			RByte|=0x80;
		}
	}
	return RByte;
}

int main(void)
{
	
    while (1) 
    {
		Status=OneWire_Reset();
		OneWire_SendByte(SKIP);
		OneWire_SendByte(CONVERT);
		
		_delay_ms(100);
		_delay_ms(100);
		_delay_ms(100);
		_delay_ms(100);
		_delay_ms(100);
		_delay_ms(100);
		_delay_ms(100);
		_delay_ms(100);
				
		Status=OneWire_Reset();
		OneWire_SendByte(SKIP);
		OneWire_SendByte(READ);
		Low=OneWire_ReciveByte();
		High=OneWire_ReciveByte();
		Full=0;
		Full|=High;
		Full<<=8;
		Full|=Low;
		Low=0;
		High=0;
    }
}

