温度传感器DS18B20驱动程序之欧阳术创编.docx
- 文档编号:17452049
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:13
- 大小:16.91KB
温度传感器DS18B20驱动程序之欧阳术创编.docx
《温度传感器DS18B20驱动程序之欧阳术创编.docx》由会员分享,可在线阅读,更多相关《温度传感器DS18B20驱动程序之欧阳术创编.docx(13页珍藏版)》请在冰点文库上搜索。
温度传感器DS18B20驱动程序之欧阳术创编
#include"ds18b20.h"
时间:
2021.02.02
创作:
欧阳术
#include
#if0
/***************************************************************************
*FUNCTIONNAME:
InitDS18b20
*CREATEDATE:
/11/12
*CREATEDBY:
XS
*FUNCTION:
复位DS18B20和检测存在脉冲
*MODIFYDATE:
/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);//6075us之间
if(0==DQ)
{
flag=TRUE;
}
Delay70us(8);//复位后大于480us延时
ET0=bt;
returnflag;
}
/***************************************************************************
*FUNCTIONNAME:
ReadByte
*CREATEDATE:
/11/12
*CREATEDBY:
XS
*FUNCTION:
从DS18B20中读取一个字节的数据
*MODIFYDATE:
/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:
/11/12
*CREATEDBY:
XS
*FUNCTION:
向DS18B20中写入一个字节的数据
*MODIFYDATE:
/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:
/11/12
*CREATEDBY:
XS
*FUNCTION:
从DS18B20储存器中读取多字节数据
*MODIFYDATE:
/11/12
*INPUT:
读取数据存入的地址和需要读取数据的数量*
*RETURN:
无
***************************************************************************/
voidReadScrat(UCHAR*prDat,UCHARnum)
{
UCHARi;
for(i=0;i { *prDat=ReadByte(); prDat++; } } /*************************************************************************** *FUNCTIONNAME: ReadTemp *CREATEDATE: /11/12 *CREATEDBY: XS *FUNCTION: 读取温度 *MODIFYDATE: /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=((0xFFtempBuff[1])&0x07)*0x100+(0x100tempBuff[0]); tempDat=tempDat; } *prTemperature=tempDat*0.0625; returnTRUE; } returnFALSE; } /*************************************************************************** *FUNCTIONNAME: GetDS18B20Temperature *CREATEDATE: /8/17 *CREATEDBY: XS *FUNCTION: 采样3次求均值作为温度值 *MODIFYDATE: /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: /8/17 *CREATEDBY: XS *FUNCTION: CRC效验 *MODIFYDATE: /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: /8/17 *CREATEDBY: XS *FUNCTION: 延时5us *MODIFYDATE: /8/17 *INPUT: 无* *RETURN: 无 ***************************************************************************/ voidDelay5us(void) { //UCHARi; //for(i=0;i<7;i++); _nop_(); _nop_(); } #endif /*************************************************************************** *FUNCTIONNAME: Delay70us *CREATEDATE: /8/17 *CREATEDBY: XS *FUNCTION: 延时70us *MODIFYDATE: /8/17 *INPUT: 次数* *RETURN: 无 ***************************************************************************/ voidDelay70us(UCHARtimers) { UCHARi,j; for(j=0;j { for(i=0;i<22;i++) { //Delay5us(); _nop_(); _nop_(); _nop_(); } } } 时间: 2021.02.02 创作: 欧阳术
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度传感器 DS18B20 驱动程序 欧阳 创编