#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void display(uchar sign,uchar shi,uchar ge,uchar dian);
void init_timer0();
sbit DQ=P2^7;
sbit wela=P2^6;
sbit dula=P2^5;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点
uchar code table2[]={0xff,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar sign,shi,ge,dian,readflag;
//******************延时函数**************//
void delay(uchar i)
{
while(--i);
}
void delayMs(uchar t)
{
while(t--)
{
delay(245);
delay(245);
}
}
//******************初始化DS18b20**************//
init_DS18b20(void)
{
DQ=1;
delay(1);
DQ=0;
delay(250);
DQ=1;
delay(100);
}
//******************读取一个字节**************//
uchar read()
{
uchar i;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0;
delay(1);
dat>>=1;
DQ=1;
delay(1);
if(DQ)
dat|=0x80;
delay(25);
}
return(dat);
}
//******************写一个字节**************//
void write(uchar dat)
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(25);
DQ=1;
dat>>=1;
}
delay(25);
}
//******************读取温度**************//
uint Readtemperature(void)
{
uchar a=0;
uint b=0;
uint t=0;
init_DS18b20();
write(0xCC);
write(0x44);
delayMs(10);
init_DS18b20();
write(0xCC);
write(0xBE);
a=read();
b=read();
b<<=8;
t=a+b;
return(t);
}
//******************主函数**************//
void main(void)
{
uint tempH,templ,temp;
init_timer0();
while(1)
{
if(readflag==1)
{
readflag=0;
temp=Readtemperature();
if(temp&0x8000)
{
sign=0x40;
temp=~temp;
temp+=1;
}
else
sign=0x00;
tempH=temp>>4;
templ=temp&0x0f;
templ=templ*6/10;
/*if(tempH/100==0)
bai=0;
else
bai=tempH/100;*/
if((tempH/100==0)&&((tempH%100)/10==0))
shi=0;
else
shi=(tempH%100)/10;
ge=(tempH%100)%10;
dian=templ;
display(sign,shi,ge,dian);
}
}
}
//******************开启中断**************//
void init_timer0(void)
{
TMOD|=0x01;
EA=1;
ET0=1;
TR0=1;
}
//******************中断**************//
void timer0(void) interrupt 1
{
static uint num;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
num++;
if(num==30)
{
num=0;
readflag=1;
}
}
//******************显示函数**************//
void display(uchar sign,uchar shi,uchar ge,uchar dian)
{
P0=0xff;
wela=1;
P0=0xef;
wela=0;
P0=0xff;
dula=1;
P0=sign;
dula=0;
delay(100);
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
P0=0xff;
dula=1;
P0=table2[shi];
dula=0;
delay(100);
P0=0xff;
wela=1;
P0=0xbf;
wela=0;
P0=0xff;
dula=1;
P0=table1[ge];
dula=0;
delay(100);
P0=0xff;
wela=1;
P0=0x7f;
wela=0;
P0=0xff;
dula=1;
P0=table[dian];
dula=0;
delay(100);
}
#define uint unsigned int
#define uchar unsigned char
void display(uchar sign,uchar shi,uchar ge,uchar dian);
void init_timer0();
sbit DQ=P2^7;
sbit wela=P2^6;
sbit dula=P2^5;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点
uchar code table2[]={0xff,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar sign,shi,ge,dian,readflag;
//******************延时函数**************//
void delay(uchar i)
{
while(--i);
}
void delayMs(uchar t)
{
while(t--)
{
delay(245);
delay(245);
}
}
//******************初始化DS18b20**************//
init_DS18b20(void)
{
DQ=1;
delay(1);
DQ=0;
delay(250);
DQ=1;
delay(100);
}
//******************读取一个字节**************//
uchar read()
{
uchar i;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0;
delay(1);
dat>>=1;
DQ=1;
delay(1);
if(DQ)
dat|=0x80;
delay(25);
}
return(dat);
}
//******************写一个字节**************//
void write(uchar dat)
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(25);
DQ=1;
dat>>=1;
}
delay(25);
}
//******************读取温度**************//
uint Readtemperature(void)
{
uchar a=0;
uint b=0;
uint t=0;
init_DS18b20();
write(0xCC);
write(0x44);
delayMs(10);
init_DS18b20();
write(0xCC);
write(0xBE);
a=read();
b=read();
b<<=8;
t=a+b;
return(t);
}
//******************主函数**************//
void main(void)
{
uint tempH,templ,temp;
init_timer0();
while(1)
{
if(readflag==1)
{
readflag=0;
temp=Readtemperature();
if(temp&0x8000)
{
sign=0x40;
temp=~temp;
temp+=1;
}
else
sign=0x00;
tempH=temp>>4;
templ=temp&0x0f;
templ=templ*6/10;
/*if(tempH/100==0)
bai=0;
else
bai=tempH/100;*/
if((tempH/100==0)&&((tempH%100)/10==0))
shi=0;
else
shi=(tempH%100)/10;
ge=(tempH%100)%10;
dian=templ;
display(sign,shi,ge,dian);
}
}
}
//******************开启中断**************//
void init_timer0(void)
{
TMOD|=0x01;
EA=1;
ET0=1;
TR0=1;
}
//******************中断**************//
void timer0(void) interrupt 1
{
static uint num;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
num++;
if(num==30)
{
num=0;
readflag=1;
}
}
//******************显示函数**************//
void display(uchar sign,uchar shi,uchar ge,uchar dian)
{
P0=0xff;
wela=1;
P0=0xef;
wela=0;
P0=0xff;
dula=1;
P0=sign;
dula=0;
delay(100);
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
P0=0xff;
dula=1;
P0=table2[shi];
dula=0;
delay(100);
P0=0xff;
wela=1;
P0=0xbf;
wela=0;
P0=0xff;
dula=1;
P0=table1[ge];
dula=0;
delay(100);
P0=0xff;
wela=1;
P0=0x7f;
wela=0;
P0=0xff;
dula=1;
P0=table[dian];
dula=0;
delay(100);
}