ds18b20溫度數據怎么換算?
高五位S為符號位,分辨率為0.0625。正溫度把16進制數轉成10進制即可;負溫度把16進制數取反后加1再轉成10進制數,第一個是00FA是(15*16+10)*0.0625=15.62度,第二個是0032是(3*16+2)*0.0625=3.125度(負的)
a=read_byte(); //讀取溫度低八位的數據
b=read_byte(); //讀取溫度高八位的數據
t =(b*256+a)*25;
return(t》》2)
*25/4=6.25,DS18B20的分辨率是0.0625度,這里是保留了兩位小數位,所以0.0625*100=6.25。詳細解釋一下:t》》2是右移的意思,就是把你的二進制數右移2位。通俗點講,如果你把十進制數1234右移2位成了12.34變為原來的1/100倍,那把二進制數右移2位就是變為原來的1/4倍,所以25和t》》2是調整精度是25/4倍。
DS18B20溫度讀取及顯示如下:
#include《reg51.h》
#define uchar unsigned char
#define uint unsigned int
#define wela P2
#define dula P0
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit DS=P3^7;
void delay6us(uchar z){
while(z--);
}
void delayms(uchar z){
uchari,j;
for(i=0;i《z;i++)
for(j=0;j《160;j++);
}
void init(){
ucharpresence=1;
while(presence){
DS=0;
delay6us(80);//延時480us以上
DS=1;
delay6us(15);
if(DS==0){
presence=0;
while(DS==0);
}
else
presence=1;
}
}
uchar ds_read(){
ucharbyt,bi;
uchari;
for(i=0;i《8;i++){
DS=0;
delay6us(1);
DS=1;
delay6us(1);
bi=DS;
byt=(byt》》1)|(bi《《7);
delay6us(11);
}
returnbyt;
}
void ds_write(uchar ch){
uchari;
for(i=0;i《8;i++){
DS=0;
delay6us(1);
DS=ch&0x01;
delay6us(11);
DS=1;
delay6us(1);
ch》》=1;
}
}
void DSchange(){
DS=1;
init();
ds_write(0xcc);
ds_write(0x44);
}
void DSreadtempcom(){
DS=1;
init();
ds_write(0xcc);
ds_write(0xbe);
}
uint DSreadtemp(){
inttemp=0;
uchartmh,tml;
DSchange();
delayms(1);
DSreadtempcom();
tml=ds_read();
tmh=ds_read();
DS=1;
temp=tmh;
temp《《=8;
temp|=tml;
returntemp;
}
void display(uint wendu){
ucharbai,shi,ge,sfen,bfen,qfen;
uchars,tp,th,tl;
uintxs,flag;
flag=wendu&0x8000;
if(flag!=0)
wendu=~(wendu-1);
th=wendu/256;
tl=wendu%256;
s=tl&0x0f;
xs=0.0625*s*1000;
th《《=4;
tl》》=4;
tp=th|tl;
bai=tp/100;
shi=(tp%100)/10;
ge=tp%10;
sfen=xs/100;
bfen=(xs%100)/10;
qfen=xs%10; //顯示的百位十位個位以及小數點后三位
wela=0;
if(flag!=0){
dula=0x40; //顯示負號
}else
dula=0x00;
delayms(10);
wela=1;
if(bai!=0){
dula=table[bai];
}else
dula=0x00;
delayms(10);
wela=2;
dula=table[shi];
delayms(10);
wela=3;
dula=table[ge]|0x80; //加小數點
delayms(10);
wela=4;
dula=table[sfen];
delayms(10);
wela=5;
dula=table[bfen];
delayms(10);
wela=6;
dula=table[qfen];
delayms(10);
}
void main(){
uinttemp;
while(1){
temp=DSreadtemp();
display(temp);
}
}