#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管表//
uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfb,0x87,0xff,0xef};//共阴数码管带小数点的显示//
uchar temp;
uchar temp1;
uchar temp2;
uchar com,n;
sbit DQ=P1^0;
void delayms();
void delay(n);
void int18b20();
void write_18b20();
uchar read_18b20();
shuju();
void main()
{
int18b20();//先初始化//
while(1)
{
delayms();
shuju();//度温度数据并且数据转换//
delayms();
P2=0xfe;
P0=table1[temp/100];
delayms();
P2=0xfd;
P0=table2[temp%100/10];
delayms();
P2=0xfb;
P0=table1[temp%100%10];
delayms();
// display();//数据的显示//(温度)
delayms();
}
}
//======DS18B20的初始化======////
void int18b20()
{
uchar x=1;
while(x)
{
DQ=1;
delay(5);//延时时间要求短
DQ=0;
delay(260);//要求延时时间大于4820us//
DQ=1;
delay(5);//时间短一点
x=DQ;
delay(200);
}
}
//====读一个字节======//
void write_18b20(com)//写指令的程序
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=com&0x01;
delay(10);//短暂的延时//
DQ=1;
com>>=1;
}
}
///=======读一个字节=====///
uchar read_18b20()
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
delay(2);
DQ=1;
if(DQ)
{
dat=dat|0x80;
delay(10);//小延时//
}
}
return(dat);
}
///======温度读取并且转换的程序=====/
shuju()
{
int18b20();
write_18b20(0xCC);
write_18b20(0x44);
while(!DQ);
//等待数据转化完成//
int18b20();
write_18b20(0xCC);
write_18b20(0xBE);
temp1=read_18b20();//先读取的低位数据//
temp2=read_18b20();
temp2<<=8;
temp=temp2|temp1;
temp=temp*0.0625;//温度扩大十倍显示//
return(temp);
}
//延时//
void delay(n)
{
uchar i;
for(i=0;i<n;i++);
}
void delayms()
{
uchar i,j;
for(i=0;i<100;i++)
for(j=0;j<250;j++);
} |