前面我们说到了时序初始化已经完成了,也就是说我么已经完成了单片机与DS18B20的通信,那么能实现通信,我们是不是就应该把DS18B20的这个芯片手册看一看了,因为不管你使用什么芯片,首先你要看到芯片的寄存器地址,该如何运用里面的地址来驱动这个芯片,这样才是正确的开始。
首先我们可以看到这个芯片中文手册里面有一个重要的地址测温操作0x44,这样我么是不是就可以把这个芯片的地址先宏定义出来,方便操作了。
下一个指令是使用寄存器电源还是外部电源这个,可以看到这个skip rom跳过寄存器,而是直接使用外部电源,我们板子板子上是使用外部的,所以是使用0xcc的指令,然后再宏定义出来。
下一条暂存指令,我们需要把里面读出来的数据暂存然后进行操作,0xBE
虽然里面手册有很多地址,但是我么用到的地址只需要三个,剩下的都是测试用的地址,我们只需要能读取温度即可。
前面说到三个地址的宏定义,我们定义好。
#include#include "DS18B20.h" #include "oneWire.h" #define SKIP_ROM 0xcc #define Covert 0x44 #define Read_SCRATCHPAD 0xBE
然后调用单总线的时序,接下来我们就使用时序来进行芯片的通信。
首先对芯片初始化,
void DS18B20_CovertT()
{
oneWire_Init();
oneWire_SandByte(SKIP_ROM); //跳过ROM寄存
oneWire_SandByte(Covert);
}
初始化完成后,我么们就对芯片读取温度。
下面的代码是不是有很多疑惑,没事一步一步解释,我们的函数定义的是,无参有返回值,返回的温度的值,浮点型。
然后我们定义两个变量来存储温度的LMSB是高位 TLSB是低位,这个就不做多解释,有了解过大端和小端的区别的人都知道,我们只需要直到,温度分成两个部分,就是高位和低位就行。
定义一个临时存储变量,然后定义一个返回变量。
我们上面初始化完成,下面就有把芯片写入电源地址,然后写入读取测温地址,芯片的初始化就完成了,那么接下来我们就可以读取我们单总线的读操作函数的返回值,先是低位地地址,然后返回高位,为什么是这样,看这个数据手册的温度地址就知道了,
一节8位,一共两节。
float DS18B20_ReadT(void)
{
unsigned char TLSB,TMSB;
int Temp;
float T;
oneWire_Init();
oneWire_SandByte(SKIP_ROM);
oneWire_SandByte(Read_SCRATCHPAD);
TLSB=oneWire_ReadByte(); //先读取前第一字节低位温度数据
TMSB=oneWire_ReadByte(); //先读取前第二字节高位温度数据
//LCD_ShowBinNum(1,1,TMSB,8); 测试而二进制数列
//LCD_ShowBinNum(1,9,TLSB,8);
Temp=(TMSB<<8)|TLSB; //这里先设置为有符号 这里是先将高八位0000 0000 往左边移动八位,
T=Temp/16.0; //然后留出后面八个位置0000 0000来存放低八位,
//然后或上这样就可以拼接成16位了。0000 0000 0000 0000 M高八位 L低八位
return T;
}
上面说到了temp=(TMSB<<8)|TLSB的先将高为左移八位,因为原来我们的TMSB和TLSB的8位的,那么我们的int型是16位的,那正常来讲我们把TMSB<<8位了,int型是不是前面8个0就有数啦,那么后面还有8个0是没有的,但是我么再或上TLSB就是把低位的8个0给补上了,所以就得到了16位,这样就把整个字节的数给补够了,而此时得Temp就够16位了,
那么T这个是不是就把Temp赋值给它,这样就可以得到返回得值了呢,而此时得Temp是16位,但是我们也是只需要16位,所以除16就得到了正好的16位不多不少。这里16.0是c语言都知道的运算法则。



