八路温度传感器DS18B20

    温度传感器从C51单片机的P2.2口连接。
    至于DS18B20的内部原理这里不作解析,只对如何使用作说明。首先,我们必须得清楚三个要点:初始化写指令读数据
1、初始化

        无论时初始化、写指令还是读数据都是通过数据总线(数据总线缓存器即为上面所说的P2.2口,命名为ds)为1、或0的占用时间来决定的,也就是所谓的时序图。
                
  1.   先将数据线置高,延时。(通常省略,原因未知)
  2. 数据线拉低到低电平(ds=0)
  3. 延时750us(480~960us)
  4. 数据线拉高(ds=1)
  5. 延时等待,如果初始化成功则在15~60us内产生一个有DS18B20返回的低电平0(即此时ds=0),根据ds的值即可判断。但不等无限等待,应作超时处理。
  6. 若CPU读到数据线上的低电平0(即上面说的判断ds为0),还要进行延时(有些CPU戏比较多),其延时的时间从发出高电平算起最少要延时480us
  7. 将数据线再次拉高后初始化结束
代码:
void dsreset(void)   // DS18B20复位,初始化函数
{
	uint i;
	ds=0;  //对应上面的步骤2
	i=103;  //这里书上给的是103,对应上面的步骤4,为什么是103? 可能与单片机的频率有关。这里是C51
	while(i>0) i--;  //
	ds=1;          //拉高一定时间后初始化结束
	i=4;
	while(i>0) i--;
}

2、写数据

        写数据只能通过软件写ds,一位一位的写进去。DS18B20判断接收为1还是0,不单单看我们给ds赋的值,还要看ds为1还是为0的持续时间。文字很难理解,我们直接通过代码加以说明。

void tempwritebyte(uchar dat)   //向DS18B20写一个字节数据函数
{
	uint i;
	uchar j;
	bit testb;
	for(j=1; j<=8;j++) //每次取最低位
	{
		testb=dat&0x01;
		dat=dat>>1;
		if(testb) //写1,根据延时的不同来区分写1或写0
		{        //根据最低位的值来确定,即testb=1,则ds写1,而ds写1的过程不是直接赋值,而是通过延迟时间来确定,
			     //选择延迟时间较久的,
			ds=0;
			i++;i++;  //ds=0延迟时间为两微秒,
			ds=1;     
			i=8;while(i>0)i--; //延迟时间为16us(判断语句也需要1us)
		}
		else
		{
			ds=0;
			i=8;while(i>0)i--;
			ds=1;
			i++;i++;
		}
	}
}



从上代码可见,每次给DS18B20写一位,也就是testb,testb是1,就写1。不管写0还是1,都要写有ds=0或者ds=1, 此时就看哪一个延迟的时间长,testb=1时,ds=0延迟了两个(i++),而ds=1延迟了8个(i--)和(i>0) , 故这是写1的过程。  写0则反之。
3、读数据

        读数据的过程是从DS18B20一位一位的输出到ds的过程,同上,这一过程要结合ds时序的相应变化。这个变化要人为操作。在C51中,通过以下代码中红色部分来操作。

bit tempreadbit(void)  //读1位数据函数
{
	uint i;
	bit dat;
	ds=0;i++;
	ds=1;i++;i++; 
	dat=ds;
	i=8;while(i>0)i--;
	return (dat);
}
以上红色部分,即是从DS18B20中读取数据的命令操作,注意ds的值是会变的,因为ds只是一个数据总线暂存器,我们可以写它,DS18B20也可以写它。这里我们写它是为了给DS18B20“传达命令”,当我们传达输出温度值的命令后,DS18B20就会把温度值写出到ds中,所以这里我们再把ds的值取出给dat就行了。

没有更多推荐了,返回首页