资讯详情

【蓝桥杯单片机】DS18B20温度传感器

一、原理

1、读取温度

DS18B20出厂时配置为12位,读取温度时读取16位,前5位为符号位,当前5位为1时,读取温度为负;当前5位为0时,读取温度为正。正时读取温度的方法是:将16进制数转换为10进制。负时读取温度的方法是:将16进制反后加1,再转换为10进制。例:0550H = 85 度,FC90H = -55 度。

2、控制方法

温度转换 44H 启动DS18B20温度转换 读暂存器 BEH 阅读暂存器9字节二进制数字 写暂存器 4EH 将数据写入临时存储器TH、TL字节 复制暂存器 48H 把暂存器的TH、TL字节写到E2PROM中 重新调E2PROM B8H 把E2PROM中的TH、TL将字节写入临存器TH、TL字节 读电源供电方式 B4H 启动DS18B20向主体发送电源供电模式信号CPU

初始化 (1) 先将数据线置高电平1。 (2) 延迟(时间要求不是很严格,但尽可能短) (3) 将数据线拉到低电平0。 (4) 延迟750微秒(时间范围可从480到960微秒)。 (5) 数据线拉到高电平1。 (6) 延迟等待(如果初始化成功,则在15到60微秒内产生一个原因DS18B20返回的低电平0。它的存在可以根据这种状态来确定,但要注意不要无限期等待,否则程序会进入死循环,所以要加时控制)。 (7) 若CPU读完数据线上的低电平0后,需要延迟,从发出的高电平算(第(5)步算起)至少需要480微秒。 (8) 将数据线再次拉高到高电平1后结束。

写操作 (1) 低电平0首先放置数据线。 (2) 延迟确定时间为15微秒。 (3) 按从低到高的顺序发送字节(一次只发送一个)。 (4) 延迟时间为45微秒。 (5) 将数据线拉到高电平。 (6) 重复(1)到(6)的操作,直到所有字节全部发送。 (7) 最后,提高数据线。

读操作 (1)将数据线拉高1。 (2)延迟2微秒。 (3)将数据线拉低0。 (4)延迟3微秒。 (5)将数据线拉高1。 (6)延迟5微秒。 (7)读取数据线的状态得到1个状态位,并进行数据处理。 (8)延迟60微秒。

3.蓝桥杯提供的库文件

#ifndef __ONEWIRE_H #define __ONEWIRE_H   void Write_DS18B20(unsigned char dat); unsigned char Read_DS18B20(void); bit init_ds18b20(void);  #endif  
/* 程序说明: 单总线驱动程序 软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合培训平台(外部晶振12)MHz) STC89C52RC单片机 日 期: 2011-8-9 */ #include "reg52.h"  sbit DQ = P1^4;  ///单总线接口  ///单总线延迟函数 void Delay_OneWire(unsigned int t)  //STC89C52RC { 
          while(t--); }  ///通过单总线DS18B20写一个字节 void Write_DS18B20(unsigned char dat) { 
          unsigned char i;  for(i=0;i<8;i )  { 
           DQ = 0;   DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{ 
        
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{ 
        
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{ 
        
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//DS18B20设备初始化
bit init_ds18b20(void)
{ 
        
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}

3、蓝桥杯中常用模板

(1)主机对DS18B20进行复位初始化。 (2)写入0xcc命令。 (3)写入0x44命令,进行温度转换。 (4)延时。 (5)主机对DS18B20进行复位初始化。 (6)写入0xcc命令。 (7)写入0xbe命令,进行读取数据。

void Read_DS18B20()
{ 
        
  unsigned char LSB,MSB;
  init_ds18b20();
  Write_DS18B20(0xcc);
  Write_DS18B20(0x44);

  delay(1000);//普通延时函数

  init_ds18b20();
  Write_DS18B20(0xcc);
  Write_DS18B20(0xbe);

  LSB = Read_DS18B20();
  MSB = Read_DS18B20();

  temp = MSB;
  temp = (temp << 8) | LSB;

  if((temp & 0xf800) == 0x000)
  { 
        
    temp >>= 4;
	temp = temp * 10;
	temp = temp + (LSB & 0x0f) * 0.625;//有小数
	//temp >>= 4;
	//无小数
  }
}

二、实现代

例题:读取温度。

#include "reg52.h"
#include "absacc.h"//存储器扩展需要引入的库文件
#include "onewire.h"//比赛会提供,需要自己添加进工程

unsigned char SMGNoDot[10] = { 
        0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char SMGDot[10] = { 
        0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

unsigned int tem = 0;

void delaySMG(unsigned int t)
{ 
        
  while(t--);
}

void displaySMG(unsigned char pos,unsigned char value)
{ 
        
  XBYTE[0xe000] = value;//消隐
  XBYTE[0xc000] = 0x01 << pos;
  XBYTE[0xe000] = value;
}

void closeall(unsigned char dat)
{ 
        
  XBYTE[0xc000] = 0xff;
  XBYTE[0xe000] = dat;
}

void displaytemp()
{ 
        
  displaySMG(7,SMGNoDot[tem % 10]);
  delaySMG(100);
  displaySMG(6,SMGDot[(tem % 100) / 10]);
  delaySMG(100);
  displaySMG(5,SMGNoDot[tem /10]);
  delaySMG(100);

  displaySMG(4,0xff);
  delaySMG(100);
  displaySMG(3,0xff);
  delaySMG(100);
  displaySMG(2,0xff);
  delaySMG(100);
  displaySMG(1,0xff);
  delaySMG(100);
  displaySMG(0,0xff);
  delaySMG(100);

  closeall(0xff);
}

void delay(unsigned int  t)
{ 
        
  while(t--)
  { 
        
  	 displaytemp();//保证数码管正常显示
  }
}

unsigned char LSB,MSB;
void Read_DS18B20()
{ 
        
  init_ds18b20();
  Write_DS18B20(0xcc);
  Write_DS18B20(0x44);

  delay(1000);

  init_ds18b20();
  Write_DS18B20(0xcc);
  Write_DS18B20(0xbe);

  LSB = Read_DS18B20();
  MSB = Read_DS18B20();

  tem = MSB;
  tem = (tem << 8) | LSB;

  if((tem & 0xf800) == 0x000)
  { 
        
    tem >>= 4;
	tem = tem * 10;
	tem = tem + (LSB & 0x0f) * 0.625;
  }
}
	
void main()
{ 
        
  XBYTE[0x8000] = 0xff;
  XBYTE[0xa000] = 0x00;
  while(1)
  { 
        
	 displaytemp();
	 Read_DS18B20();
  }
}

标签: 0550传感器ds18b20温度传感器参数

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台