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();
因篇幅问题不能全部显示,请点此查看更多更全内容