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

📄 ds18b20.c

📁 利用DS18B20
💻 C
字号:
/*******************************************************************
**函数功能:ds18b20的驱动函数									  **
**创建人:xingyuegu												  **
**创建日期:2006-7-12											  **
**版本:1.0														  **
**修改日期:2006-10-30										  	  **
**版本:2.0														  **
*******************************************************************/
#include <reg51.h>
#include <intrins.h>
#include <math.h>

#define uchar unsigned char
#define uint  unsigned int

void process(unsigned char,unsigned char);
extern char xiaoshu_temp[4],zhen_temp[4]; 
extern bit flag;
extern bit dot_dis;
sbit DQ=P1^0;
bit v;
/*************************************************************
**功能:延时600us											**
**参数:无       											**
*************************************************************/
void delay600us(void)
{
	uchar i;
	for(i=0;i<200;i++);

}
/*************************************************************
**功能:延时60us											**
**参数:无       											**
*************************************************************/
void delay60us(void)
{
	uchar i;
	for(i=0;i<16;i++);
}
/*************************************************************
**功能:延时240us											**
**参数:无       											**
*************************************************************/
void delay240us(void)
{
	uchar i;
	for(i=0;i<80;i++);
}
/*************************************************************
**功能:延时18us											**
**参数:无       											**
*************************************************************/
void delay18us(void)
{
	uchar i;
	for(i=0;i<6;i++);
}
/*************************************************************
**功能:复位脉冲											**
**参数:bool       											**
*************************************************************/
bit resetpulse(void)
{
	
	DQ=0;
	delay600us(); 			//延时500us
	DQ=1;
	delay60us();			// 延时60us
	return(DQ);		 		//读取P1.0的状态
}
/*************************************************************
**功能:ds18b20的初始化										**
**参数:无       											**
*************************************************************/
void ds18b20_init(void)
{
	while(1)
	{
		if(!resetpulse())  	//收到ds18b20的应答信号
		{	
			delay240us();	//延时240us
			DQ=1;
			delay240us();	//延时240us
			break;		
		}
		else
			resetpulse();	 //否则再发复位信号
	}
}

/*************************************************************
**功能:向ds18b20写命令										**
**参数:无       											**
*************************************************************/
void ds18b20_writecommand(uchar command)
{	

	uchar   i;
	for(i=0;i<8;i++)
	{
		if((command & 0x01)==0)
		{
			DQ=0;					//写0
			delay60us();			//延时60us
			DQ=1;			   	
			_nop_();
			_nop_();

		}
	
		else						//写1
		{
		 	DQ=0;
			_nop_();
			_nop_();				//延时2us
			DQ=1;
			delay60us();			//延时60us
		}
		command=_cror_(command,1); // 右移1位
	 }
  
  
}

/*************************************************************
**功能:读ds18b20数据										**
**参数:返回读到的数据										**
*************************************************************/
uchar ds18b20_readdata(void)
{
	uchar readdata;
	uchar i;
	for(i=0;i<8;i++)
	{
		DQ=0;
		_nop_();
		_nop_();
		_nop_();
		DQ=1;		  //释放总线
		delay18us();
		if(DQ==0)	   //如果读到的是0
		{
			readdata=readdata&0x7f;
			delay60us();
		}
		else			//读到的是1
		{
			readdata=readdata|0x80;
			delay60us();
		}
		if(i<7)
		
		readdata=_cror_(readdata,1);
	}
	return readdata;
}

/*************************************************************
**功能:温度处理函数											**
**参数:无返回												**
*************************************************************/
void temperature_process(uchar low,uchar high)
{
	uint temp1,temp2,temp3;
	if(high&0x80)//判断正负
	{
	flag=1;

	temp3=temp3|high;
	temp3=temp3&0x00ff;
	temp3=temp3<<8;
	temp1=temp3;

	temp1=temp1|low;
	
	temp1=(temp1^0xffff);
	temp1=temp1+1;	 //取反加1
	low=temp1&0x000f;
	high=temp1>>4;
		process(high,low);
	}
	else
	{

		flag=0;		 //zhen
		temp1=high;
		temp2=low;
		temp1=temp1<<4;
		temp2=temp2>>4;
		temp3=temp1|temp2;
		high=temp3;
		low=low&0x0f;
		process(high,low);
	
	}
}
/*************************************************************
**功能:数值处理函数											**
**参数:无返回												**
*************************************************************/
void process(unsigned char high,unsigned char low)
{
	 uint temp1;
	 uchar i;
	 temp1=low*625;
	 xiaoshu_temp[0]=temp1/1000+'0';
	 xiaoshu_temp[1]=temp1/100%10+'0';
	 xiaoshu_temp[2]=temp1%100/10+'0';
	 xiaoshu_temp[3]=temp1%10+'0';
	 xiaoshu_temp[4]='\0';
	 
		/*if(xiaoshu_temp[3]=='0')
		{
			xiaoshu_temp[3]=='\0'
			if(xiaoshu_temp[2]=='0')
				{
					xiaoshu_temp[2]=='\0';
					if(xiaoshu_temp[1]=='0')
					{
						xiaoshu_temp[1]=='\0';
						if(xiaoshu_temp[0]=='0')
						{
							xiaoshu_temp[0]=='\0';
							dot_dis=0;
						}
						
							
					}
				}
					
		}

		else
			break; */
	 zhen_temp[0]=high/100+'0';
	 zhen_temp[1]=high%100/10+'0';
	 zhen_temp[2]=high%10+'0';
	 zhen_temp[3]='\0';
	 for(i=0;i<2;i++)
		if(zhen_temp[0]=='0')
			{zhen_temp[0]=zhen_temp[1];
			zhen_temp[1]=zhen_temp[2];
			zhen_temp[2]='\0';
			}
		else
			break;
}

⌨️ 快捷键说明

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