#include "DS18B20.h"ide
/*********************************************************************************************************
** 全局变量
********************************************************************************************************/
unsigned char Temperature;
/*********************************************************************************************************
** 函数名称:Delay_us(unsigned char us)
** 函数功能:延时uS
** 入口参数:unsigned char us
** 出口参数:void
** 说 明:u,延时精度2us
********************************************************************************************************/
void Delay_us (unsigned char us)
{函数
while(--us);
}
/*********************************************************************************************************
** 函数名称:unsigned char OWTouchReset(void)
** 函数功能:复位温度传感器,并返回是否检测到信号
** 入口参数:void
** 出口参数:unsigned char,返回是否检测到信号
** 说 明: 返回值为1表明没有检测到,不然检测到
********************************************************************************************************/
unsigned char OWTouchReset (void)
{
unsigned char result;spa
DQ = 0; //低电平驱动
Delay_us(TRSTL/2); //600us复位低电平
Delay_us(TRSTL/2);
DQ = 1; //高电平驱动
Delay_us(TPDHIGH); //40us高电平存在检测
_nop_();
result = DQ; // 检测信号
Delay_us(TPDLOW); //160us低电平存在检测
DQ = 1;
Delay_us(TTSTH ); //160us低电平存在检测
return result;
}
/*********************************************************************************************************
** 函数名称:void OWWriteBit (unsigned char BitData)
** 函数功能:往总线上写1位数据
** 入口参数:unsigned char BitData
** 出口参数:void
** 说 明:分为数据0和数据1
********************************************************************************************************/
void OWWriteBit (unsigned char BitData)
{
if (BitData) //数据位为1
{
DQ = 0; //低电平驱动
Delay_us( TLOW1 ); //单线写1低电平时间7us
DQ = 1; // 高电平驱动
Delay_us(TSOLT ); //时间间隙80us
DQ = 1;
}
else //数据位为0
{
DQ = 0; // 低电平驱动
Delay_us(TLOW0); //单线写0低电平时间80us
DQ = 1; //高电平驱动
}
}
/*********************************************************************************************************
** 函数名称:unsigned char OWReadBit (void)
** 函数功能:从总线读取一个数据位
** 入口参数:void
** 出口参数:unsigned char
** 说 明:
********************************************************************************************************/
unsigned char OWReadBit (void)
{
unsigned char result;blog
DQ = 0; // 低电平驱动
Delay_us(TRDV); //得到信号时间7us
DQ = 1; //高电平驱动
_nop_();
result = DQ; // 获取信号
Delay_us(TSOLT); //时间间隙80us
DQ = 1;ip
return result;
}
/*********************************************************************************************************
** 函数名称:void OWWriteByte (unsigned char Data)
** 函数功能:往总线写一字节
** 入口参数:unsigned char Data
** 出口参数:void
** 说 明:
********************************************************************************************************/
void OWWriteByte (unsigned char Data)
{
unsigned char i;it
//发送8位数据
for (i=8;i!=0;i--)
{
OWWriteBit(Data & 0x01);
Data = (Data >> 1);
}
}
/*********************************************************************************************************
** 函数名称:unsigned char OWReadByte (void)
** 函数功能:从总线读取一个字节
** 入口参数:void
** 出口参数:unsigned char
** 说 明:
********************************************************************************************************/
unsigned char OWReadByte (void)
{
unsigned char i,result=0;class
for (i=8;i!=0;i--)
{
//从高位开始存取
result = (result >> 1);
if (OWReadBit()) result |= 0x80;
}
return result;
}
/*********************************************************************************************************
** 函数名称:unsigned char DS18B20_Init (void)
** 函数功能:初始化温度传感器
** 入口参数:void
** 出口参数:unsigned char
** 说 明:
********************************************************************************************************/
unsigned char DS18B20_Init (void)
{
EA = 0; //关中断变量
if (OWTouchReset())
{
EA = 1; //若是没有检测到,开中断
return 0xE0;
}配置
OWWriteByte(OW_SkipROM); //跳过ROM
OWWriteByte(OW_WriteScratchpad); //写暂存器
OWWriteByte(0x3D); // TH=60 设置最高温度
OWWriteByte(0x00); // TL=0 设置最低温度
//精度设置为12-BIT
OWWriteByte(0x7F); // DS18B20配置寄存器R1,R0=11
if (OWTouchReset())
{
EA = 1; //开中断
return 0xE0;
}数据
OWWriteByte(OW_SkipROM); //跳过ROM
OWWriteByte(OW_CopyScratchpad); //复制暂存器
EA = 1; //关中断
return 0;
}
/*********************************************************************************************************
** 函数名称:unsigned char ReadDS18B20 (void)
** 函数功能:读取传感器温度
** 入口参数:void
** 出口参数:unsigned char
** 说 明:
********************************************************************************************************/
unsigned char ReadDS18B20 (void)
{
unsigned char i,result=0;
EA = 0; //关中断
if (OWTouchReset())
{
EA = 1; //开中断
return 0xE0;
}
OWWriteByte(OW_SkipROM); //跳过ROM
OWWriteByte(OW_ReadScratchpad); //读取暂存器的值,9字节
for (i=0;i <9;i++)
{
result = OWReadByte();
if (0 == i) //温度低字节
{
Temperature = result >> 4; // 温度不保留小数
}
else if (1 == i) //温度高字节
{
if (result & 0xF8)
{
Temperature = 0; // 负温度归零
}
else
{
Temperature |= (( result&0x07)<<4 ); // 温度保留8bit整数
}
}
}
EA = 1; ////////////////
return 0;
}
/*********************************************************************************************************
** 函数名称:void DS18B20ConvT (void)
** 函数功能:转换温度
** 入口参数:void
** 出口参数:void
** 说 明:
********************************************************************************************************/
void DS18B20ConvT (void)
{
EA = 0; //关中断
if (OWTouchReset())
{
EA = 1; //开中断
return;
}
OWWriteByte(OW_SkipROM); //跳过ROM
OWWriteByte(OW_ConvertT); //温度转换
EA = 1; //开中断 }