ds18b20
ds18b20_drive_function.h
#ifndef __DS18B20_DRIVE_FUNCTION_H #define __DS18B20_DRIVE_FUNCTION_H #include "main.h" //数据输入输出端 #define DS18B20_DQ_GPIO_PORT GPIOG #define DS18B20_DQ_GPIO_PIN GPIO_Pin_2 #define DS18B20_GPIO_CLK RCC_APB2Periph_GPIOG #define DS18B20_GPIO_ClockCmd RCC_APB2PeriphClockCmd #define DS18B20_DQ_L() GPIO_ResetBits(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) #define DS18B20_DQ_H() GPIO_SetBits(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) #define DS18B20_DQ_READ() GPIO_ReadInputDataBit(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) #define DS18B20_Delay_US SysTick_Delay_US #define DS18B20_Delay_MS SysTick_Delay_MS extern float temperature; void DS18B20_Config_Init(void); void DS18B20_Read_Data(float* p_temp); #endif
ds18b20_drive_function.c
#include "ds18b20_drive_function.h" float temperature = 0; /******************************************************************************** 引脚IO配置 *******************************************************************************/ /********************************************************************** * @ 函数名 :DS18B20_GPIO_Config * @ 功能说明:配置DS18B20的引脚 * @ 参数 :无 * @ 返回值 :无 **********************************************************************/ static void DS18B20_GPIO_Config(void) { DS18B20_GPIO_ClockCmd(DS18B20_GPIO_CLK,ENABLE); //开启引脚时钟 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = DS18B20_DQ_GPIO_PIN; GPIO_Init(DS18B20_DQ_GPIO_PORT, &GPIO_InitStructure); } /********************************************************************** * @ 函数名 :DS18B20_Config_Init * @ 功能说明:DS18B20引脚初始化 * @ 参数 :无 * @ 返回值 :无 **********************************************************************/ void DS18B20_Config_Init(void) { DS18B20_GPIO_Config(); } /********************************************************************** * @ 函数名 :DS18B20_DQ_INTPUT * @ 功能说明:配置DQ引脚为输入 * @ 参数 :无 * @ 返回值 :无 **********************************************************************/ static void DS18B20_DQ_INTPUT(void) { DS18B20_GPIO_ClockCmd(DS18B20_GPIO_CLK, ENABLE); //打开GPIO时钟 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = DS18B20_DQ_GPIO_PIN; GPIO_Init(DS18B20_DQ_GPIO_PORT, &GPIO_InitStructure); } /********************************************************************** * @ 函数名 :DS18B20_DQ_INTPUT * @ 功能说明:配置DQ引脚为输出 * @ 参数 :无 * @ 返回值 :无 **********************************************************************/ static void DS18B20_DQ_OUTPUT(void) { DS18B20_GPIO_ClockCmd(DS18B20_GPIO_CLK, ENABLE); //打开GPIO时钟 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //推挽输出 GPIO_InitStructure.GPIO_Pin = DS18B20_DQ_GPIO_PIN; GPIO_Init(DS18B20_DQ_GPIO_PORT, &GPIO_InitStructure); } /******************************************************************************** 驱动函数 *******************************************************************************/ /********************************************************************** * @ 函数名 :DS18B20_Reset * @ 功能说明:DS18B20复位 * @ 参数 :无 * @ 返回值 :无 **********************************************************************/ static void DS18B20_Reset(void) { DS18B20_DQ_OUTPUT(); DS18B20_DQ_L(); DS18B20_Delay_US(750); DS18B20_DQ_H(); DS18B20_Delay_US(15); } /********************************************************************** * @ 函数名 :DS18B20_Check * @ 功能说明:等待DS18B20的回应 * @ 参数 :无 * @ 返回值 :0:正常 1:未检测到DS18B20的存在 **********************************************************************/ static uint8_t DS18B20_Check(void) { uint8_t temp = 0; DS18B20_DQ_INTPUT(); while(DS18B20_DQ_READ() && temp < 200) { temp++; DS18B20_Delay_US(1); }; if(temp >= 200) { return 1; } temp=0; while(!DS18B20_DQ_READ() && temp < 240) { temp++; DS18B20_Delay_US(1); }; if(temp >= 240) { return 1; } return 0; } /********************************************************************** * @ 函数名 :DS18B20_Read_Bit * @ 功能说明:从DS18B20读取一位数据 * @ 参数 :无 * @ 返回值 :0或1 **********************************************************************/ static uint8_t DS18B20_Read_Bit(void) { uint8_t Data; DS18B20_DQ_OUTPUT(); //SET PG11 OUTPUT DS18B20_DQ_L(); DS18B20_Delay_US(2); DS18B20_DQ_H(); DS18B20_DQ_INTPUT(); //SET PG11 INPUT DS18B20_Delay_US(12); if(DS18B20_DQ_READ()) { Data=1; } else { Data=0; } DS18B20_Delay_US(50); return Data; } /********************************************************************** * @ 函数名 :DS18B20_ReceiveData * @ 功能说明:从DS18B20读取数据 * @ 参数 :无 * @ 返回值 :读取的数据 **********************************************************************/ static uint8_t DS18B20_ReceiveData(void) { uint8_t Data=0; uint8_t temp=0; for(uint8_t i=0;i<8;i++) { temp = DS18B20_Read_Bit(); Data=(temp << 7) | (Data >> 1); } return Data; } /********************************************************************** * @ 函数名 :DS18B20_SendData * @ 功能说明:向DS18B20发送数据 * @ 参数 :Data:要发送的数据 * @ 返回值 :无 **********************************************************************/ static void DS18B20_SendData(uint8_t Data) { DS18B20_DQ_OUTPUT(); for(uint8_t i=0;i<8;i++) { if(Data & 0x01) { DS18B20_DQ_L(); DS18B20_Delay_US(2); DS18B20_DQ_H(); DS18B20_Delay_US(60); } else { DS18B20_DQ_L(); DS18B20_Delay_US(60); DS18B20_DQ_H(); DS18B20_Delay_US(2); } Data = Data >> 1; } } /********************************************************************** * @ 函数名 :DS18B20_Write_Byte * @ 功能说明:读取一个字节数据 * @ 参数 :无 * @ 返回值 :读取的数据 **********************************************************************/ static uint8_t DS18B20_Read_Byte(void) { uint8_t Read_Data; Read_Data = DS18B20_ReceiveData(); return Read_Data; } /********************************************************************** * @ 函数名 :DS18B20_Write_Byte * @ 功能说明:写入一个字节数据 * @ 参数 :Write_Data:要写入的数据 * @ 返回值 :无 **********************************************************************/ static void DS18B20_Write_Byte(uint8_t Write_Data) { DS18B20_SendData(Write_Data); } /********************************************************************** * @ 函数名 :DS18B20_Temp_Transform * @ 功能说明:发送温度转换指令 * @ 参数 :无 * @ 返回值 :无 **********************************************************************/ static void DS18B20_Temp_Transform_Instruct(void) { DS18B20_Reset(); DS18B20_Check(); DS18B20_Write_Byte(0xcc); // 发送忽略指令 DS18B20_Write_Byte(0x44); // 发送温度转换指令 } /********************************************************************** * @ 函数名 :DS18B20_Read_Temp_Instruct * @ 功能说明:发送读取温度指令 * @ 参数 :无 * @ 返回值 :无 **********************************************************************/ static void DS18B20_Read_Temp_Instruct(void) { DS18B20_Reset(); DS18B20_Check(); DS18B20_Write_Byte(0xcc); // 发送忽略指令 DS18B20_Write_Byte(0xbe); // 发送读取数据指令 } /********************************************************************** * @ 函数名 :DS18B20_Read_Data * @ 功能说明:从ds18b20读取温度值 * @ 参数 :无 * @ 返回值 :读取的温度值(-550~1250) **********************************************************************/ void DS18B20_Read_Data(float* p_temp) { uint8_t temp1 = 0; short temp2 = 0; float temp3 = 0; uint8_t TL = 0,TH = 0; DS18B20_Temp_Transform_Instruct(); DS18B20_Read_Temp_Instruct(); TL = DS18B20_Read_Byte(); TH = DS18B20_Read_Byte(); if(TH > 7)//温度为负 { TH = ~TH; TL = ~TL; temp1 = 0; } else //温度为正 { temp1 = 1; } temp2 = TH;//获得高八位 temp2 <<= 8; temp2 += TL;//获得低八位 temp3 = (float)temp2 * 0.625;//转换 if(temp1 == 0) { temp3 = -temp3; //温度值 } temp3 = temp3 / 10; *p_temp = temp3; return ; }