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);
}
}