#include"reg52.h"
#include"intrins.h"
#include<math.h>
sbit DQ=P1^3;
#define uchar unsigned char
#define uint unsigned int
uchar flag,m[2];
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*------------reset-------------*/
bit reset()
{
uchar i;
DQ=1;
_nop_();
DQ=0;
for(i=0;i<250;i++);
DQ=1;
for(i=0;i<15;i++);
flag=DQ;
for(i=0;i<100;i++);
return flag;
}
/*-----------写data------------*/
void writedata(uchar dat) //先写D0
{
uchar tmp,i,j;
tmp=dat;
for(i=0;i<8;i++)
{
DQ=1; //表示写周期开始。60~120us
for(j=0;j<3;j++);
DQ=0;
_nop_();
DQ=tmp&0x01;
for(j=0;j<10;j++);
DQ=1;
for(j=0;j<3;j++);
tmp>>=1;
}
}
/*-----------读data------------*/
uchar readdata()
{
uchar j,i,dat=0;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();
DQ=0;
dat>>=1;
_nop_();
_nop_();
DQ=1;
for(j=0;j<3;j++);
if(DQ)dat|=0x80;
for(j=0;j<3;j++);
}
return dat;
}
/*-----------初始化------------*/
void init()
{
reset();
while(flag);
writedata(0xcc); //只有一个DS18B20时可以直接跳过rom
writedata(0x4e); //往ram里写上,下限温度,后面要紧跟温度值
writedata(0x20);
writedata(0x00);
writedata(0x7f); //配置转换精度 12位
}
void delay1()
{
uchar i,j;
for(i=0;i<10;i++)
for(j=0;j<10;j++);
}
/*-----------数码管显示------------*/
void dis()
{
uchar a,b,c,d,temph,templ;
uint tmp,k;
a=m[0];
b=m[1]; // float temp;
tmp=(b<<=8)|a;
k=tmp; //temp=(m[1]*256+m[0])*0.0625;
k&=0xf800;
if(k==0xf800)
{
tmp=~tmp;
tmp+=1;
}
temph=tmp>>4; //取出整数
templ=tmp&0x0f; //取出小数部分
a=temph/100;
b=temph%100/10;
c=temph%10;
d=templ*10/16;
if(k==0xf800)P0=0x40;
else P0=table[0];
P2=0;
delay1();
P0=table[a];
P2=1;
delay1();
P0=table;
P2=2;
delay1();
P0=table[c];
P2=3;
delay1();
P0=0x80;
P2=4;
delay1();
P0=table[d];
P2=5;
delay1();
P0=0x39;
P2=6;
delay1();
}
void main()
{
uchar i;
init();
while(1)
{
reset();
writedata(0xcc);
writedata(0x44); //温度转换命令
for(i=0;i<100;i++);
reset();
writedata(0xcc);
writedata(0xbe);
for(i=0;i<2;i++)
{
m=readdata(); //读出来的温度缓冲区,先出低8位
}
dis();
}
}