1,復位
總線拉低大于480us 釋放總線進入接收 15-60us后傳輸應答信號60-240us //初始化函數 Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ復位 delay_18B20(8); //稍做延時 DQ = 0; //單片機將DQ拉低 delay_18B20(80); //精確延時 大于 480us DQ = 1; //拉高總線 delay_18B20(14); x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗 delay_18B20(20); } 2,ds18b20的讀寫時間間隙: A,讀時間間隙 總線拉低小于 //讀一個字節 ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 給脈沖信號 dat>>=1; DQ = 1; // 給脈沖信號 if(DQ) dat|=0x80; delay_18B20(4); } return(dat); } B,寫時間間隙 拉低總線小于45us 寫入數據,保持數據大于 //寫一個字節 WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; } } 3溫度的讀取 //讀取溫度 ReadTemperature(void) { unsigned char a=0; unsigned char b=0; unsigned int t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳過讀序號列號的操作 WriteOneChar(0x44); // 啟動溫度轉換 delay_18B20(100); Init_DS18B20(); WriteOneChar(0xCC); //跳過讀序號列號的操作 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度 a=ReadOneChar(); b=ReadOneChar(); //傳感器返回值除16得實際溫度值 //為了得到2位小數位,先乘100,再除16,考慮整型數據長度, //技巧處理后先乘25,再除4,除4用右移實現 t = (b*256+a)*25; return( t >> 2 ); }
|