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

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

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

DS18B20时序分析:

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

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

总结:如何驱动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******************************/
上一篇:java使用POI操作excel文件,实现批量导出,和导入


下一篇:Hadoop学习笔记—22.Hadoop2.x环境搭建与配置