您的位置:首页 > 其它

总结:如何驱动DS18B20温度传感器

2016-04-04 18:32 531 查看




DS18B20时序分析:







以下是STM32的驱动代码:

#include "bsp_ds18b20.h"

static void DS18B20_GPIO_Config(void)
{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE);

GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);

GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);
}

static void DS18B20_Mode_IPU(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}

static void DS18B20_Mode_Out_PP(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}

static void DS18B20_Rst(void)
{

DS18B20_Mode_Out_PP();

DS18B20_DATA_OUT(LOW);
Delay_us(750);

DS18B20_DATA_OUT(HIGH);

Delay_us(15);
}

static uint8_t DS18B20_Presence(void)
{
uint8_t pulse_time = 0;

DS18B20_Mode_IPU();

while( DS18B20_DATA_IN() && pulse_time<100 )
{
pulse_time++;
Delay_us(1);
}
if( pulse_time >=100 )
return 1;
else
pulse_time = 0;

while( !DS18B20_DATA_IN() && pulse_time<240 )
{
pulse_time++;
Delay_us(1);
}
if( pulse_time >=240 )
return 1;
else
return 0;
}

static uint8_t DS18B20_Read_Bit(void)
{
uint8_t dat;

DS18B20_Mode_Out_PP();
DS18B20_DATA_OUT(LOW);
Delay_us(10);

DS18B20_Mode_IPU();
//Delay_us(2);

if( DS18B20_DATA_IN() == SET )
dat = 1;
else
dat = 0;

Delay_us(45);

return dat;
}

uint8_t DS18B20_Read_Byte(void)
{
uint8_t i, j, dat = 0;

for(i=0; i<8; i++)
{
j = DS18B20_Read_Bit();
dat = (dat) | (j<<i);
}

return dat;
}

void DS18B20_Write_Byte(uint8_t dat)
{
uint8_t i, testb;
DS18B20_Mode_Out_PP();

for( i=0; i<8; i++ )
{
testb = dat&0x01;
dat = dat>>1;
if (testb)
{
DS18B20_DATA_OUT(LOW);
Delay_us(8);

DS18B20_DATA_OUT(HIGH);
Delay_us(58);
}
else
{
DS18B20_DATA_OUT(LOW);
/* 60us < Tx 0 < 120us */
Delay_us(70);

DS18B20_DATA_OUT(HIGH);
Delay_us(2);
}
}
}

void DS18B20_Start(void)
{
DS18B20_Rst();
DS18B20_Presence();
DS18B20_Write_Byte(0XCC);
DS18B20_Write_Byte(0X44);
}

uint8_t DS18B20_Init(void)
{
DS18B20_GPIO_Config();
DS18B20_Rst();

return DS18B20_Presence();
}

float DS18B20_Get_Temp(void)
{
uint8_t tpmsb, tplsb;
short s_tem;
float f_tem;

DS18B20_Rst();
DS18B20_Presence();
DS18B20_Write_Byte(0XCC);
DS18B20_Write_Byte(0X44);

DS18B20_Rst();
DS18B20_Presence();
DS18B20_Write_Byte(0XCC);
DS18B20_Write_Byte(0XBE);

tplsb = DS18B20_Read_Byte();
tpmsb = DS18B20_Read_Byte();

s_tem = tpmsb<<8;
s_tem = s_tem | tplsb;

if( s_tem < 0 )
f_tem = (~s_tem+1) * 0.0625;
else
f_tem = s_tem * 0.0625;

return f_tem;
}

/*************************************END OF FILE******************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: