📄 ds18b20.h
字号:
//===========================================
//DS18B20 drive
//===========================================
#include <intrins.h>
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*----------------引脚定义-----------------*/
sbit DQ=P2^7;
/*----------------变量定义-----------------*/
uchar code offset=2; //温度显示时第一位数字的x方向的偏移量
uchar code ty=0; //温度显示在y方向的位置
uchar code SKROM=0xcc; //跳过ROM读取的指令
static uchar code CONVT=0x44; //温度转换指令
uchar code RROM=0x33; //读取ROM指令
uchar code WSCR=0x4e; //写寄存器指令
uchar code RPOW=0xb4; //读取电源类型指令
uchar code RSCR=0xbe; //读取寄存器指令
//uchar code MROM=0x55; //匹配ROM指令
uchar data f_t=1;
uchar data TEMPL=0;
uchar data TEMPM=0;
uchar data TH=0;
uchar data TL=0;
uchar data CONF=0;
uchar data FamilyCode=0;
uchar data SerialNumber[6];
uchar data CRC=0;
/*----------------函数定义-----------------*/
//===========================================
//函数名称:timer0()
//函数功能:产生较准确的定时中断
//===========================================
void timer0() interrupt 1 using 0
{
f_t=0;
}
//===========================================
//函数名称:delay(uint t)
//函数功能:延时
//===========================================
void delay(uint t)
{
uint i=0;
for(i=0;i<t;i++);
}
//----------------------------------------
//函数名称:ShowByte(uchar x,uchar y,uchar num)
//功能描述:以二进制显示一个字节中数据
//----------------------------------------
void ShowByte(uchar x,uchar y,uchar num)
{
uchar i=0;
uchar str[8];
str[8]='\0';
for(i=0;i<8;i++)
str[i]=(num>>(7-i))&0x01;
for(i=0;i<8;i++)
{
write_LCD_char(x+i,y,str[i]+'0');
}
}
//===========================================
//函数名称:WriteDQ(uchar num)
//函数功能:写数据线一位
//===========================================
void WriteDQ(uchar num)
{
if(num==0)
{
DQ=0;
f_t=1;
TH0=0xff;
TL0=0x60;
TR0=1;
while(f_t);
TR0=0;
DQ=1;
_nop_();
_nop_();
_nop_();
_nop_();
}
else
{
DQ=0;
f_t=1;
TH0=0xff;
TL0=0xf6;
TR0=1;
while(f_t);
TR0=0;
f_t=1;
DQ=1;
TH0=0xff;
TL0=0x60;
TR0=1;
while(f_t);
TR0=0;
}
}
//===========================================
//函数名称:ReadDQ()
//函数功能:读数据线
//===========================================
uchar ReadDQ()
{
DQ=0;
f_t=1;
TH0=0xff;
TL0=0xe2;
TR0=1;
while(f_t);
TR0=0;
DQ=1;
return DQ;
}
//===========================================
//函数名称:Reset()
//函数功能:产生复位信号
//===========================================
void Reset()
{
DQ=0;
f_t=1;
TH0=0xfb;
TL0=0x7e;
TR0=1;
while(f_t);
TR0=0;
DQ=1;
_nop_();
_nop_();
_nop_();
_nop_();
}
//===========================================
//函数名称:WriteByte(uchar COMM)
//函数功能:写入一个字节
//===========================================
void WriteByte(uchar COMM)
{
uchar i=0;
for(i=0;i<8;i++)
{
if((COMM>>i)&0x01)
WriteDQ(1);
else
WriteDQ(0);
}
}
uchar ReadByte()
{
uchar i=0,in=0,temp=0;
for(i=0;i<8;i++)
{
temp=ReadDQ();
if (temp==1)
in=(in>>1)|0x80;
else
in=(in>>1)&0x7f;
}
return in;
}
//===========================================
//函数名称:Init()
//函数功能:初始化系统
//===========================================
uchar Init()
{
uchar f_i=0;
DQ=0; //
f_t=1;
TH0=0xfb; //延时600us
TL0=0x50; //产生复位脉冲
TR0=1;
while(f_t);
TR0=0;
DQ=1; //
f_t=1; //
TH0=0xff; //延时80us
TL0=0x60;
TR0=1; //
while(f_t);
TR0=0;
f_i=!DQ;
do{}while(!DQ);
return f_i; //成功返回1 失败返回0
}
//===========================================
//函数名称:WriteSCR(uchar TH,uchar TL,uchar config)
//函数功能:写寄存器
//===========================================
void WriteSCR(uchar TH,uchar TL,uchar CONFIG)
{
WriteByte(WSCR);
WriteByte(TH);
WriteByte(TL);
WriteByte(CONF);
Reset();
while(!Init());
}
//===========================================
//函数名称:ReadSCR()
//函数功能:读寄存器
//===========================================
void ReadSCR()
{
uchar i=0,p[8];
WriteByte(SKROM);
WriteByte(RSCR);
for(i=0;i<8;i++)
{
p[i]=ReadByte();
}
Reset();
while(!Init());
TEMPL=p[0];
TEMPM=p[1];
TH=p[2];
TL=p[3];
CONF=p[4];
}
//===========================================
//函数名称:ReadPower()
//函数功能:读取电源类型
//===========================================
uchar ReadPower()
{
WriteByte(RPOW);
Reset();
while(!Init());
return DQ; //0为电容电源,1为外部电源
}
//===========================================
//函数名称:ConvT()
//函数功能:转化温度
//===========================================
void ConvT()
{
WriteByte(SKROM);
WriteByte(CONVT);
DQ=1;
while(!DQ);
Reset();
while(!Init());
}
//----------------------------------------
//函数名称:ShowT()
//功能描述:将读出的温度显示
//----------------------------------------
void ShowT()
{
uchar data tstr[9];
uchar data WTEMPL[8];
uchar data WTEMPM[8];
uchar data i=0;
uint data sum=0; //整数位和
for(i=0;i<8;i++)
WTEMPL[i]=(TEMPL>>i)&0x01;
for(i=0;i<8;i++)
WTEMPM[i]=(TEMPM>>i)&0x01;
sum=WTEMPL[4]+WTEMPL[5]*2+WTEMPL[6]*4+WTEMPL[7]*8
+WTEMPM[0]*16+WTEMPM[1]*32+WTEMPM[2]*64;
if(WTEMPM[3]) tstr[0]='-';
else tstr[0]=' ';
if(WTEMPL[0]) tstr[8]='5';
else tstr[8]='0';
if(WTEMPL[1])
{
switch(tstr[8])
{
case '0':tstr[7]='5';break;
case '5':tstr[7]='7';break;
default: tstr[7]='0';
}
}
else
{
switch(tstr[8])
{
case '0':tstr[7]='0';break;
case '5':tstr[7]='2';break;
default: tstr[7]='0';
}
}
if(WTEMPL[2])
{
switch(tstr[7])
{
case '0':tstr[6]='5';break;
case '2':tstr[6]='1';break;
case '5':tstr[6]='7';break;
case '7':tstr[6]='3';break;
default: tstr[6]='0';
}
}
else
{
switch(tstr[7])
{
case '0':tstr[6]='0';break;
case '2':tstr[6]='6';break;
case '5':tstr[6]='2';break;
case '7':tstr[6]='8';break;
default: tstr[6]='0';
}
}
if(WTEMPL[3])
{
switch(tstr[6])
{
case '0':tstr[5]='5';break;
case '1':tstr[5]='8';break;
case '2':tstr[5]='6';break;
case '3':tstr[5]='9';break;
case '5':tstr[5]='7';break;
case '6':tstr[5]='5';break;
case '7':tstr[5]='8';break;
case '8':tstr[5]='6';break;
default: tstr[5]='0';
}
}
else
{
switch(tstr[6])
{
case '0':tstr[5]='0';break;
case '1':tstr[5]='3';break;
case '2':tstr[5]='1';break;
case '3':tstr[5]='4';break;
case '5':tstr[5]='2';break;
case '6':tstr[5]='0';break;
case '7':tstr[5]='3';break;
case '8':tstr[5]='1';break;
default: tstr[5]='0';
}
}
tstr[4]='.';
if(WTEMPM[0]&&WTEMPM[1]&&WTEMPM[2])
{
tstr[1]='1';
}
else tstr[1]=' ';
tstr[2]=(sum%100)/10+'0';
tstr[3]=sum%10+'0';
/* for(i=0;i<8;i++)
{
write_LCD_char(7-i,0,WTEMPL[i]+'0');
}
write_LCD_str(0,1,"TEML");
for(i=0;i<8;i++)
{
write_LCD_char(15-i,0,WTEMPM[i]+'0');
}*/
for(i=0;i<9;i++)
{
write_LCD_char(offset+i,ty,tstr[i]);
}
write_LCD_char(offset+9,ty,0);
}
//----------------------------------------
//函数名称:ReadFamilyCode()
//功能描述:读取器件的FamilyCode
//----------------------------------------
void ReadFamilyCode()
{
while(!Init());
WriteByte(RROM);
FamilyCode=ReadByte();
while(!Init());
}
//----------------------------------------
//函数名称:ReadSerialNumber()
//功能描述:读取器件的SerialNumber
//----------------------------------------
void ReadSerialNumber()
{
uchar i=0;
while(!Init());
WriteByte(RROM);
ReadByte(); //跳过FamilyCode的读取
for(i=0;i<6;i++)
{
SerialNumber[i]=ReadByte();
}
while(!Init());
}
//----------------------------------------
//函数名称:ReadCrc()
//功能描述:读取器件的CRC
//----------------------------------------
void ReadCrc()
{
uchar i=0;
while(!Init());
WriteByte(RROM);
for(i=0;i<7;i++) ReadByte();
CRC=ReadByte();
while(!Init());
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -