复位脉冲:
先拉低至少480us,以产生复位脉冲,接着释放4.7k电阻为高,延时15~60us,
进入接收。
1 void DS18B20_Rst(void) 2 { 3 DS18B20_IO_OUT(); //SET PG11 OUTPUT 4 DS18B20_DQ_OUT=0; //拉低DQ 5 delay_us(750); //拉低750us 6 DS18B20_DQ_OUT=1; //DQ=1 7 delay_us(15); //15US 8 }
应答脉冲:
然后在拉低总线为60~240us,产生低电平应答脉冲(接收)。
1 u8 DS18B20_Check(void) 2 { 3 u8 retry=0; 4 DS18B20_IO_IN(); //SET PG11 INPUT 5 while (DS18B20_DQ_IN&&retry<200) 6 { 7 retry++; 8 delay_us(1); 9 }; 10 if(retry>=200)return 1; 11 else retry=0; 12 while (!DS18B20_DQ_IN&&retry<240) 13 { 14 retry++; 15 delay_us(1); 16 }; 17 if(retry>=240)return 1; 18 return 0; 19 }
写时序:
写1:先低电平延时2us,在释放总线延时60us。写0:先低电平60us,在释放
总线延时2us。
1 void DS18B20_Write_Byte(u8 dat) 2 { 3 u8 j; 4 u8 testb; 5 DS18B20_IO_OUT(); //SET PG11 OUTPUT; 6 for (j=1;j<=8;j++) 7 { 8 testb=dat&0x01; 9 dat=dat>>1; 10 if (testb) 11 { 12 DS18B20_DQ_OUT=0; // Write 1 13 delay_us(2); 14 DS18B20_DQ_OUT=1; 15 delay_us(60); 16 } 17 else 18 { 19 DS18B20_DQ_OUT=0; // Write 0 20 delay_us(60); 21 DS18B20_DQ_OUT=1; 22 delay_us(2); 23 } 24 } 25 }
读时序:
主机输出低电平2us,然后在释放总线延时12us,接着在读取数据是0还是1,并
且延时50us。先读一个字节,然后在读一个位。
1 u8 DS18B20_Read_Bit(void) 2 { 3 u8 data; 4 DS18B20_IO_OUT(); //SET PG11 OUTPUT 5 DS18B20_DQ_OUT=0; 6 delay_us(2); 7 DS18B20_DQ_OUT=1; 8 DS18B20_IO_IN(); //SET PG11 INPUT 9 delay_us(12); 10 if(DS18B20_DQ_IN)data=1; 11 else data=0; 12 delay_us(50); 13 return data; 14 }