您的当前位置:首页DS18B20逻辑时序图及程序设计

DS18B20逻辑时序图及程序设计

2020-06-26 来源:小侦探旅游网


DS18B20逻辑时序图及程序设计

通过单线总线的所有ROM操作,都从一个初始化序列开始。初始化就是由单片机首先拉低总线一段时间,至少480us,然后拉高总线,等待一段时间,读取总线上的电平值,若为“1”则无器件在线,为“0”则存在器件。若为“0”,则延迟一段时间,一般为200us,然后继续下面的操作。由于需要响应按键的中断,所以程序中有对按键值的判断。

初始化时序图图3.10 DS18B20unsigned char ow_reset(uint n)

{

unsigned char presence;

//SET TO OUTPUT P4DIR=0xff;

P4OUT=0xff;

//pull dQ line low P4OUT=0x00;

_NOP();

_NOP();

// leave it low for 600us delay(100);

// allow line to return high P4OUT=0xff;

//SET TO INPUT P4DIR=0x00;

while(P4IN!=0);

while(P4IN==0)

{

presence =0; // get presence signal

return(presence); // presence signal returned

}

1 = no part

} // 0=presence,温度传感器还有许多与温度转换,温度值读取,匹配序列号等相DS18B20而这些寄存器操作这些指令都是建立在对寄存器的操作的基础上的,关的指令,写操作实现的,每一个指令都是八个字节,而由于的读/都是通过对DS18B20次数据发送,所8DS18B20是单总线器件,所以每发出一条指令,都需要进行而且都需要判断发送或接

收循环为主体的,for写操作的程序是以/以对器件的读

的比特值是“1”还是“0”。

控制器写入时序图图3.11 DS18B20

的一个字节//读取ds18b20uchar DS18B20_ReadByte(uint n)

{

uchar u;

uchar q ;

P4DIR=0xff; //SET TO OUTPUT

Switch(n)

{

case 0:

for(q=0;q<8;q++)

{

u=u>>1;

P4OUT &=~BIT0;

_NOP();_NOP();

P4OUT |=BIT0;

P4DIR &=~BIT0; //SET TO INPUT

_NOP();_NOP();

u=u|0x80; if((P4IN&0x08)==0x08)

u=u&0x7f; else

delay(20);

P4DIR |=BIT0; //SET TO OUTPUT

P4OUT |=BIT0;

} break;

return u; }

}

”时,首先要将总线拉低,”或“13.11由时序图可以看出,单片机在写“0根据总DS18B20”来确定是保持高电平还是低电平,”或者“然后根据是“01显得电平进行采样,获得总线上写入的数据。高低电平的保持时间是有限制的, 这就要求软件实现是要特别注意

间。.

控制器读出时序图图3.12 DS18B20

”的判断。首先要将总1、“与写入相同,读取传感器的值时,也要进行“0””还是1

线拉低,然后将总线拉高,再根据总线是高电平还是低电平来判断是“这就高低电平的保持时间是有限制的,,从而使单片机获取总线上的数据。“0” 要求软件实现是要特别注意高低电平的保持时间。 写入一个字节 //void DS18B20_WriteByte (uint n,uchar wr)

{

uchar i;

P4DIR=0xff; //SET TO OUTPUT

switch (n)

{

case 0:

for (i=0;i<8;i++)

{

P4OUT &=~BIT0;

_NOP();

if(wr&0x01)

P4OUT |=BIT0;

else

P4OUT &=~BIT0; //delay 45 uS //5 _NOP();

P4OUT |=BIT0; wr >>= 1; }break;

delay(2);

_NOP();

因篇幅问题不能全部显示,请点此查看更多更全内容