#define DQ_data PORTC.7
#define DQ_bus(x) DDRC.7 = x
void DS18B20_Init()
{
uint i = 0;
DQ_bus(1);
DQ_data = 1;
DQ_data = 0;
delay_us(640);
DQ_data =1;
DQ_bus(0);
// delay_us(60);
while(PINC.7)
{
delay_us(60);
i++;
if(i >= 10000)
{
flag = 1;
break;
}
}
delay_us(480);
DQ_bus(1);
DQ_data = 1;
}
void DS18b20_Write(uchar dat)
{
uchar m;
DQ_bus(1);
for(m = 0;m < 8; m++)
{
DQ_data = 0;
delay_us(15);
if(dat &(1 << m))
{
DQ_data = 1;
delay_us(15);
delay_us(15);
delay_us(15);
}
else
{
DQ_data = 0;
delay_us(15);
delay_us(15);
delay_us(15);
delay_us(15);
}
DQ_data = 1;
}
DQ_bus(1);
DQ_data = 1;
}
uchar DS18b20_Read()
{
uchar n,temp,k;
temp = 0;
// IO_In;
for(n = 0;n < 8;n++)
{
DQ_bus(1);
DQ_data = 1;
delay_us(2);
DQ_data = 0;
delay_us(6);
DQ_data = 1;
delay_us(4);
DQ_bus(0);
k = (PINC & (1 << 7));
if(k)
{
temp |= (1 << n);
}
else
{
temp &= ~(1 << n);
}
delay_us(30);
// DQ_bus(1);
}
return (temp);
}
void Gettemp()
{
uint w;
// uchar i;
DS18B20_Init();
DS18b20_Write(0xcc);
DS18b20_Write(0x44);
delay_ms(100);
DS18B20_Init();
DS18b20_Write(0xcc);
DS18b20_Write(0xbe);
templ = DS18b20_Read();
temph = DS18b20_Read();
// uint w;
// uchar i;
// Gettemp();
w = temph;
w = w << 8;
w = w | templ;
if(w < 0x0fff)
sign1 = 1;
else
{
w = ~w + 1;
sign1 = 0;
}
w = w * (0.625) - 40;
e[0] = w / 1000 + 0x30;
e[1] = w % 1000 / 100 + 0x30;
e[2] = w % 100 / 10 + 0x30;
e[3] = w % 10 +0x30;
}
#define DQ_data PORTC.7
#define DQ_bus(x) DDRC.7 = x
void DS18B20_Init()
{
uint i = 0;
DQ_bus(1);
DQ_data = 1;
DQ_data = 0;
delay_us(640);
DQ_data =1;
DQ_bus(0);
// delay_us(60);
while(PINC.7)
{
delay_us(60);
i++;
if(i >= 10000)
{
flag = 1;
break;
}
}
delay_us(480);
DQ_bus(1);
DQ_data = 1;
}
void DS18b20_Write(uchar dat)
{
uchar m;
DQ_bus(1);
for(m = 0;m < 8; m++)
{
DQ_data = 0;
delay_us(15);
if(dat &(1 << m))
{
DQ_data = 1;
delay_us(15);
delay_us(15);
delay_us(15);
}
else
{
DQ_data = 0;
delay_us(15);
delay_us(15);
delay_us(15);
delay_us(15);
}
DQ_data = 1;
}
DQ_bus(1);
DQ_data = 1;
}
uchar DS18b20_Read()
{
uchar n,temp,k;
temp = 0;
// IO_In;
for(n = 0;n < 8;n++)
{
DQ_bus(1);
DQ_data = 1;
delay_us(2);
DQ_data = 0;
delay_us(6);
DQ_data = 1;
delay_us(4);
DQ_bus(0);
k = (PINC & (1 << 7));
if(k)
{
temp |= (1 << n);
}
else
{
temp &= ~(1 << n);
}
delay_us(30);
// DQ_bus(1);
}
return (temp);
}
void Gettemp()
{
uint w;
// uchar i;
DS18B20_Init();
DS18b20_Write(0xcc);
DS18b20_Write(0x44);
delay_ms(100);
DS18B20_Init();
DS18b20_Write(0xcc);
DS18b20_Write(0xbe);
templ = DS18b20_Read();
temph = DS18b20_Read();
// uint w;
// uchar i;
// Gettemp();
w = temph;
w = w << 8;
w = w | templ;
if(w < 0x0fff)
sign1 = 1;
else
{
w = ~w + 1;
sign1 = 0;
}
w = w * (0.625) - 40;
e[0] = w / 1000 + 0x30;
e[1] = w % 1000 / 100 + 0x30;
e[2] = w % 100 / 10 + 0x30;
e[3] = w % 10 +0x30;
}
举报