温度传感器DS18B20驱动程序.docx

上传人:b****3 文档编号:10244043 上传时间:2023-05-24 格式:DOCX 页数:14 大小:16.67KB
下载 相关 举报
温度传感器DS18B20驱动程序.docx_第1页
第1页 / 共14页
温度传感器DS18B20驱动程序.docx_第2页
第2页 / 共14页
温度传感器DS18B20驱动程序.docx_第3页
第3页 / 共14页
温度传感器DS18B20驱动程序.docx_第4页
第4页 / 共14页
温度传感器DS18B20驱动程序.docx_第5页
第5页 / 共14页
温度传感器DS18B20驱动程序.docx_第6页
第6页 / 共14页
温度传感器DS18B20驱动程序.docx_第7页
第7页 / 共14页
温度传感器DS18B20驱动程序.docx_第8页
第8页 / 共14页
温度传感器DS18B20驱动程序.docx_第9页
第9页 / 共14页
温度传感器DS18B20驱动程序.docx_第10页
第10页 / 共14页
温度传感器DS18B20驱动程序.docx_第11页
第11页 / 共14页
温度传感器DS18B20驱动程序.docx_第12页
第12页 / 共14页
温度传感器DS18B20驱动程序.docx_第13页
第13页 / 共14页
温度传感器DS18B20驱动程序.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

温度传感器DS18B20驱动程序.docx

《温度传感器DS18B20驱动程序.docx》由会员分享,可在线阅读,更多相关《温度传感器DS18B20驱动程序.docx(14页珍藏版)》请在冰点文库上搜索。

温度传感器DS18B20驱动程序.docx

温度传感器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_();

}

}

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2