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

📄 ds18b20.c

📁 针对STC8051单片机的开发包
💻 C
字号:
/****************************************************************
//MCS-51单片机扩展DS18B20底层操作库。
//只在STC89C52单片机上实验过
//硬件接口见hardmap.h文件
//create by changshengwuji 
//email: netspider@163.com
//qq:    450353168
//2006.05.03
****************************************************************/




#include "../inc/MCS_X51.H"
#include "../inc/hardmap.h"
#include "../inc/MCS_X51LIB.H"
extern bit bit_10ms;
extern bit bit_10ms_over;
extern bit bit_400ms;
extern bit bit_400ms_over;

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

void  delay(UINT8  t){   //call  first 24us,after 16us
  int s;
  for(s=0;s<=t;s++);
}

void  delay10ms(){
UINT8  i;
  for(i=0;i<12;i++){
    
        delay(60);
        }
        }

/*************************************************
//函数功能:1-wire总线复位。
//函数输入参数:无
//函数输出参数:返回UINT8。=0,表示复位成功。
//						   =1, 表示复位失败。
**************************************************/
UINT8  ibus_reset(){
UINT8  answer;
  iwire=0;
  delay(29);
  iwire=1;
  delay(3);
  answer=iwire;
  delay(25);
  return(answer);
}

UINT8  read_bit(void){
UINT8 i;
  iwire=0;
 
  iwire=1;
  for(i=0;i<3;i++);
  
  return(iwire);
}

void  write_bit(UINT8  b){
  iwire=0;
  
  if  (b==1)
      iwire=1;
  delay(5);       //delay 104uS
  iwire=1;
}
//------------------------------
/*************************************************
//函数功能:从1-wire总线读取一个字节。
//函数输入参数:无
//函数输出参数:返回UINT8。读到的数据
**************************************************/
UINT8  read_byte(){
UINT8  i;
UINT8  value=0;
  for(i=0;i<8;i++){
     if(read_bit())
        value|=0x01<<i;
     delay(6);        //wait for rest line
  }
  return(value);
}
//------------------------------
/*************************************************
//函数功能:向1-wire总线写一个字节。
//函数输入参数:要写的字节。UINT8类型。
//函数输出参数:无
**************************************************/
void  write_byte(UINT8 byt){
UINT8  i;

UINT8  temp;
  for ( i=0;i<8;i++){
      temp=byt>>i;
      temp=temp&0x01;
      write_bit(temp);
      }
  delay(5);
}

/*************************************************
//函数功能:读取1-wire器件的ID号。
//函数输入参数:UINT8类型的指针,一般是一个数组的首地址。读到的数据存放于此。
//函数输出参数:无
**************************************************/
void  read_rom(UINT8 *p){					//读ROM
UINT8  i;

  write_byte(0x33);
  for (i=0;i<8;i++){
      *p=read_byte();
	  p++;
    }
}
/*************************************************
//函数功能:ds18b20的命令,跳过命令	,不执行操作。
//函数输入参数:无
//函数输出参数:无
**************************************************/
void	write_skip(){				//跳过ROM指令
	write_byte(0xcc);
}
//-----------------------------------
/*************************************************
//函数功能:写缓存命令。写3个字节到ds18b20的缓存中
//函数输入参数:UINT8类型的指针,一般是一个数组的首地址。用来写入的数据。
//函数输出参数:无
**************************************************/
void  write_scratchpad(UINT8 *p){				//写缓存
UINT8  i;
  write_byte(0x4e);
  for(i=0;i<3;i++){
      write_byte(*p);
	  p++;
      }
}
//-----------------------------------
/*************************************************
//函数功能:读缓存命令。从ds18b20的缓存中读5个字节
//函数输入参数:UINT8类型的指针,一般是一个数组的首地址。存放读到的数据。
//函数输出参数:无
**************************************************/
void  read_scratchpad(UINT8 *p){				//读缓存
UINT8  i;
  write_byte(0xbe);
  for(i=0;i<5;i++){
  	*p=read_byte();
	p++;
  }
}

//-----------------------------------
/*************************************************
//函数功能:读取温度命令。读取ds18b20转换的温度,3个字节
//函数输入参数:UINT8类型的指针,一般是一个数组的首地址。存放读到的数据。
//函数输出参数:无
**************************************************/节
void  read_temperature(UINT8 *p){				//读转换结果
UINT8  i;
  write_byte(0xbe);
  for(i=0;i<3;i++){
  	*p=read_byte();
	p++;
  }
}
//-----------------------------------
/*************************************************
//函数功能:写缓存到内部eprom命令。将存到ds18b20缓存中的数据写到eprom中去。
//函数输入参数:无
//函数输出参数:无
//说明:需要延时10ms等待数据写入。
//		使用到了一个外部变量bit_10ms_over和bit_10ms.都为bit类型。
//      bit_10ms置位表示定时开始,接着等待bit_10ms_over置位。在外部程序中延时10ms把bit_10ms_over置位。
//      也可以在这里直接定时10ms。
**************************************************/节
void copy_scratchpad(){	//使用直接电源。
	write_byte(0x48);
	bit_10ms=1;
	bit_10ms_over = 0;
	while(!bit_10ms_over);
	bit_10ms_over = 0;

}
//-----------------------------------
/*************************************************
//函数功能:ds18b20开始转换命令。命令ds18b20转换温度。
//函数输入参数:无
//函数输出参数:无
//说明:需要延时最少400ms,根据采用电压不同延时时间也不同。不过转换完毕以后总线一直为高。转换中间总线
//      输出高低变化电平。
//		使用到了一个外部变量bit_400ms_over和bit_400ms.都为bit类型。
//      bit_400ms置位表示定时开始,接着等待bit_400ms_over置位。在外部程序中延时400ms把bit_400ms_over置位。
//      也可以在这里直接定时400ms。
**************************************************/
void convert_t(){
	write_byte(0x44);
	//while(read_byte()!=0xff);
	bit_400ms_over = 0;
	bit_400ms = 1;
	while(!bit_400ms_over);
	bit_400ms_over = 0;
}
//-----------------------------------
/*************************************************
//函数功能:重新加载eeprom命令。
//函数输入参数:无
//函数输出参数:无
*************************************************/
void	recall_eeprom(){
	write_byte(0xb8);
	while(read_byte()!=0xff);
}

⌨️ 快捷键说明

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