标签:code turn 参考 fhe 负数 变量 htm 流程 class
控制ds18b20的协议如下:
①:初始化
②:rom操作命令
③:存储器操作命令
④:执行
注:每次使ds18b20执行一次存储器操作命令都得按上面流程来一次,不能连着写两个存储器操作命令
各部分命令看后面参考资料P9.
具体实现:
---------------------------------------------------------------------只是外部电源供电,只有一只ds18b20的情况----------------------------------------------------------------
init_ds18b20();//初始化 Write_DS18B20(0xcc);//0xcc命令,跳过配对rom(因为只有一个) Write_DS18B20(0x44);//转换温度命令,最长500ms,如果是不断循环检测就不用delay等待 init_ds18b20();//同上 Write_DS18B20(0xcc);//同上 Write_DS18B20(0xbe);//读取存储器命令,从0字节到8字节,0,1是温度值,故下面读两字节就初始化,后面的不需要了 templ=Read_DS18B20();// 先读到低字节 temph=Read_DS18B20(); init_ds18b20(); temp=temph; temp<<=8; temp|=templ;//以上操作把两个字节整合成一个int型变量temp(keil貌似int16位) return temp;
得到了temp之后,只要稍加处理就会变成所需温度的值了
若temp为负数,考虑到temp是以补码形式存储,(补码:负数的补码为其正数对应的原码取反加1,例:- 5的8位补码为+5对应原码00000101取反11111010加1=11111011. 正数补码为其本身)补码转原码:易知补码首位为1即为负数,为0则正数,如补码11111001,先减1再取反得00000111,考虑到为负数,将首位变为1即得原码(原码首位0,1分别代表正负)
若为正数,直接处理,因为默认为12位精度,16位中有8位代表整数部分,四位为小数部分,还有四位没用,即temp*0.0625(即1/16)即得温度值
参考资料:点击打开链接
代码:点击打开链接
---------------------------------------------------------------------------才疏学浅,如有错误望指教-------------------------------------------------------------------------------
标签:code turn 参考 fhe 负数 变量 htm 流程 class
原文地址:http://www.cnblogs.com/otaganyuki/p/7101875.html