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

📄 ds18b20.h

📁 单片机开发的一个完整性
💻 H
字号:
/*--------------------------------------------------------------------------
TEMPERATURE.H

The user function is C51.
Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __TEMPERATURE_H__
#define __TEMPERATURE_H__

#define uchar unsigned char
#define uint unsigned int

sbit DQ=P3^3;//ds18b20与单片机连接口

uchar data Tp[8];//温度显示数据

/******************************ds1820程序***************************************/
/***************************************************** 
 函 数 名:void Delay_DS(uint useconds)
 功    能:DS18B20延时1微秒
 说    明:DS18B20时序延时
 入口参数:useconds 
 返 回 值:无  
 *****************************************************/
//延时 
void Delay_DS(uint useconds)//延时1微秒
{
 	while(useconds--);
}

/***************************************************** 
 函 数 名:void Ow_Reset()
 功    能:DS18B20复位
 说    明:DS18B20使用时先要复位
 入口参数:无 
 返 回 值: 
 *****************************************************/
void Ow_Reset()
{  
	DQ = 1;          // DQ复位
	Delay_DS(4);     // 延时
	DQ = 0;          // DQ拉低
	Delay_DS(100);   // 精确延时大于480us
    DQ = 1;          // 拉高
	Delay_DS(40);	 
}  

/***************************************************** 
 函 数 名:uchar Read_byte()
 功    能:从 1-wire 总线上读取一个字节
 说    明:读总线上的数据有严格的时序
 入口参数: 
 返 回 值:value  
*****************************************************/  
uchar Read_byte()
{ 
    uchar i=0;
	uchar value = 0;
	for (i=8;i>0;i--)
	 {  
       DQ = 0;    // 给脉冲信号
	   value>>=1;
	   DQ = 1;    // 给脉冲信号
	   if(DQ)
	   value|=0x80;
	   Delay_DS(10);
	}
  return(value);
}

/***************************************************** 
 函 数 名:void Write_Byte()
 功    能:向 1-WIRE 总线上写一个字节
 说    明:写总线上的数据有严格的时序
 入口参数:val 
 返 回 值:无  
*****************************************************/
void Write_Byte(uchar val)
{
    uchar i=0;
    for (i=8; i>0; i--)
   { 
     DQ = 0;
     DQ = val&0x01;
     Delay_DS(10);
     DQ = 1;
     val>>=1;
   }
}

/***************************************************** 
 函 数 名:void Read_Temperature()
 功    能:读温度并放入显示数组中
 说    明:
 入口参数:xx,yy 
 返 回 值:无  
*****************************************************/  
void Read_Temperature() 
{
  uchar a,b;
  uchar tflag;                // 温度正负标志
  uint tvalue;                // 温度值
  Ow_Reset();    
  Write_Byte(0xcc);           // 跳过读序列号*
  Write_Byte(0x44);           // 启动温度转换
  Ow_Reset();    
  Write_Byte(0xcc);           // 跳过读序列号 
  Write_Byte(0xbe);           // 读取温度 
  a=Read_byte();              // 读出温度低8位
  b=Read_byte();              // 读出温度高8位
  tvalue=b;
  tvalue<<=8;
  tvalue=tvalue|a;
    if(tvalue<0x0fff)
      tflag=0;
    else
   {
     tvalue=~tvalue+1;
	 tflag=1;
   }
  tvalue=tvalue*(0.625);      // 温度值扩大10倍,精确到1位小数
  Tp[2]=tvalue%1000/100+0x30; // 十位数
  Tp[3]=tvalue%100/10+0x30;   // 个位数
  Tp[4]=0x2e;                 // 显示小数点
  Tp[5]=tvalue%10+0x30;       // 显示温度小数位
  Tp[6]=0x01;                 // 显示自定义字符
  Tp[7]=0x43;                 // 显示字符"C" 
  if(tflag==0)
  Tp[1]=0x20;                 // 正温度不显示符号
  else
  Tp[1]=0x2d;                 // 负温度显示负号:-
  if(Tp[2]==0x30)
  {
	Tp[2]=0x20;               // 如果十位为0,不显示
  }
}

/***************************************************** 
 函 数 名:void Adjust_Res()
 功    能:温度分辨率调整
 说    明:此函数可以对温度的显示进行精度调节.
 入口参数:res 
 返 回 值:无  
 *****************************************************/
void Adjust_Res(char res) // res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应
                          //               0.5, 0.25, 0.125   
{
  Ow_Reset();             // 复位
  Write_Byte(0xcc);       // 跳过Rom
  Write_Byte(0x4e);       // 写暂存器
  Write_Byte(0x02);       // 写TH 
  Write_Byte(0x01);       // 写TL
  Write_Byte(res);        // 温度转换分辨率设置
  Ow_Reset();             // 复位
  Write_Byte(0xcc);       // 跳过Rom 
  Write_Byte(0x48);       // 把暂存器内容写到EPRam中
}

#endif








⌨️ 快捷键说明

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