DS18B20温度传感器原理详解及例程代码
封装运行正常,仅用作代码记录
#ifndef _DS18B20_H
#define _DS18B20_H
#include "main.h"
#include "my_sys.h"
//引脚初始化
#define DS18B20_DQ_OUT_H HAL_GPIO_WritePin(DS18B20_DQ_GPIO_Port,DS18B20_DQ_Pin,GPIO_PIN_SET)
#define DS18B20_DQ_OUT_L HAL_GPIO_WritePin(DS18B20_DQ_GPIO_Port,DS18B20_DQ_Pin,GPIO_PIN_RESET)
#define DS18B20_DQ_IN HAL_GPIO_ReadPin (DS18B20_DQ_GPIO_Port,DS18B20_DQ_Pin)
#define false 0
#define true 1
void DS18B20_Reset(void);//传感器复位函数
u8 DS18B20_Check(void);//等待传感器响应函数
u8 DS18B20_init(void);//传感器初始化
void DS18B20_write(u8 data);//向传感器写数据
u8 DS18B20_Read_Bit(void);//从传感器读取一个BIT数据
u8 DS18B20_Read_Byte(void);//从传感器读取一个字节数据
void DS18B20_Start(void);//向传感器发送指令,测量温度
float DS18B20_Get_Temp(void);//读取温度值
#endif
#include "DS18B20.h"
#include "main.h"
static void DS18B20_delay(u16 D) //delay(word D) //延时__near
{
u8 E;
for(; D > 0; D--)
{
for(E = 5; E > 0; E--)
{
;
}
}
}
void DS18B20_Reset(void)//传感器复位函数
{
DS18B20_DQ_OUT_L;
DS18B20_delay(480);
DS18B20_DQ_OUT_H;
DS18B20_delay(15);
}
u8 DS18B20_Check(void)//等待传感器响应函数
{
u8 retry =0;
while(DS18B20_DQ_IN)
{
if(retry++ >60)
{
return false;
}
else
{
DS18B20_delay(10);
}
}
retry=0;
while(!DS18B20_DQ_IN)
{
if(retry++ >240)
{
return false;
}
else
{
DS18B20_delay(10);
}
}
return true;
}
u8 DS18B20_init(void)//传感器初始化
{
DS18B20_Reset();
return DS18B20_Check();
}
void DS18B20_write(u8 data)//向传感器写数据
{
for(u8 i=0; i<8; i++)
{
if(data&0x01)
{
DS18B20_DQ_OUT_L;
DS18B20_delay(2);
DS18B20_DQ_OUT_H;
DS18B20_delay(60);
}
else
{
DS18B20_DQ_OUT_L;
DS18B20_delay(60);
DS18B20_DQ_OUT_H;
DS18B20_delay(2);
}
data >>=1;
}
}
u8 DS18B20_Read_Bit(void)//从传感器读取一个BIT数据
{
u8 data;
DS18B20_DQ_OUT_L;
DS18B20_delay(2);
DS18B20_DQ_OUT_H;
DS18B20_delay(2);
data = DS18B20_DQ_IN;
DS18B20_delay(50);
return data;
}
u8 DS18B20_Read_Byte(void)//从传感器读取一个字节数据
{
u8 data=0;
for(u8 i=0; i<8;i++)
{
data>>=1;
if(DS18B20_Read_Bit())
{
data |=0x80;
}
}
return data;
}
void DS18B20_Start(void)//向传感器发送指令,测量温度
{
DS18B20_Reset();
DS18B20_Check();
DS18B20_write(0xCC);
DS18B20_write(0x44);
}
float DS18B20_Get_Temp(void)//读取温度值
{
float data;
DS18B20_Start();
DS18B20_Reset();
DS18B20_Check();
DS18B20_write(0xCC);
DS18B20_write(0xBE);
data = ((u16)DS18B20_Read_Byte() | DS18B20_Read_Byte()<<8)*0.0625f;
return data;
}