📄 ds18b20_5.h
字号:
/*
功能:驱动温度传感器DS18B20工作。
资源:P1.7口(DQ),FamilyID[8] 器件ID值
使用:12M晶振 采用GetTemperature()函数进行温度采集。返回整型值。
修改日期:2007年6月27日
修改人:zx
*/
unsigned char FamilyID[8];
sbit DQ=P1^5;//数据信号
//unsigned char TH_0,TL_0;
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
}
}
/*********************************************************************************************************
** 函数名称: void delay15
** 功能描述: 精确延时15uS
** 输 入: 无
** 输 出: 无
** 备注: 12M晶体
** 作 者: Shark
** 日 期: 2003年8月13日
**-------------------------------------------------------------------------------------------------------
** 修 改:Shark
** 日 期: 2003年8月18日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void delay15()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************************************************************
** 函数名称: delay15x
** 功能描述: 延时15uS的整数倍
** 输 入: (unsigned char)t:延迟时间=t*15uS
** 输 出: 无
** 备注: 12M晶体
** 作 者: Shark
** 日 期: 2003年8月13日
**-------------------------------------------------------------------------------------------------------
** 修 改:Shark
** 日 期: 2003年8月18日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void delay15x(unsigned char t)
{ if(t==0) return;
for(;t>0;t--)
{ delay15();
}
}
/*********************************************************************************************************
** 函数名称: OW_Reset
** 功能描述: 1-Wire总线复位
** 输 入: void
** 输 出: 1bit: 1:总线上有器件 0:总线上无器件
** 调用模块: delay15x delay15
** 备注: 12M晶体
** 作 者: Shark
** 日 期: 2003年8月13日
**-------------------------------------------------------------------------------------------------------
** 修 改:Shark
** 日 期: 2003年8月18日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
bit OW_Reset(void)//复位
{ unsigned char i;
DQ = 0; //pull DQ line low
delay15x(30); // leave it low for 480~960us (700uS)
DQ = 1; // allow line to return high
delay15x(2); // wait for presence 15~60uS ( 56uS)
for(i=0;i<15;i++)
{
if (DQ==0)
{
while(!DQ) {};// 复位成功,等待复位结束
return(1); // 并返回1,表示有器件
}
delay15(); // 不成功,可能是1820反应慢,重试15次
}
return(0);// 到达240uS等待最大值,放弃.返回0,表示无器件
}
/*********************************************************************************************************
** 函数名称: OW_ReadByte
** 功能描述: 从 1-wire 总线上读取一个字节
** 输 入: void
** 输 出: 1Byte: 读取的1字节数据
** 调用模块: delay15x
** 备注: 12M晶体
** 作 者: Shark
** 日 期: 2003年8月13日
**-------------------------------------------------------------------------------------------------------
** 修 改:Shark
** 日 期: 2003年8月18日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
unsigned char OW_ReadByte(void)
{
unsigned char i;
unsigned char value = 0;
bit PEA;
PEA=EA;
for (i=8;i>0;i--)
{
value>>=1;
EA=0;
DQ = 0; // pull DQ low to start timeslot
_nop_();
_nop_(); //保持低,1uS以上 (3uS)
DQ = 1; // then return high
//delay15x(0); //Delay 1uS~15uS (12uS)
_nop_();
_nop_();
_nop_(); //4uS
if(DQ) value|=0x80;
EA=PEA;
delay15x(5); // wait for rest of timeslot
}
return(value);
}
/*********************************************************************************************************
** 函数名称: OW_WriteByte
** 功能描述: 向 1-WIRE 总线上写一个字节
** 输 入: var:写入的1字节数据
** 输 出: 无
** 调用模块: delay15x
** 备注: 12M晶体
** 作 者: Shark
** 日 期: 2003年8月13日
**-------------------------------------------------------------------------------------------------------
** 修 改:Shark
** 日 期: 2003年8月18日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OW_WriteByte(char val)
{
unsigned char i;
for (i=8; i>0; i--) // writes byte, one bit at a time
{
DQ = 0; // pull DQ low to start timeslot
//保持低,1uS以上 (3uS)
DQ = val&0x01;
delay15x(3); // hold value for remainder of timeslot 60~120uS Total (85uS)
DQ = 1;
val=val>>1;
delay15();
}
//delay15x(5);
}
/*********************************************************************************************************
** 函数名称: Conv_1820
** 功能描述: 命令1820开始温度转换
** 输 入: 无
** 输 出: 无
** 调用模块: OW_Reset OW_WriteByte
** 备注: 12M晶体
** 作 者: Shark
** 日 期: 2003年8月13日
**-------------------------------------------------------------------------------------------------------
** 修 改:Shark
** 日 期: 2003年8月18日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Conv_1820()
{
OW_Reset();
OW_WriteByte(0xCC); //Skip ROM
OW_WriteByte(0x44); // Start Conversion
}
/*********************************************************************************************************
** 函数名称: ReadFamily_1820
** 功能描述: 读取1820型号系列代码
** 输 入: 无
** 输 出:Byte:系列代码
** 全局变量: 无
** 调用模块: OW_Reset OW_WriteByte OW_ReadByte
** 备注: 12M晶体
** 作 者: Shark
** 日 期: 2003年8月13日
**-------------------------------------------------------------------------------------------------------
** 修 改:Shark
** 日 期: 2003年8月18日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
unsigned char ReadFamily_1820()
{ //unsigned char FamilyID;
uchar i;
OW_Reset();
OW_WriteByte(0x33);
for(i=0;i<8;i++)
FamilyID[i]=OW_ReadByte();
return(FamilyID[0]);
}
/*********************************************************************************************************
** 函数名称: ReadTemp_1820
** 功能描述: 读取1820转换结果 (自动识别型号)
** 输 入: Kinds:精度设置(0:精确到小数点后一位;1,精确到小数点后2位)
** 输 出: (int)正常工作时:温度*10 总线无器件:0xf0ff 器件无法识别:0xfcff
** 全局变量: 无
** 调用模块: OW_Reset OW_WriteByte OW_ReadByte ReadFamily_1820
** 备注: 12M晶体
** 作 者: Shark
** 日 期: 2003年8月13日
**-------------------------------------------------------------------------------------------------------
** 修 改:lsl
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int ReadTemp_1820(unsigned char Kinds)
{
unsigned char tempH,tempL,Family;
// char k;
unsigned int TemMid;
float KindsNum;
if(Kinds==0)KindsNum=0.625;
else KindsNum=6.25;
if(OW_Reset()==0) return(0xf0ff);//无器件,返回f0ff
Family=ReadFamily_1820();
OW_Reset();
OW_WriteByte(0xCC); // Skip ROM
OW_WriteByte(0xBE); // Read Scratch Pad
delay15x(5);
tempL=OW_ReadByte();
tempH=OW_ReadByte();
TemMid=((unsigned int)tempH) << 8;
TemMid=TemMid+tempL;
if (Family==0x28)//如果是18B20系列
{
if((TemMid&0x8000)==0x8000)
{
TemMid=~TemMid+1;
TemMid=TemMid*KindsNum;
TemMid=~(TemMid-1);
return(TemMid);
}
else return(TemMid*KindsNum);
}
else if(Family==0x10)//如果是1820系列
{
if(Kinds==0)KindsNum=5;
else KindsNum=50;
if((TemMid&0x8000)==0x8000)
{
TemMid=~TemMid+1;
TemMid=TemMid*5;
return(TemMid);
}
else return(TemMid*5);
}
else return(0xfcff);//其它型号无法识别 返回fcff
}
uint GetTemperature(void)
{
uint value;
uchar i;
EA=0;
Conv_1820();
EA=1;
for(i=0;i<100;i++)delay15x(255);
EA=0;
value=ReadTemp_1820(0);
EA=1;
return(value);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -