蓝桥杯----DS18B20温度传感器

(二)、温度传感器

1、One-Wire总线

One-Wire总线利用一根线实现双向通信 。因此其协议对时序的要求较严格,如应答等时序都有明确的时间要求。基本的时序包括复位及应答时序、写一位时序读一位时序。单总线即只有一根数据线,系统中的数据交换、控制都由这根线完成。设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其他设备使用总线。由于它们是主从结构,只有主机呼叫从机时,从机才能应答,因此主机访问One-Wire器件都必须严格遵循单总线命令序列,即初始化、ROM命令、功能命令

对于蓝桥杯的同学,One-Wire协议官方会提供,不需要大家自己写。DS18B20的通信过程较为简单。图 五为蓝桥杯DS18B20原理图,DQ即用于通信的单总线,需要在函数开始定义该引脚sbit DQ = P1^4;

DS18B20的通信过程:初始化总线---写ROM指令(跳过ROM指令0xcc)---写RAM指令(开始温度转换0x44)---重新初始化---ROM指令(跳过ROM指令0xcc)---写RAM指令(开始温度读取0xbe)---接收数据(先低位再高位)---分析处理数据。(如 图 六**)**

图 五DS18B20 原理图

图 六 DS18B20 通信过程

2、代码解读(图 七)(数据处理分析)

数据处理: High<<8 高八位数据以二进制的形式左移八位就变成了unsigned int 类型数据,后八位数据全为0,此时用 | Low 运算符来获取后八位数据,则((High<<8)|Low)就是获取到了初步的温度数据,float(对象)就是强制转换括号中数据为float数据类型,但温度高五位是符号位(图 八),当这五个全是0时温度为正值,全为1则为负值。后四位是小数位,此时要*0.0625或者/16.0来获取到适合的温度区间,例如0000 0000 0000 0011表示十进制数据3,最后一位精度为0.0625,3*0.0625即为温度数据。

图 七 DS18B20 代码解读

图 八 DS18B20 数据存储位

附相关代码(注意蓝桥杯官方会给初始化、写入、读取等底层)

cs 复制代码
#include <STC15F2K60S2.H>
#include <INTRINS.h>

sbit DQ = P1^4;

void Delay_OneWire(unsigned int t)  
{
	unsigned char i;
	while(t--){
		for(i=0;i<12;i++);
	}
}

//仿真用这个延时
//void Delay_OneWire(unsigned int t)  
//{
//	while(t--);
//}

//
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);
}

//
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;
}

//
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;
}

/*
DS18B20的通信过程:
               初始化总线
               写ROM指令(跳过ROM指令0xcc)
               写RAM指令(开始温度转换0x44)
               重新初始化
               ROM指令(跳过ROM指令0xcc)
               写RAM指令(开始温度读取0xbe)
               接收数据(先低位再高位)
               分析处理数据
*/

float Temperature_Read(void)
{
	unsigned char Low,High;
	init_ds18b20();       //初始化总线
	Write_DS18B20(0xcc);  //跳过ROM指令
	Write_DS18B20(0x44);  //开始温度转换
	
	Delay_OneWire(200);
	init_ds18b20();       //重新初始化
	Write_DS18B20(0xcc);  //跳过ROM指令
	Write_DS18B20(0xbe);  //开始读取温度(低位优先)
	
	Low = Read_DS18B20();   //接收数据(先低位再高位)
	High = Read_DS18B20();
	
	return (float)((High<<8)|Low)/16.0;  //分析处理数据
}
相关推荐
小莞尔16 小时前
【51单片机】【protues仿真】基于51单片机数控直流稳压电源系统
c语言·stm32·单片机·嵌入式硬件·51单片机
小莞尔16 小时前
【51单片机】【protues仿真】基于51单片机密码锁系统
c语言·stm32·单片机·嵌入式硬件·51单片机
黑不拉几的小白兔16 小时前
stm32教程:USART串口通信
stm32·单片机·嵌入式硬件
sheepwjl18 小时前
《嵌入式硬件(十二):基于IMX6ULL的时钟操作》
汇编·arm开发·单片机·嵌入式硬件·时钟·.s编译
田甲20 小时前
【STM32】串口的阻塞、中断、DMA收发
stm32·单片机·嵌入式硬件
酷~1 天前
单片机启动文件——数据段重定位,BSS段清零
单片机·嵌入式硬件
wotaifuzao1 天前
单片机的RAM与ROM概念
单片机·嵌入式硬件
jz-炸芯片的zero1 天前
【Zephyr电源与功耗专题】14_BMS电池管理算法(三重验证机制实现高精度电量估算)
单片机·物联网·算法·zephyr·bms电源管理算法
三佛科技-134163842121 天前
蒸面器/蒸脸仪方案开发,蒸面器/蒸脸仪MCU控制方案分析
单片机·嵌入式硬件
WD137298015571 天前
WD5030A 芯片,12V降5V,输出电流12A,电路设计
stm32·单片机·嵌入式硬件·汽车