ds18b20温度转换指令_ds18b20温度数据怎么换算? - ds18b20如何读取温度?温度数据怎么换算?...

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

}

}

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值