#include<reg51.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uchar unsigned char
#define uint unsigned int
sbit date=P3^7;
unsigned char code table[]={0x3f,
0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,
0x71,0x80,0xc0};
uchar falg;
uint c,temp;
void delay(uint z)//延时4微秒
{
while(z--);
}
void reset()
{
date=1;
delay(1);
date=0;
delay(80);
date=1;
delay(8);
if(date==0)
P2=0xfe;//灯1亮,DS18B20应答低电平有效
else
P2=0xfc;//灯1,2亮,DS18B20未应答低电平
delay(20);
if(date==1)
P2=0x7e;//灯1,8亮,DS18B20复位成功
else
P2=0x00;//灯全亮,DS18B20未释放总线,复位不成功
}
void write_byte(uchar dat)//写入一个字节
{
uchar i;
for(i=1;i<=8;i++)
{
date=0;
date=dat&0x01;
delay(4);
dat=dat>>1;
date=1;
delay(1);
}
}
uchar read_byte()//读一个字节
{
uchar dat;
uchar i;
for(i=0;i<8;i++)
{
date=0;
dat=dat>>1;
date=1;
if(date)//采数据1
dat=dat|0x80;
delay(4);
}
return(dat);
}
uint read_wendu()//读温度
{
uchar a,b;
reset();//复位
delay(1);
write_byte(0xcc);//跳过序列号命令
write_byte(0x44);//启动温度检测
delay(350);
reset();
// delay(1);
write_byte(0xcc);//跳过序列号命令
write_byte(0xbe);//发送读取命令
a=read_byte();//读低8位
b=read_byte();//读高8位
temp=((b|0xff00)<<8)|a;//合并成16位数
if ((b&0xf0)==0xf0)//判断正负
{
temp=~temp+1;
falg=1;
}
else
falg=0;
c=(temp&0x000f)*0.0625*10000;//提取4位小数
temp=temp>>4;//移出小数部分,得到整数温度值
return(temp);
}
void display()//显示
{
uchar bai,shi,ge,n1,n2,n3,n4;
bai=temp/100;
shi=temp0/10;
ge=temp;
n1=c/1000;
n2=c00/100;
n3=c0/10;
n4=c;
P0=table[bai];
if(bai==0)
{
P1=0xff;
}
else
{
P1=0xfe;
delay(200);
P1=0xff;
}
P0=table[shi];
if(bai==0)
{
if(shi==0) //最高位是0,次高位也是0则不显示
P1=0xff;
else //最高位是0,次高位不是0则显示次高位
{
P1=0xfd;
delay(200);
P1=0xff;
}
}
else //最高位不是0,次高位全显
{
P1=0xfd;
delay(200);
P1=0xff;
}
P0=table[ge];
P1=0xfb;
delay(200);
P1=0xff;
if(falg==1)// 显示负号
{
P0=table[17];
P1=0xf7;
delay(200);
P1=0xff;
}
else
{
P0=table[16];
P1=0xf7;
delay(200);
P1=0xff;
}
P0=table[n1];
P1=0xef;
delay(200);
P1=0xff;
P0=table[n2];
P1=0xdf;
delay(200);
P1=0xff;
P0=table[n3];
P1=0xbf;
delay(200);
P1=0xff;
P0=table[n4];
P1=0x7f;
delay(200);
P1=0xff;
}
void main()
{
P0=0x00;
P1=0xff;
while(1)
{
read_wendu();
display();
}
}