⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.h

📁 基于8051的DS18B20的数字温度计源程序,可以精确到2个小数点位
💻 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 + -