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

📄 ds18b20.c

📁 通过AT89S/C52,11.0592MHz,DS18B20采集温度。仅包括4个函数
💻 C
字号:
/******************************************************************************/
/**
/** 功能描述:通过AT89S/C52,DS18B20和6位数码管,采集温度并在数码管上实时显示。
/**			  并有相应的不同颜色的led和蜂鸣器指示。
/** 创 建 人:chiusir@yahoo.cn	日期:2008-04-06   							  */
/** 修 改 人:                 	日期:2008-04-18   							  */ 
/** 其他说明: 
/******************************************************************************/
#include<regx51.h>
#include <intrins.h>

#define U8  unsigned char
#define U16 unsigned int

sbit SIO = P2^0;

/*******************************************************************************
*** 函 数 名: void DLY_us(U8 x)
*** 功能描述: 微秒级延时;
*** 全局变量: NO !
*** 输		入: x !
*** 输		出: NO !  
*** 修 改 人:			 							日期:2008-04-18
*** 函数说明:
*** //1-5,2-7,3-9 ,5--16.5us,10-30.4,22-52,25-58,35-78,61-125,125-250,250--500us 
/******************************************************************************/
void DLY_us(U8 x)		//x取值1~255;
{
	while(--x);	 		
}
/*******************************************************************************
*** 函 数 名: void DLY_ms(U16 x)
*** 功能描述: 毫秒级延时;
*** 全局变量: NO !
*** 输		入: U16 x !
*** 输		出: NO !  
*** 修 改 人:			 							日期:2008-04-18
*** 函数说明: 
/******************************************************************************/
void DLY_ms(U8 x)		//x取值1~255;
{
	U8 i,j;
	for(i=0;i<x;i++)
		for(j=0;j<200;j++)
		{
			_nop_();
			_nop_();
		}
} 

/*******************************************************************************
*** 函 数 名: void Init1820()
*** 功能描述: 
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: NO !  
*** 修 改 人:			 							日期:2008-04-18
*** 函数说明: 
/******************************************************************************/
void Init1820()
{
	 SIO = 1; 
	 _nop_();
	 SIO = 0;      //拉低数据线,准备Reset OneWire Bus;
	 DLY_us(125);  //延时500us,Reset One-Wire Bus.
	 DLY_us(125);
	 
	 SIO = 1;      //提升数据线;
	 DLY_us(15);   //延时35us;
	 
	 while(SIO)    //等待Slave 器件Ack 信号;
	 {
	 	_nop_(); 
	 }
	 DLY_us(60);   //延时125us; 
	 SIO = 1;      //提升数据线,准备数据传输;
}

/*******************************************************************************
*** 函 数 名: static void DS18B20_WR(U8 cmd)
*** 功能描述: 写一个字节;
*** 全局变量: NO !
*** 输		入: cmd:8bit;
*** 输		出: NO !   
*** 函数说明: cmd主要有Rom操作指令和E2Ram操作指令两种;
/******************************************************************************/
void WR1820(U8 cmd)
{
    U8 i;
	for(i=0;i<8;i++)
	{
		if(cmd & 0x01)  	//低位在前;
	    {
			SIO = 0;    	//结束Recovery time;
	    	_nop_();
			_nop_();
			_nop_();
	    	SIO = 1;   
		} 					//发送数据;
	   else
	   		SIO = 0;    	//结束Rec time;
	   _nop_();
	   _nop_();
	   _nop_();  
	    //SIO = 0;  } 		//发送数据;
	   DLY_us(30);  		//等待Slave Device采样;
	   SIO = 1;      		//Recovery;
	   _nop_();      		//Recovery Time Start;
	   cmd >>= 1;
	} 
}

/*******************************************************************************
*** 函 数 名: U8 RD1820(void)
*** 功能描述: 读取一个字节;
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: 8bit data;*
*** 函数说明: 读之前必须首先写1;
/******************************************************************************/
U8 RD1820(void)
{
	U8 i;
	U8 tmp=0;
	SIO = 1;  
	_nop_();     			//准备读;
	for(i=0;i<8;i++)
	{
	  tmp >>= 1;    		//低位先发;
	  SIO = 0;     			//Read init;
	  _nop_();     			//1us;
	  SIO = 1;      		//必须写1,否则读出来的将是不预期的数据;
	  DLY_us(2);   			//延时7us;
	  _nop_();
	  if(SIO)      			//在12us处读取数据;
	   	tmp |= 0x80;
	  DLY_us(30);  			//延时55us;
	  SIO = 1;   
	  _nop_();   			//恢复One Wire Bus;
	}
	return tmp; 
 }

/*******************************************************************************
*** 函 数 名: U16 RD_T();
*** 功能描述: 读取温度;
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: 16bit data;
*** 函数说明: 读之前必须首先写1;
/******************************************************************************/
U16 RD_T()
{  
	U16 tp;
	U8 tmbuf[2];
    Init1820();
    WR1820(0xcc);
 	//delay_ms(2);
    WR1820(0x44);
  	// _nop_();
	// SIO=1;
	// delay_ms(250);     //多个1820时要延时,单个就不用,数据手册里看
	// delay_ms(250);
	// delay_ms(250);
    Init1820();
    WR1820(0xcc);
    WR1820(0xbe);
    tmbuf[0]=RD1820();
    tmbuf[1]=RD1820();
    Init1820();
    tp=tmbuf[1]*256+tmbuf[0];    
    return(tp);    
}

/*******************************************************************************
****                              End Of File
*******************************************************************************/

⌨️ 快捷键说明

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