温度传感器DS18B20驱动程序.docx
《温度传感器DS18B20驱动程序.docx》由会员分享,可在线阅读,更多相关《温度传感器DS18B20驱动程序.docx(11页珍藏版)》请在冰豆网上搜索。
温度传感器DS18B20驱动程序
#include"ds18b20.h"
#include
#if0
/***************************************************************************
*FUNCTIONNAME:
InitDS18b20
*CREATEDATE:
2009/11/12
*CREATEDBY:
XS
*FUNCTION:
复位DS18B20和检测存在脉冲
*MODIFYDATE:
2009/11/12
*INPUT:
无*
*RETURN:
初始化成功,返回1,否则返回0
***************************************************************************/
BOOLInitDs18b20(void)
{
BOOLflag=FALSE;
BITbt;
bt=ET0;
ET0=0;
DQ=1;
Delay70us
(1);//稍作延时
DQ=0;//复位
Delay70us(8);//精确延时大于480us
DQ=1;//拉高总线,等待存在脉冲
Delay70us
(1);//60-75us之间
if(0==DQ)
{
flag=TRUE;
}
Delay70us(8);//复位后大于480us延时
ET0=bt;
returnflag;
}
/***************************************************************************
*FUNCTIONNAME:
ReadByte
*CREATEDATE:
2009/11/12
*CREATEDBY:
XS
*FUNCTION:
从DS18B20中读取一个字节的数据
*MODIFYDATE:
2009/11/12
*INPUT:
无*
*RETURN:
读取的数据
***************************************************************************/
UCHARReadByte(void)
{
UCHARi;
UCHARdat=0;
BITbt;
bt=ET0;
ET0=0;
for(i=0;i<8;i++)
{
dat>>=1;
DQ=0;
Delay5us();
DQ=1;
Delay5us();
if(1==DQ)
{
dat|=0x80;
}
Delay70us
(1);
}
ET0=bt;
return(dat);
}
/***************************************************************************
*FUNCTIONNAME:
WriteByte
*CREATEDATE:
2009/11/12
*CREATEDBY:
XS
*FUNCTION:
向DS18B20中写入一个字节的数据
*MODIFYDATE:
2009/11/12
*INPUT:
写入的数据*
*RETURN:
无
***************************************************************************/
voidWriteByte(UCHARwDat)
{
UCHARi;
BITbt;
bt=ET0;
ET0=0;
for(i=0;i<8;i++)
{
DQ=0;
Delay5us();
if((wDat&0x01)!
=0)
{
DQ=1;
}
else
{
DQ=0;
}
Delay70us
(1);
DQ=1;
Delay5us();
wDat>>=1;
}
ET0=bt;
}
/***************************************************************************
*FUNCTIONNAME:
ReadDs18b20
*CREATEDATE:
2009/11/12
*CREATEDBY:
XS
*FUNCTION:
从DS18B20储存器中读取多字节数据
*MODIFYDATE:
2009/11/12
*INPUT:
读取数据存入的地址和需要读取数据的数量*
*RETURN:
无
***************************************************************************/
voidReadScrat(UCHAR*prDat,UCHARnum)
{
UCHARi;
for(i=0;i{
*prDat=ReadByte();
prDat++;
}
}
/***************************************************************************
*FUNCTIONNAME:
ReadTemp
*CREATEDATE:
2009/11/12
*CREATEDBY:
XS
*FUNCTION:
读取温度
*MODIFYDATE:
2009/11/12
*INPUT:
读取的温度存入的地址*
*RETURN:
成功返回1,否则返回0
***************************************************************************/
BOOLReadTemp(float*prTemperature)
{
UCHARcounter=0;
UCHARtempBuff[9];
floattempDat=0;
ClrWDT();
while
(1)
{
if(InitDs18b20())
{
counter=0;
break;
}
else
{
counter++;
if(counter>=ERR_COUNTER)//连续3次初始化失败,即认为DS18B20出现故障
{
return0;
}
}
}
WriteByte(SKIP_ROM);//跳过读序号列号的操作
WriteByte(CONVERT_T);//启动温度转换
Delay70us(20);//延时至少500us,以供温度转换
while
(1)
{
if(InitDs18b20())
{
counter=0;
break;
}
else
{
counter++;
if(counter>=ERR_COUNTER)//连续3次初始化失败,即认为DS18B20出现故障
{
return0;
}
}
}
WriteByte(SKIP_ROM);//跳过读序号列号的操作
WriteByte(READ_SCRAT);//读取温度寄存器等(共可读9个寄存器)
ReadScrat(tempBuff,9);
if(0==CRC8(tempBuff,9))
{
if(0==(tempBuff[1]&0x80))//为正温度
{
tempDat=(tempBuff[1]&0x07)*0x100+tempBuff[0];
}
else
{
tempDat=((0xFF-tempBuff[1])&0x07)*0x100+(0x100-tempBuff[0]);
tempDat=-tempDat;
}
*prTemperature=tempDat*0.0625;
returnTRUE;
}
returnFALSE;
}
/***************************************************************************
*FUNCTIONNAME:
GetDS18B20Temperature
*CREATEDATE:
2009/8/17
*CREATEDBY:
XS
*FUNCTION:
采样3次求均值作为温度值
*MODIFYDATE:
2009/8/17
*INPUT:
温度储存的地址*
*RETURN:
正常为1,故障为0
***************************************************************************/
BOOLGetDS18B20Temperature(float*pgTemperature)
{
UCHARi;
UCHARcounter=0;
floattempDat=0;
floattempVal=0;
for(i=0;i<3;)
{
if(ReadTemp(&tempDat))
{
tempVal+=tempDat;
counter=0;
i++;
}
else
{
counter++;
if(counter>=ERR_COUNTER)//连续10次温度采样错误,则判断为故障,并返回
{
returnFALSE;
}
}
}
*pgTemperature=tempVal/3;
//SendStr("boxTemp:
");
//print(*pgTemperature,1);
//SendChar('\n');
returnTRUE;
}
/***************************************************************************
*FUNCTIONNAME:
CRC8
*CREATEDATE:
2009/8/17
*CREATEDBY:
XS
*FUNCTION:
CRC效验
*MODIFYDATE:
2009/8/17
*INPUT:
需要效验的数据地址和个数*
*RETURN:
效验结果
***************************************************************************/
UCHARCRC8(UCHAR*point,UCHARCRClen)//效验成功则crc返回0
{
UCHARi,j,crc_8,crcbuff;
crc_8=0;
for(i=0;i{
crcbuff=*point++;
for(j=0;j<8;j++)
{
if(((crc_8^crcbuff)&0x01)==0)
{
crc_8>>=1;
}
else
{
crc_8^=0x18;
crc_8>>=1;
crc_8|=0x80;
}
crcbuff>>=1;
}
}
returncrc_8;
}
/***************************************************************************
*FUNCTIONNAME:
Delay5us
*CREATEDATE:
2009/8/17
*CREATEDBY:
XS
*FUNCTION:
延时5us
*MODIFYDATE:
2009/8/17
*INPUT:
无*
*RETURN:
无
***************************************************************************/
voidDelay5us(void)
{
//UCHARi;
//for(i=0;i<7;i++);
_nop_();
_nop_();
}
#endif
/***************************************************************************
*FUNCTIONNAME:
Delay70us
*CREATEDATE:
2009/8/17
*CREATEDBY:
XS
*FUNCTION:
延时70us
*MODIFYDATE:
2009/8/17
*INPUT:
次数*
*RETURN:
无
***************************************************************************/
voidDelay70us(UCHARtimers)
{
UCHARi,j;
for(j=0;j{
for(i=0;i<22;i++)
{
//Delay5us();
_nop_();
_nop_();
_nop_();
}
}
}