#include "stm8s.h"
#include "ds18b20.h"
/*void delay_us(u16 i)//延时子程序 精确延时
{
TIM3_DeInit();
TIM3_TimeBaseInit(TIM3_PRESCALER_1,1);
while(i--)
{
TIM3_Cmd(ENABLE);
while(TIM3_GetFlagStatus(TIM3_FLAG_UPDATE)!=1);
TIM3_ClearFlag(TIM3_FLAG_UPDATE);
TIM3_Cmd(DISABLE);
}
}*/
void delay_us(u32 i)
{
u32 h;
i=i*5/4;
for(h=i;h>0;h--);
}
u8 DS18B20_Read_Byte(void)
{
u8 i=0;
u8 TempData=0;
for(i=0;i<8;i++)
{
TempData>>=1;
DZX_O;
DZX_L;
delay_us(2);
DZX_H;
DZX_I;
delay_us(2);
if(DZX_V==1)
{
TempData=TempData|0x80;
}
delay_us(40);
}
return TempData;
}
void DS18B20_Write_Byte(u8 dat)
{
u8 i=0;
DZX_O;
for(i=0;i<8;i++)
{
DZX_L;
delay_us(10);
if((dat&0x01)==1)
{
DZX_H;
}
else
{
DZX_L;
}
delay_us(40);
DZX_H;
dat>>=1;
}
}
void DS18B20_Reset(void)
{
DZX_O;
DZX_L;
delay_us(480);
DZX_H;
delay_us(60);
}
float DS18B20_Get_wd(void)
{
u8 TL=0,TH=0;
u16 temp=0;
float wd=0;
DS18B20_Reset();
DS18B20_Write_Byte(0xCC);
DS18B20_Write_Byte(0x44);
//delay_us(800);
DS18B20_Reset();
DS18B20_Write_Byte(0xCC);
DS18B20_Write_Byte(0xBE);
TL=DS18B20_Read_Byte();
TH=DS18B20_Read_Byte();
DS18B20_Reset();
temp=TH;
temp=(temp<<8)|TL;
if((temp&0xF800)==0xF800)//负温度
{
temp=~temp;
temp=temp+1;
wd=temp*(-0.0625);
}
else
{
wd=temp*0.0625;
}
return wd;
}
|