#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P3^3;
uchar code ditab[16]={0x00,0x01,0x01,0x02,0x02,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x07,0x08,0x09,0x09};
uchar data temp_data[2]={0x00,0x00};
uchar data display[5]={0x00,0x00,0x00,0x00,0x00};
uchar code choose[4]={0x70,0xb0,0xd0,0xe0};
uchar code table[22]={
0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,
0x39,0x5E,0x79,0x71,
0x37,0x0E,0x71,0x3E,
0x00,0x40
};
void delay(uchar t)
{
while(--t);//2t+5us
}
void Reset()//对DS18B20复位操作
{
DQ=1;
delay(1);
DQ=0;
delay(250);//拉低505us
DQ=1;
delay(15);//等待35us
while(DQ);
while(~DQ);
delay(20);
DQ=1;
}
void WriteData(uchar cod)//对DS18B20写操作
{
uint i;
for(i=0;i<=7;i++)
{
DQ=1;
delay(1);
DQ=0;
delay(1);//拉低9us
DQ=cod&0x01;
delay(35);//保持75us
cod>>=1;
}
DQ=1;
delay(3);
}
uchar ReadData()//对DS18B20读操作
{
uint i;
uchar dat=0;
for(i=0;i<=7;i++)
{
DQ=1;
delay(1);
dat>>=1;
DQ=0;
delay(1);//拉低7us
DQ=1;
delay(1);//拉高7us
if(DQ)dat|=0x80;
delay(35);
}
DQ=1;
return(dat);
}
void work()
{
Reset(); //初始化
WriteData(0xcc); //发跳过ROM 命令(ROM命令)
WriteData(0x44); //启动温度转换(MEMORY命令)
delay(250); //等待转换结束
Reset(); //初始化
WriteData(0xcc); //发跳过ROM 命令(ROM命令)
WriteData(0xbe); //发读取温度命令(MEMORY 命令)
temp_data[0]=ReadData(); //读温度值低 8位(提取数据)
temp_data[1]=ReadData(); //读温度值高 8位
}
void seg()
{
uchar n=0;
if(temp_data[1]>127)
{
temp_data[1]=(255-temp_data[1]);
temp_data[0]=(255-temp_data[0]);
n=1;
}
display[4]=temp_data[0]&0x0f;
display[0]=ditab[display[4]];
display[4]=((temp_data[0]&0xf0) >> 4)|((temp_data[1]&0x0f)<<4);
display[3]=display[4] / 100;
display[1]=display[4] % 100;
display[2]=display[1] / 10;
display[1]=display[1] % 10;
if(!display[3])
{
display[3]=20;
if(!display[2]){display[2]=20;}
}
if(n){display[3]=21;}
}
main()
{
uint i,h;
while(1)
{
work();
seg();
for(h=0;h<500;h++)
{
for(i=0;i<=3;i++)
{
P2=choose[i];
P0=table[display[i]];
if(i==1)P0=P0+0x80;
delay(150);
}
}
}
}