https://blog.csdn.net/Leytton/article/details/38504319
https://blog.csdn.net/sandeepin/article/details/53638266
H.file:
头文件
*******************************************/
/******************************DS18B20 函数声明**************************************/
void DS18B20_GPIO_Config(void);
void DS18B20_start(void) ;
unsigned int DS18B20_Read_Temp(void) ;
/****************************** DS18B20 函数宏定义***************************************/
/*******************************DS18B20 引脚参数配置******************************/
C file:
#include "bsp_DS18B20.h"
void DS18B20_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启GPIOC的外设时钟*/
RCC_APB2PeriphClockCmd( DS18B20_GPIO_CLK, ENABLE);
/*选择要控制的GPIOC引脚*/
GPIO_InitStructure.GPIO_Pin =DS18B20_GPIO_PIN;
/*设置引脚模式为通用开漏输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化DS18B20_GPIO_PORT*/
GPIO_Init(DS18B20_GPIO_PORT, &GPIO_InitStructure);
}
//*************************************************************************
// DS18B20初始化
//*************************************************************************
unsigned char DS18B20_Reset(void) //初始化和复位
{
unsigned char i;
// DQ_OUT;
GPIO_ResetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN); //DQ_CLR;
Delay_us(500); //延时500uS(480-960)
GPIO_SetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN); //DQ_SET;
//DQ_IN;
Delay_us(80); //延时80uS
i = GPIO_ReadInputDataBit(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN);
Delay_us(500); //延时500uS(保持>480uS)
if (i)
{
return 0x00;
}
else
{
return 0x01;
}
}
//*************************************************************************
// 向18B20写一个字节函数
//*************************************************************************
/*DS18B20字节写入函数*/
void DS18B20_Write_Byte(unsigned char value)
{
unsigned char i;
for (i = 8; i != 0; i--)
{
// DQ_OUT;S设置为输出
GPIO_ResetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN);//DQ_CLR;置低电平
Delay_us(4) ; //延时4uS
if (value & 0x01)
{
GPIO_SetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN);//DQ_SET;置高电平
}
Delay_us(80); //延时80uS
GPIO_SetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN); //DQ_SET置高电平 //位结束
value >>= 1;
}
}//*************************************************************************
// DS18B20读一个字节函数
//*************************************************************************
unsigned char DS18B20_Read_Byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i = 8; i != 0; i--)
{
value >>= 1;
// DQ_OUT;
GPIO_ResetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN);// DQ_CLR;置低电平
Delay_us(4); //*延时4uS
GPIO_SetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN); // DQ_SET;置高电平
//DQ_IN;设置为输入模式
Delay_us(10); ; //*延时10uS
if (GPIO_ReadInputDataBit(DS18B20_GPIO_PORT, DS18B20_GPIO_PIN ))
{
value|=0x80;
}
Delay_us(60); //*延时60uS
}
return(value);
}//*************************************************************************
// 发送温度转换命令
//*************************************************************************
/*启动ds1820转换*/
void DS18B20_start(void)
{
DS18B20_Reset();
DS18B20_Write_Byte(0xCC); //勿略地址
DS18B20_Write_Byte(0x44); //启动转换
}
//*************************************************************************
// DS8B20读取温度信息
//*************************************************************************
unsigned int DS18B20_Read_Temp(void)
{
unsigned int i=0;
unsigned int temp_value;
unsigned char buf[9];
DS18B20_Reset();
DS18B20_Write_Byte(0xCC); //勿略地址
DS18B20_Write_Byte(0xBE); //读取温度
for (i = 0; i < 9; i++) { buf[i] = DS18B20_Read_Byte(); } i = buf[1]; i <<= 8; i |= buf[0]; temp_value=i; temp_value=(unsigned int)(temp_value*0.625); //不是乘以0.0625的原因是为了把小数点后一位数据也转化为可以显示的数据 //比如温度本身为27.5度,为了在后续的数据处理程序中得到BCD码,我们先放大到275 //然后在显示的时候确定小数点的位置即可,就能显示出27.5度了 return temp_value; }