首页 > 代码库 > ds18b20

ds18b20

 

控制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)即得温度值

参考资料:点击打开链接

代码:点击打开链接

---------------------------------------------------------------------------才疏学浅,如有错误望指教-------------------------------------------------------------------------------

ds18b20