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

📄 ds18b20.c

📁 DS18B20温度采集然后红外发射出去,接收板接收红外并LCD显示接收的数据信息,有完整的发射接收程序
💻 C
字号:

#include <reg51.h>

#include "DS18B20.h"

/*******************************  延时函数 ********************************
*  功能:在11.059MHz的晶振条件下调用本函数需要24μs ,然后每次计数需16μs 
          (16*n+24)us
**************************************************************************/
void Singlewire_Delay( int n ) 
{
 int i;
 for (i=0; i<n;i++);
}

/*******************************  复位函数 *******************************
* 功能:完成单总线的复位操作。
* 复位时间为480μs,因此延时时间为(480-24)/16 = 28.5,取29μs。
* 经过70μs之后检测存在脉冲,因此延时时间为(70-24)/16 = 2.875,取3μs。
**************************************************************************/
bit Singlewire_Reset( void )
{
 bit state;
 DQ = 0;  			            // 将 DQ 线拉低
 Singlewire_Delay(29); 			// 保持 480μs
 DQ = 1; 			            // DQ返回高电平
 Singlewire_Delay(3); 			// 等待存在脉冲
 state = DQ; 		            // 获得存在信号
 Singlewire_Delay(25); 			// 等待时间隙结束
 return(~state); 	            // 返回存在信号,1 = 器件存在, 0 = 无器件
}
/****************************** 位写入函数 *******************************
* 功能:向单总线写入1位值:bitval
*************************************************************************/
void Write_Bit( char bitval ) 
{
 DQ = 0; 				// 将DQ 拉低开始写时间隙
 if(bitval==1) DQ =1; 	// 如果写1,DQ 返回高电平
 Singlewire_Delay(5); 				// 在时间隙内保持电平值,
 DQ = 1; 	// Delay函数每次循环延时16μs,因此delay(5) = 104μs
}	
/**************************** 字节写入函数 *******************************
* 功能:向单总线写入一个字节值:val
*************************************************************************/
void Write_Byte( char val ) 
{
 uchar i;
 uchar temp;
 for (i=0; i<8; i++) 	// 写入字节, 每次写入一位 
  {
  temp = val>>i; 		
  temp &= 0x01; 		
  Write_Bit(temp); 
  }
 Singlewire_Delay(5);
}

/**************************** 位读取函数 ********************************
* 功能:从单总线上读取一位信号,所需延时时间为15μs,因此无法调用前面定义
* 的delay()函数,而采用一个for()循环来实现延时。
* ***********************************************************************/
bit  Read_Bit( void ) 
{
   uchar i;
   DQ = 0;     		 //将DQ 拉低开始读时间隙
   DQ = 1; 			// then return high
   for (i=0; i<3; i++); 	// 延时15μs
   return(DQ); 			// 返回 DQ 线上的电平值
}

/**************************** 字节读取函数 *******************************
* 功能:从单总线读取一个字节的值
*************************************************************************/
uchar Read_Byte( void) 
{
  uchar i;
  uchar value = 0;
  for (i=0;i<8;i++) // 读取字节,每次读取一个字节
  {  				
  if(Read_Bit()) value|=0x01<<i; 	// 然后将其左移
  Singlewire_Delay(6); 					
  }
return(value);
}

/******************************* 读取温度函数 *****************************
* 功能:如果单总线节点上只有一个器件则可以直接掉用本函数。如果节点上有多个器
*      件,为了避免数据冲突,应使用Match ROM函数来选中特定器件。
* 注: 本函数是根据DS1820的温度数据格式编写的,若用于DS18B20,必须根据
*      DS18B20的温度数据格式作适当修改。
**************************************************************************/

uchar Read_Temperature(void) 
{
   
  char get[10];
  uint t;
//  char temp_lsb,temp_msb;
  int k;  
  float temperature;  
  Singlewire_Reset();    //单总线复位//            
  Write_Byte(0xCC); 	// 跳过 ROM
  Write_Byte(0x44); 	// 启动温度转换 
  Singlewire_Delay(5);
  Singlewire_Reset();   //单总线复位// 
  Write_Byte(0xCC); 	// 跳过 ROM//
  Write_Byte(0xBE); 	//发送出读数据命令//// 读暂存器/////
  for (k=0;k<9;k++){get[k]=Read_Byte();}////连续读取9个寄存器中的数据////
  temp_msb = get[1];                    // Sign byte + lsbit
  temp_lsb = get[0];                    // Temp data plus lsb
  if (temp_msb >= 0x80)         
     {temperature=125+((~temp_msb)*256+(~temp_lsb)+1)*0.0625;}       
  else{temperature=(temp_msb*256+temp_lsb)*0.0625; }     
 t=(uint)temperature;  
 return(t);
 
}


⌨️ 快捷键说明

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