?? 18b20.c
字號:
#include <reg52.h>
#include <main1.H>
bit flag1 = 0;
unsigned int gettemp1(void);
void delay3(unsigned int i) //(i*5+20)us
{
while(i--);
}
//初始化DS18B20
//讓DS18B20一段相對長時間低電平, 然后一段相對非常短時間高電平, 即可啟動
void dsInit1()
//對于11.0592MHz時鐘, unsigned int型的i, 作一個i++操作的時間大于為8us
{ ds1=1;
_nop_();
ds1 = 0;
delay3(100); //拉低約800us, 符合協議要求的480us以上
ds1 = 1; //產生一個上升沿, 進入等待應答狀態
delay3(6);
if(ds1 == 0) {flag1=1;}
else {flag1=0;}
delay3(20);
ds1=1;
}
void write1(unsigned char wr)
{unsigned char i;
for(i=0;i<8;i++)
{ds1=0;
_nop_();
ds1=wr&0x01;
delay3(5);
ds1=1;
wr>>=1;
}
}
unsigned int readword1 (void)
{ unsigned char i;
unsigned int u1=0;
for (i=0; i<16; i++)
{ds1=0;
u1>>=1;
ds1=1;
if (ds1==1) u1|=0x8000;
delay3(4);
}
return (u1);
}
unsigned int gettemp1 (void)
{unsigned int tem1;
dsInit1();
if(flag1)
{write1 (0xcc); //skiprom
write1 (0x44); //tempconvert
dsInit1();
write1 (0xcc); //skiprom
write1 (0xbe); //readtemp
tem1=readword1();//read
return tem1;
}
}
//DS18B20 獲取溫度
int getTmpValue(int tt)
{
signed int tmpvalue;
int value; //存放溫度數值
float t;
unsigned char low, high;
tmpvalue=tt;
low=tmpvalue;
high=tmpvalue>>8;
//將高低兩個字節合成一個整形變量
//計算機中對于負數是利用補碼來表示的
//若是負值, 讀取出來的數值是用補碼表示的, 可直接賦值給int型的value
value = tmpvalue;
//使用DS18B20的默認分辨率12位, 精確度為0.0625度, 即讀回數據的最低位代表0.0625度
t = value * 0.0625;
//將它放大100倍, 使顯示時可顯示小數點后兩位, 并對小數點后第三進行4舍5入
//如t=11.0625, 進行計數后, 得到value = 1106, 即11.06 度
//如t=-11.0625, 進行計數后, 得到value = -1106, 即-11.06 度
//value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0減0.5
//value=abs(value);
t = t*100;
if(high>128)
return (-t);
else
return t;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -