?? ds18b20.h
字號:
sbit DQ = P2^7; // 定義DQ引腳為P1.7
/******************************* 延時函數 ********************************
* 功能:在11.059MHz的晶振條件下調用本函數需要24μs ,然后每次計數需16μs
**************************************************************************/
void delay(int useconds) {
int s;
for (s=0; s<useconds;s++);
}
/******************************* 復位函數 *******************************
* 功能:完成單總線的復位操作。
* 復位時間為480μs,因此延時時間為(480-24)/16 = 28.5,取29μs。
* 經過70μs之后檢測存在脈沖,因此延時時間為(70-24)/16 = 2.875,取3μs。
**************************************************************************/
unsigned char ow_reset(void) {
unsigned char presence;
DQ = 0; // 將 DQ 線拉低
delay(29); // 保持 480μs
DQ = 1; // DQ返回高電平
delay(3); // 等待存在脈沖
presence = DQ; // 獲得存在信號
delay(25); // 等待時間隙結束
return(presence); // 返回存在信號,0 = 器件存在, 1 = 無器件
}
/****************************** 位寫入函數 *******************************
* 功能:向單總線寫入1位值:bitval
*************************************************************************/
void write_bit(char bitval) {
DQ = 0; // 將DQ 拉低開始寫時間隙
if(bitval==1) DQ =1; // 如果寫1,DQ 返回高電平
delay(5); // 在時間隙內保持電平值,
DQ = 1; // Delay函數每次循環延時16μs,因此delay(5) = 104μs
}
/**************************** 字節寫入函數 *******************************
* 功能:向單總線寫入一個字節值:val
*************************************************************************/
void write_byte(char val) {
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++) { // 寫入字節, 每次寫入一位
temp = val>>i;
temp &= 0x01;
write_bit(temp);
}
delay(5);
}
/**************************** 位讀取函數 ********************************
* 功能:從單總線上讀取一位信號,所需延時時間為15μs,因此無法調用前面定義
* 的delay()函數,而采用一個for()循環來實現延時。
* ***********************************************************************/
unsigned char read_bit(void) {
unsigned char i;
DQ = 0; //將DQ 拉低開始讀時間隙
DQ = 1; // then return high
for (i=0; i<3; i++); // 延時15μs
return(DQ); // 返回 DQ 線上的電平值
}
/**************************** 字節讀取函數 *******************************
* 功能:從單總線讀取一個字節的值
*************************************************************************/
unsigned char read_byte(void) {
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++) { // 讀取字節,每次讀取一個字節
if(read_bit()) value|=0x01<<i; // 然后將其左移
delay(6);
}
return(value);
}
/******************************* 讀取溫度函數 *****************************
* 功能:如果單總線節點上只有一個器件則可以直接掉用本函數。如果節點上有多個器
* 件,為了避免數據沖突,應使用Match ROM函數來選中特定器件。
* 注: 本函數是根據DS1820的溫度數據格式編寫的,若用于DS18B20,必須根據
* DS18B20的溫度數據格式作適當修改。
**************************************************************************/unsigned
int Read_Temperature(void) {
unsigned char get[10];
unsigned char temp_lsb,temp_msb;
unsigned int t;
unsigned char k;
ow_reset();
write_byte(0xCC); // 跳過 ROM
write_byte(0x44); // 啟動溫度轉換
delay(5);
ow_reset();
write_byte(0xCC); // 跳過 ROM
write_byte(0xBE); // 讀暫存器
for (k=0;k<2;k++){get[k]=read_byte();}
temp_msb = get[1]; // Sign byte + lsbit
temp_lsb = get[0]; // Temp data plus lsb
t=temp_msb*256+temp_lsb;
t=t&0x0ff0;
if(t<0xff&&t>0xf0)
t=(-1)*t;
return t>>4;
//temp_f = (((int)temp_c)* 9)/5 + 32;
// 輸出華氏溫度值
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -