stm32 ds18b20 温度传感器
相关文章:
http://blog.csdn.net/zhangxuechao_/article/details/74991985
举例
void DS18B20_in()
{
GPIO_InitTypeDef gpio =
{
GPIO_Pin_11,
GPIO_Speed_50MHz,
GPIO_Mode_IPD
};
GPIO_Init(GPIOG, &gpio);
}
void DS18B20_out()
{
GPIO_InitTypeDef gpio =
{
GPIO_Pin_11,
GPIO_Speed_50MHz,
GPIO_Mode_Out_PP
};
GPIO_Init(GPIOG, &gpio);
}
u8 DS18B20_check()
{
u8 flag = 0;
DS18B20_in();
while(ds18b20_in == 1)
{
flag++;
if(flag > 100)
{
return 1;
}
delay_us(1); //一次循环1us
}
flag = 0;
while(ds18b20_in == 0)
{
flag++;
if(flag > 240)
{
return 1;
}
delay_us(1);
}
return 0;
}
u8 DS18B20_reset()
{
DS18B20_out();
ds18b20_out = 0;
delay_us(500);
ds18b20_out = 1;
delay_us(1);
return DS18B20_check();
}
u8 DS18B20_init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
return DS18B20_reset();
}
u8 DS18B20_read_bit()
{
DS18B20_out();
ds18b20_out = 0;
delay_us(1);
ds18b20_out = 1; //释放总线
delay_us(1);
DS18B20_out();
delay_us(15);
return ds18b20_in;
}
u8 DS18B20_read()
{
u8 i = 0;
u8 r, tmp;
for(i = 0; i < 8; i++)
{
tmp = DS18B20_read_bit();
r = (tmp << 7 | r >> 1);
delay_us(45);
ds18b20_out = 1;
delay_us(1);
}
return r;
}
void DS18B20_write(u8 d)
{
u8 i = 0;
u8 tmp = 0;
DS18B20_out();
for(i = 0; i < 8; i++)
{
tmp = d & 0x01;
d >>= 1;
ds18b20_out = 0;
delay_us(1);
if(tmp == 0)
{
delay_us(60);
}
else
{
ds18b20_out = 1;
delay_us(60);
}
ds18b20_out = 1;
delay_us(1);
}
}
void DS18B20_ChangeTemp()
{
DS18B20_write(0xcc); //忽略ROM
DS18B20_write(0x44); //温度转换
return;
}
void DS18B20_ReadTemp()
{
DS18B20_write(0xcc);
DS18B20_write(0xbe); //读取RAM
return;
}
u16 readTemp()
{
int temp = 0;
u8 tmph = 0, tmpl = 0;
DS18B20_reset(); //必须的
DS18B20_ChangeTemp();
DS18B20_reset(); //必须的
DS18B20_ReadTemp();
tmpl = DS18B20_read(); //低字节
tmph = DS18B20_read(); //高字节
temp = tmph;
temp <<= 8;
temp |= tmpl;
return temp;
}
int main(void)
{
while(DS18B20_init() != 0)
{
printf("DS18B20_init failed.\n");
delay_ms(500);
}
while(1)
{
led1 = ~led1;
r = readTemp();
if((r & 0xf800) == 0xf800)
{
r = (~r) + 1;
temp = r * (-0.0625);
}
else
{
temp = r * 0.0625;
}
printf("temp %.2f\n", temp);
delay_ms(1000);
}
}