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

📄 ds18b20s51.h

📁 这是一个多点温度测量系统
💻 H
字号:
#define uchar unsigned char
#define uint  unsigned int
#define byte  unsigned char
#define word  unsigned int
//extern unsigned char  Show_temreal;
 sbit DQ=P3^6;//--------------------------------根据实际情况定义端口 --***********************************
 sbit DQ2=P3^5;
 sbit DQ3=P3^4;
unsigned char code tab4[16][4]={{0,0,0,0},{0,6,2,5},{1,2,5,0},{1,8,7,5},
                                {2,5,0,0},{3,1,2,5},{3,7,5,0},{4,3,7,5},
								{5,0,0,0},{5,6,2,5},{6,2,5,0},{6,8,7,5},
								{7,5,0,0},{8,1,2,5},{8,7,5,0},{9,3,7,5}};
//延时
//*********** 18B20驱动 **************************
//延时
void delay(uchar useconds)
{
  while(--useconds);
}

//---------复位-------------
byte ow_reset(void)
{
  byte presence;
  DQ = 0;        //拉低总线
  delay(250);    // 保持 480us
  delay(250);
  DQ = 1;       // 释放总线
  delay(30);     // 等待回复
  presence = DQ; // 读取信号
  delay(250);    // 等待结束信号
  return(presence); // 返回   0:正常 1:不存在
}     
//----------------------------
byte ow_reset2(void)
{
  byte presence;
  DQ2 = 0;        //拉低总线
  delay(250);    // 保持 480us
  delay(250);
  DQ2 = 1;       // 释放总线
  delay(30);     // 等待回复
  presence = DQ2; // 读取信号
  delay(250);    // 等待结束信号
  return(presence); // 返回   0:正常 1:不存在
}   
//----------------------------
byte ow_reset3(void)
{
  byte presence;
  DQ3 = 0;        //拉低总线
  delay(250);    // 保持 480us
  delay(250);
  DQ3 = 1;       // 释放总线
  delay(30);     // 等待回复
  presence = DQ3; // 读取信号
  delay(250);    // 等待结束信号
  return(presence); // 返回   0:正常 1:不存在
}   





//从 1-wire 总线上读取一个字节
byte read_byte(void)
{
  byte i;
  byte value = 0;
  for (i=8;i>0;i--)
  {
    value>>=1;
    DQ = 0; 
    DQ = 1;
    delay(2);  
    if(DQ)value|=0x80;
    delay(6); 
  }
  return(value);
}
//------------------------------2

//从 1-wire 总线上读取一个字节
byte read_byte2(void)
{
  byte i;
  byte value = 0;
  for (i=8;i>0;i--)
  {
    value>>=1;
    DQ2 = 0; 
    DQ2 = 1;
    delay(2);  
    if(DQ2)value|=0x80;
    delay(6); 
  }
  return(value);
}
//-----------------------------3

//从 1-wire 总线上读取一个字节
byte read_byte3(void)
{
  byte i;
  byte value = 0;
  for (i=8;i>0;i--)
  {
    value>>=1;
    DQ3 = 0; 
    DQ3 = 1;
    delay(2);  
    if(DQ3)value|=0x80;
    delay(6); 
  }
  return(value);
}



//向 1-WIRE 总线上写一个字节
void write_byte(char val)
{
  byte i;
  for (i=8; i>0; i--) // 一次写一位
  {	DQ=1;
    DQ = 0; // 
    DQ = val&0x01;
    delay(30); // 
    DQ = 1;
    val=val/2;
  }
  delay(70);
}
//----------------------------2
//向 1-WIRE 总线上写一个字节
void write_byte2(char val)
{
  byte i;
  for (i=8; i>0; i--) // 一次写一位
  {	DQ2=1;
    DQ2 = 0; // 
    DQ2 = val&0x01;
    delay(30); // 
    DQ2 = 1;
    val=val/2;
  }
  delay(70);
}
//----------------------------3
//向 1-WIRE 总线上写一个字节
void write_byte3(char val)
{
  byte i;
  for (i=8; i>0; i--) // 一次写一位
  {	DQ3=1;
    DQ3 = 0; // 
    DQ3 = val&0x01;
    delay(30); // 
    DQ3 = 1;
    val=val/2;
  }
  delay(70);
}


//------------------------------------------
//读取温度
//输入:ID为要读取的18B20编号,如1,2,3,
//输出:读取到的相应传感器的温度
unsigned int Read_Temperature(unsigned char ID)
{
	union
	{
		unsigned char c[2];
		unsigned int x;
	}temp;
//uchar value=0;
  switch(ID)
   {
     case 1: 
				ow_reset();
				write_byte(0xCC); // -----------------------------Skip ROM-----------------------------------
				write_byte(0xBE); // ---------------------------Read Scratch Pad-----------------------------
				temp.c[1]=read_byte();		//********************Start read data*****************************
				temp.c[0]=read_byte();		//**************read two byte data from device********************
				ow_reset();		   //-----------------------------------------reset---------------------------
				write_byte(0xCC); //------------------------------------Skip ROM*****************************
				write_byte(0x44); //--------------------------------- Start Conversion-----------------------
	          break;
     case 2: 
				ow_reset2();
				write_byte2(0xCC); // -----------------------------Skip ROM-----------------------------------
				write_byte2(0xBE); // ---------------------------Read Scratch Pad-----------------------------
				temp.c[1]=read_byte2();		//********************Start read data*****************************
				temp.c[0]=read_byte2();		//**************read two byte data from device********************
				ow_reset2();		   //-----------------------------------------reset---------------------------
				write_byte2(0xCC); //------------------------------------Skip ROM*****************************
				write_byte2(0x44); //--------------------------------- Start Conversion-----------------------
	          break;
     case 3: 
				ow_reset3();
				write_byte3(0xCC); // -----------------------------Skip ROM-----------------------------------
				write_byte3(0xBE); // ---------------------------Read Scratch Pad-----------------------------
				temp.c[1]=read_byte3();		//********************Start read data*****************************
				temp.c[0]=read_byte3();		//**************read two byte data from device********************
				ow_reset3();		   //-----------------------------------------reset---------------------------
				write_byte3(0xCC); //------------------------------------Skip ROM*****************************
				write_byte3(0x44); //--------------------------------- Start Conversion-----------------------
	          break;
	 default:break;
   }

	return temp.x;
}



//---------------------------****************program end here**************-----------------------
#endif

⌨️ 快捷键说明

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