#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)//寫入一個字節(jié)
{
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()//讀一個字節(jié)
{
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);//發(fā)送讀取命令
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();
}
}