读取温度值
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; //标号为iInitialization();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;//匹配4case 5 : MatchROM(ROMData5); break;//匹配5case 6 : MatchROM(ROMData6); break;//匹配6case 7 : MatchROM(ROMData7); break;//匹配7case 8 : MatchROM(ROMData8); break;//匹配8}//多个芯片的时候用MatchROM(ROMData)换掉WriteByte(SKIP_ROM)//WriteByte(SKIP_ROM);//跳过ROM匹配(单个芯片时用这句换掉上面的switch)WriteByte(READ_MEMORY);//向DS18B20写入要读他的暂存存储器内数据的命令-0xBEiTempDataL = 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; //返回温度值}
实物图: