小蜜蜂笔记
嵌入式开发与物联网应用教育践行者

【进阶强化-01】单总线温度传感器DS18B20的基本原理与应用开发

蓝桥杯单片机比赛中的DS18B20

单总线数字温度传感器DS18B20几乎成了各类单片机甚至ARM实验板的标配模块,在蓝桥杯的往届省赛和国赛中,这个内容考查的频率也相当的高。不管是嵌入式的学习还是蓝桥杯的备赛,都应熟悉DS18B20的工作原理,掌握DS18B20的基本操作,也就是把传感器的温度数据正确读出来。

在蓝桥杯“单片机设计与开发”赛项中,会提供一个关于DS18B20的底层驱动库文件,即onewire.c文件和onewire.h文件。里面实际上只有DS18B20复位操作字节写操作字节读操作三个函数。温度传感器DS18B20是单总线通信器件,对总线的操作有很严格的时序要求。如果出现序列混乱,器件将不响应主机,因此DS18B20底层驱动程序中时序很重要。
对于不同系统时钟的微处理器,其时序延时参数可能需要做适当的调整。 虽然在比赛的时候不一定要你编写底层驱动代码,但你一定要能够把官方提供的底层驱动读明白,并能根据实际应用进行合理的修改。 所以,你不但要把单总线的时序搞清楚,而且要把DS18B20的基本操作流程弄明白。

关于DS18B20的核心知识和开发要点,本人整理了一份非常精华的笔记。
详见链接:单总线数字温度传感器DS18B20的基本原理及开发要点

进阶强化高级实训

题目:在CT107D单片机综合训练平台上,编写程序对单总线温度传感器DS18B20进行温度采样,将采样结果进行适当的处理好,现在到数据管的右三位,显示结果保留1位小数。

解题思路:
<1> 先将 onewire.c文件和onewire.h文件拷贝到当前工程下。
<2> 打开 onewire.h文件,检查文件代码是否完整,并确认总线引脚定义是否和CT107D的硬件对应,即P1^4。如果不对应,则将其修改过来。
<3> 打开 onewire.c文件, 研读各个底层驱动代码的具体实现,初步判断是时序的延时是否合理,如有明显错误,则将其修改过来。
<4> 根据DS18B20的工作原理和操作流程,编写读取温度结果和处理温度数据的函数,这是进行DS18B20应用开发中最重要的一个环节。
<5> 根据得到的温度结果,刷新数码管显示。这个部分,可以用MM模式来实现,可以用IO模式来实现。

//DS18B20温度采样与结果处理参考代码
void Read_Temperature()
{
	unsigned char LSB,MSB ;
	
	Init_DS18B20();		      //DS18B20复位	
	Write_DS18B20(0xCC);	      //跳过ROM操作指令
	Write_DS18B20(0x44);          //开始温度转换
	Delay(1000);                  //延时700ms左右,等待温度转换完成
	Init_DS18B20();		      //DS18B20复位
	Write_DS18B20(0xCC);	      //跳过ROM操作指令	
	Write_DS18B20(0xBE);	      //开始读取高速暂存器		
	LSB = Read_DS18B20();	      //读取温度数据的低8位
	MSB = Read_DS18B20();	      //读取温度数据的高8位
	Init_DS18B20();		      //DS18B20复位,停止暂存器数据读取

	T_dat = 0x0000;
	T_dat = MSB;
	T_dat <<= 8;
	T_dat = T_dat | LSB;         //将LSB和MSB整合成为一个16位的整数
	//首先通过温度数据的高5位判断采用结果是正温度还是负温度
	if((T_dat & 0xf800) == 0x0000)    //正温度的处理办法
	{
		T_dat >>= 4;         //取出温度结果的整数部分
		T_dat = T_dat*10;    //放大10倍,然后加上小数部分
		T_dat = T_dat + (LSB&0x0f)*0.625;
	}
}

小蜜蜂老师关于数据处理的特别注释

这是很多同学和网友向我提出的问题,在这里特别的解释一下。
首先你要知道两个知识点,DS18B20的分辨率是0.0625,并且了解16位温度数据的格式定义
没有这两个概念,就无法理解为什么温度采样结果要这样处理。

举一个例子来给大家说明这个处理的具体过程:
假设DS18B20的温度采样结果是:LSB = 0x96,MSB = 0x01
温度数据变量T_dat为16位无符号int整型,初始值为0x0000
执行T_dat = MSB;语句后, T_dat 的值为:0x0001
执行T_dat <<= 8;语句后, T_dat 的值为:0x0100
执行T_dat = T_dat | LSB;语句后, T_dat 的值为:0x0196
通过高5位的符号扩展位判断,进行正温度的处理算法,正常来说,应该是:
T_dat = 0x0196 × 0.0625 = 406 × 0.0625 = 25.375 摄氏度。

如果要求温度结果保留1位小数,为了简化在单片机中的运算,可以放大10倍进行整型处理:
首先将温度结果的整数部分取出: T_dat >>= 4;即 T_dat = 0x0019 = 25。
然后将整数部分放大10倍: T_dat = T_dat × 10 ;即 T_dat = 250。
然后将小数部分取出: LSB&0x0f,其结果为0x06。
再将小数部分乘以0.0625的10倍,即0x06 × 0.625 = 3.73。
最后将整数部分和小数部分相加: T_dat = 250 + 3.73 = 253。为什么?因为 T_dat 是整型。
对于温度数据253,在数码管显示的时候,在十位出加上一个小数点,就变成了:25.3
这样可以让单片机避免很多浮点运算,而且数码管显示也会很简洁很方便。

如果要求温度结果只显示整数部分,那就不用这么罗嗦,直接显示整数部分即可:
T_dat >>= 4;即 T_dat = 0x0019 = 25 摄氏度。
其实,在之前的蓝桥杯单片机比赛中,只要求大家显示整数部分而已。

本教程源码倾情奉送…欢迎下载。
XMF源码免费下载:温度传感器DS18B20的基本应用(IO模式)
XMF源码免费下载:温度传感器DS18B20的基本应用(MM模式)

赞(583)
未经允许不得转载:小蜜蜂笔记 » 【进阶强化-01】单总线温度传感器DS18B20的基本原理与应用开发

小蜜蜂笔记 更专业 更方便 更高效

联系我们精品小店