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

📄 ds18b20.c

📁 mega16连接16个DS18B20的温度计,实在厉害的东西
💻 C
字号:
#include <iom16v.h>
#include <macros.h>
 
#define  	BYTE	unsigned char															 
#define 	WORD	unsigned int


/********************************************************************************

                            	位变量操作宏定义

********************************************************************************/
#define		BIT_SET(a,b)	a|=BIT(b)
#define		BIT_CLR(a,b)	a&=~BIT(b)
#define		BIT_INV(a,b)   	a^=BIT(b)
#define		BIT_STATUS(a,b) a&BIT(b)


/********************************************************************************

                            	DS18B20操作定义

********************************************************************************/
#define		CLR_DS18B20		BIT_CLR(PORTD,PD6)		//数据线强制拉低
#define		SET_DS18B20		BIT_SET(PORTD,PD6)		//数据线强制拉高,上拉
#define		HLD_DS18B20		BIT_SET(DDRD,PD6)		//Mega16控制总线
#define		RLS_DS18B20		BIT_CLR(DDRD,PD6)   	 	//释放总线
#define		STU_DS18B20		BIT_STATUS(PIND,PD6)		//数据线的状态
void delayUs(unsigned int temp)
{
 	 while(temp--);

}
/**********************************************************************
functionName: BYTE resetDS18B20(void)
description :DS18B20初始化
**********************************************************************/
BYTE OWReset(void)
{
	BYTE errTime=0;
	RLS_DS18B20;		//释放总线
	_NOP();
	HLD_DS18B20;		//Maga16控制总线
	CLR_DS18B20;		//强制拉低
	delayUs(150);		//209.42us
	delayUs(150);		//209.42us 480us
	RLS_DS18B20;	//释放总线,总线自动上拉
	_NOP();			
	while(STU_DS18B20)	
	{
		delayUs(2);	 	//5.15us
		errTime++;
		if(errTime>14)
		return(0x00);		//如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
	}
	errTime=0;
	while(!(STU_DS18B20))	
	{
		delayUs(2);	 	//5.15us
		errTime++;
		if(errTime>33)
		return(0x00);		//如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
	}
	delayUs(120);
	delayUs(125);
	return(0xff);
}

////////////////////////////////////////////////

unsigned char OWReadBit(void)
{     unsigned char t;
	  	 HLD_DS18B20;	//Maga16控制总线
		CLR_DS18B20;	//强制拉低
		_NOP();
		RLS_DS18B20;		//释放总线,DS18B20会将总线强制拉低
		delayUs(3);
	 if(STU_DS18B20)
		t=1;
		else
		t=0;
		delayUs(8);	 	//14.92us
	    delayUs(8);
		delayUs(8);	 	//14.92us
		RLS_DS18B20;		//释放总线
		 delayUs(12);
		return(t);
		
		
		}
/**********************************************************************
functionName: BYTE readByteDS18B20(void)
description :读DS18B20一个字节
**********************************************************************/
BYTE OWReadbyte(void)
{
	BYTE i;
	BYTE retVal=0;
	RLS_DS18B20;		//释放总线
	for(i=8;i>0;i--)
	{
	 	retVal>>=1;
	  	if(OWReadBit)
		retVal|=0x80; 	
	}
	delayUs(1);	 		//2.71us(大于1us就行了)
	return(retVal);
}
/////////////////////////////////////////
void OWWriteBit(unsigned char temp)
{
        HLD_DS18B20;		//Maga16控制总线
		CLR_DS18B20;		//强制拉低
		 if(temp)
		RLS_DS18B20;		//释放总线
		else
		CLR_DS18B20;		//强制拉低
		delayUs(35);	 	//60us
			 	
		RLS_DS18B20;		//释放总线
		delayUs(50);
		}

/**********************************************************************
functionName: BYTE readByteDS18B20(void)
description :写DS18B20一个字节
**********************************************************************/
void OWWriteByte(BYTE wb)
{
	BYTE i;
	BYTE temp;
	RLS_DS18B20;		//释放总线
	for(i=0;i<8;i++)
	{
		temp=wb>>i;
		temp&=0x01;
		OWWriteBit(temp);	 	
	}
}
///////////////////////////////////////////////
void delayms(void)
{unsigned int i;
int j;
for(j=0;j<10;j++)
{for(i=0;i<40000;i++)
;}
}

/**********************************************************************
functionName: unsigned int readTempDS18B20(void)
description :读DS18B20温度
**********************************************************************/
unsigned int readTempDS18B20(void)
{
	 BYTE tempL,tempH;
	WORD x;
	OWReset();
	OWWriteByte(0xcc); 	//跳过ROM
	OWWriteByte(0x44);		//启动温度转换
	delayms();
	OWReset();
	OWWriteByte(0xcc);		//跳过ROM
	OWWriteByte(0xbe);		//读数据
	tempL=OWReadbyte();
	tempH=OWReadbyte();
	x=(tempH<<8)|tempL;
	return(x);
} 


⌨️ 快捷键说明

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