//写一个字节到DS18B20 //dat:要写入的字节 void DS18B20_Write_Byte(u8 dat) { u8 j; u8 testb; DS18B20_IO_OUT();//SET PA0 OUTPUT; for (j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if (testb) { DS18B20_DQ_OUT=0;// Write 1 wait_us(2); DS18B20_DQ_OUT=1; wait_us(60); } else { DS18B20_DQ_OUT=0;// Write 0 wait_us(60); DS18B20_DQ_OUT=1; wait_us(2); } } }
u8 DS18B20_Read_Bit(void) // read one bit { u8 data; DS18B20_IO_OUT();//SET PA0 OUTPUT //wl DS18B20_DQ_OUT=0; delay_us(2); DS18B20_DQ_OUT=1; DS18B20_IO_IN();//SET PA0 INPUT //wl delay_us(12); if(DS18B20_DQ_IN) data=1; else data=0; delay_us(50); return data; }
//复位DS18B20 void DS18B20_Rst(void) { DS18B20_IO_OUT(); //SET PA0 OUTPUT DS18B20_DQ_OUT=0; //拉低DQ wait_us(750); //拉低750us DS18B20_DQ_OUT=1; //DQ=1 wait_us(15); //15US }
void DS18B20_Rst(void) { DS18B20_IO_OUT(); //SET PA0 OUTPUT DS18B20_DQ_OUT=0; //set low DQ delay_us(550); //for750us DS18B20_DQ_OUT=1; //DQ=1 delay_us(15); //15US }
void OWWrite_bit(u8 v) { if (v & 1) { DS18B20_IO_OUT();//SET PA0 OUTPUT DS18B20_DQ_OUT=0; delay_us(10); DS18B20_DQ_OUT=1; delay_us(55); } else { DS18B20_IO_OUT();//SET PA0 OUTPUT DS18B20_DQ_OUT=0; delay_us(65); DS18B20_DQ_OUT=1; delay_us(5); } }
//从DS18B20读取一个位 //返回值:1/0 uint8_t DS18B20_Read_Bit(void) // read one bit { uint8_t data; DS18B20_IO_OUT();//SET PA0 OUTPUT DS18B20_DQ_OUT=0; wait_us(2); DS18B20_DQ_OUT=1; DS18B20_IO_IN();//SET PA0 INPUT wait_us(12); if(DS18B20_DQ_IN)data=1; else data=0; wait_us(50); return data; }
u8 DS18B20_Init(void) { RCC->APB2ENR|=1<<2; //使能PORTA口时钟 //wl DS18B20_IO_OUT();//PORTA.0 推挽输出 //wl GPIOA->ODR|=1; //输出1 //wl DS18B20_Rst(); return DS18B20_Check(); }
void DS18B20_Rst(void) { DS18B20_IO_OUT(); //SET PA0 OUTPUT //wl DS18B20_DQ_OUT=0; //拉低DQ //wl delay_us(750); //拉低750us //wl DS18B20_DQ_OUT=1; //DQ=1 //wl delay_us(15); //15US //wl }
void DS18B20_Write_Addr(u32 dath,u32 datl) { u8 j; u8 testb; DS18B20_IO_OUT();//SET PA0 OUTPUT; for (j=1;j<=32;j++) { testb=dath&0x01; dath=dath>>1; if (testb) { DS18B20_DQ_OUT=0;// Write 1 delay_us(2); DS18B20_DQ_OUT=1; delay_us(60); } else { DS18B20_DQ_OUT=0;// Write 0 delay_us(60); DS18B20_DQ_OUT=1; delay_us(2); } } for (j=1;j<=32;j++) { testb=datl&0x01; datl=datl>>1; if (testb) { DS18B20_DQ_OUT=0;// Write 1 delay_us(2); DS18B20_DQ_OUT=1; delay_us(60); } else { DS18B20_DQ_OUT=0;// Write 0 delay_us(60); DS18B20_DQ_OUT=1; delay_us(2); } } }