900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 4-多点温度采集模块设计--DS18B20两个字节的16进制温度数转换为温度值

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

时间:2023-02-26 14:44:40

相关推荐

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

读取温度值

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; //返回温度值}

实物图:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。