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

📄 ds18b20_driver.c

📁 该压缩包内还有51单片机常用各类外设驱动C程序源码(128*64点阵屏
💻 C
字号:
#include "AT89S52.H"
#include "CONFIG.H"
#include <intrins.h>

#define SKIP_ROM  		0xCC
#define CONVERT_T 		0x44
#define READ_SCRATCHPAD	0xBE

sbit DQ=P2^6;

uchar data WLSB;
uchar data WMSB;
uchar data TH;
uchar data TL;
uchar data CONFIG;
uchar data COUNT_REMAIN;
uchar data COUNT_PER_C;
uchar data CRC;
uchar bdata T_BUF;
sbit T_BUF_0=T_BUF^0;

uchar data TEMPERATURE_INT,SIGN;
uint  data TEMPERATURE_FLOAT;

/*****************************
		存在脉冲检测		 *
*****************************/
bit T_Check(void)
{
uchar data i;
for(i=0;i<20;i++);//62US
if(DQ) return 0;
for(i=0;i<160;i++);//482US
return 1;
}

/*****************************
		复位脉冲			 *
*****************************/
void Rst(void)
{
uchar data i;
DQ=1;
DQ=0;
for(i=0;i<166;i++);//500US
DQ=1;
}

/****************************
		读1位				*
****************************/
void Read(void)
{
uchar data i;
DQ=1;
DQ=0;
_nop_();
_nop_();
DQ=1;
for(i=0;i<3;i++);//11US
T_BUF_0=DQ;
for(i=0;i<17;i++);//53US
}

/****************************
		读1字节				*
****************************/
uchar Read_Byte(void)
{
uchar data i;
T_BUF=0;
	for(i=0;i<8;i++)
		{
			Read();
			T_BUF=_cror_(T_BUF,1);
		}
	return T_BUF;
}

/****************************
		写0					*
****************************/
void Write_0(void)
{
uchar data i;
DQ=1;
DQ=0;
for(i=0;i<21;i++);//65US
DQ=1;
}

/****************************
		写1					*
****************************/
void Write_1(void)
{
uchar data i;
DQ=1;
DQ=0;
for(i=0;i<1;i++);//5US
DQ=1;
for(i=0;i<20;i++);//62US
}

/****************************
		发送一字节			*
****************************/
void Send_Byte(uchar dat)
{
uchar data i;
T_BUF=dat;
	for(i=0;i<8;i++)
		{
			if(T_BUF_0) Write_1();
			else      Write_0();
			T_BUF=_cror_(T_BUF,1);
		}

}

/****************************************
			温度值翻译程序				*
****************************************/
void Trans(void)
{
SIGN=WMSB>>4;
	if(SIGN>0)
	{
		WMSB=~WMSB;
		WLSB=~WLSB;
		WLSB++;
	}
TEMPERATURE_INT=((WLSB>>4)+(WMSB<<4));
TEMPERATURE_FLOAT=(WLSB&0x0f)*625;
}

/****************************************
			温度转换程序				*
****************************************/
void Convert(void)
{

do{
	Rst();
  } 
while(!T_Check());

	Send_Byte(SKIP_ROM);
	Send_Byte(CONVERT_T);
	while(Read_Byte()!=0xff);

do{
	Rst();
  } 
while(!T_Check());

	Send_Byte(SKIP_ROM);
	Send_Byte(READ_SCRATCHPAD);
	WLSB=Read_Byte();
	WMSB=Read_Byte();
	/*
	TH=Read_Byte();
	TL=Read_Byte();
	CONFIG=Read_Byte();
	Read_Byte();
	COUNT_REMAIN=Read_Byte();
	COUNT_PER_C=Read_Byte();
	CRC=Read_Byte();
	*/
	Rst();
	Trans();
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -