您的位置:首页 > 其它

4-多点温度采集模块设计--DS18B20两个字节的16进制温度数转换为温度值

2018-04-27 16:40 141 查看
版权声明: https://blog.csdn.net/qq_33869371/article/details/80109852

读取温度值

1、这里是取4个节点当做温度检测节点:

//读取温度值
TEMPDATA ReadTemperature()						   //结构体类型的函数
{
TEMPDATA TempData;							    //TempData为结构体类型的局部变量
unsigned int iTempDataH;					 //温度的高字节整数部分
unsigned char btDot, iTempDataL;			 //定义存储1个字符的变量// char 类型储存的实际上是整数-ASCII码值
static unsigned char i = 5;

TempData.btNegative = 0;						//为0温度为正
i++;
if (i == 9)
i = 5;										   //超过8个从新计

TempData.jdh=i;								 //标号为i

Initialization();
WriteByte(SKIP_ROM);
WriteByte(TEMP_SWITCH);							//启动转换  = 0x44
Delay500ms();  									//调用2次,延时1秒
Delay500ms();
Initialization();

switch (i)									   //作用:只有匹配上序列号才能读取温度值
{
//		case 1 : MatchROM(ROMData1); break;			//匹配1
//		case 2 : MatchROM(ROMData2); break;			//匹配2
//		case 3 : MatchROM(ROMData3); break;			//匹配3
//		case 4 : MatchROM(ROMData4); break;			//匹配4
case 5 : MatchROM(ROMData5); break;			//匹配5
case 6 : MatchROM(ROMData6); break;			//匹配6
case 7 : MatchROM(ROMData7); break;			//匹配7
case 8 : MatchROM(ROMData8); break;			//匹配8
}
//多个芯片的时候用MatchROM(ROMData)换掉WriteByte(SKIP_ROM)

//	WriteByte(SKIP_ROM);							//跳过ROM匹配(单个芯片时用这句换掉上面的switch)

WriteByte(READ_MEMORY);							//向DS18B20写入要读他的暂存存储器内数据的命令-0xBE
iTempDataL = ReadByte();					    //读取字符-为温度的低字节位
iTempDataH = ReadByte();						//读取整数-为温度的高字节位
iTempDataH <<= 8;							   //左移8位
iTempDataH |= iTempDataL;					    //变为16位,高8位、低8位合在一起

if (iTempDataH & 0x8000)						//如果iTempDataH的最高位为1
{
TempData.btNegative = 1;				  //为1温度为负
iTempDataH = ~iTempDataH + 1;				//负数求补码
}

//为了省去浮点运算带来的开销,而采用整数和小数部分分开处理的方法(没有四舍五入)
btDot = (unsigned char)(iTempDataH & 0x000F);	//得到小数部分
iTempDataH >>= 4;								//二进制右移4位(除以2^4=16或者乘以0.0625)--得到整数部分
btDot *= 5; 									//btDot*5/8(btDot/0.625)得到转换后的小数数据
btDot >>= 3;

//数据处理
TempData.btThird   = (unsigned char)iTempDataH / 100;
TempData.btSecond  = (unsigned char)iTempDataH % 100 / 10;
TempData.btFirst   = (unsigned char)iTempDataH % 10;
TempData.btDecimal = btDot;

return TempData;							 //返回温度值
}
实物图:


阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: