我的DS18B20外接了1米长的导线,我原以为是线太长的原因所以接收不到,所以我只连接了18b20到板子上,可读数还是65535
#define DATAIN 1
#define DATAOUT 0
#define DS18B20_Write_1() GPIO_SetBits(GPIOE ,GPIO_Pin_5) //?1
#define DS18B20_Write_0() GPIO_ResetBits(GPIOE ,GPIO_Pin_5)//?0
#define DS18B20_ReadBit() GPIO_ReadInputDataBit(GPIOE ,GPIO_Pin_5)
static void DS18B20_GPIO_Config(u8 data)
{
GPIO_InitTypeDef GPIO_InitStruct;
switch(data)
{
case DATAIN :
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOE , &GPIO_InitStruct);
break;
case DATAOUT :
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOE , &GPIO_InitStruct);
break;
default:
break;
}
}
static void DS18B20Init(void)
{
DS18B20_GPIO_Config(DATAOUT);
DS18B20_Write_1();
delay_us(10);
DS18B20_Write_0();
delay_us(550);
DS18B20_Write_1();
delay_us(40);
DS18B20_GPIO_Config(DATAIN);
while(DS18B20_ReadBit());
DS18B20_GPIO_Config(DATAOUT);
delay_us(480);
DS18B20_Write_1();
}
static u8 DS18B20ReadByte(void)
{
u8 data = 0 , i = 0;
for(i=0; i<8; i++)
{
data >>= 1;
DS18B20_GPIO_Config(DATAOUT);
DS18B20_Write_1();
delay_us(2);
DS18B20_Write_0();
delay_us(10);
DS18B20_Write_1();
delay_us(60);
DS18B20_GPIO_Config(DATAIN);
if(DS18B20_ReadBit())
{
data |= 0x80;
}
else
{
data &= 0x7f;
}
delay_us(60);
}
DS18B20_GPIO_Config(DATAOUT);
DS18B20_Write_1();
delay_us(4);
return (data);
}
static void DS18B20WriteByte(u8 data)
{
u8 i = 0;
DS18B20_GPIO_Config(DATAOUT);
for(i=0; i<8; i++)
{
DS18B20_Write_0();
delay_us(10);
if(data & 0x01)
{
DS18B20_Write_1();
}
else
{
DS18B20_Write_0();
}
data >>= 1;
delay_us(60);
DS18B20_Write_1();
delay_us(5);
}
DS18B20_Write_1();
}
static u16 DS18B20TmpGet(void)
{
u8 data1,data2;
u16 data;
float temp;
data1 = DS18B20ReadByte();
data2 = DS18B20ReadByte();
data = data2;
data = data<<8;
data = data | data1;
//temp = data * 0.0625;
//temp = temp*10 + 0.5;
//data = temp;
return (data);
}
u16 TEMP_Convert(void)
{
DS18B20Init();
delay_us(5);
DS18B20WriteByte(0xcc);
DS18B20WriteByte(0x44);
delay_us(1000);
DS18B20Init();
DS18B20WriteByte(0xcc);
DS18B20WriteByte(0xbe);
return (DS18B20TmpGet());
}
|