#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};//共阴数码管带小数点的显示//
sbit DQ=P3^0;
sbit w0=P2^0;
sbit w1=P2^1;
sbit w2=P2^2;
sbit w3=P2^3;
void delay(n)
{
while(n--);
}
void delayms(uchar n)
{
uchar i,j;
for(i=0;i<n;i++)
for(j=0;j<110;j++);
}
//======DS18B20的初始化======////
void int18b20()
{
DQ=1;
delay(2);//延时时间要求短
DQ=0;
delay(100);//要求延时时间大于480us//
DQ=1;
delay(40);//时间短一点
}
//====读一个字节======//
void write_18b20(uchar com)//写指令的程序
{
uchar i,j;
for(i=0;i<8;i++)
{ DQ=0;
j++;j++;
DQ=com&0x01;
j++;j++;j++;
com>>=1;
delay(10);
DQ=1;
}
}
///=======读一个字节=====///
uchar read_18b20()
{
uchar j,i,dat=0;
for(i=0;i<8;i++)
{
dat>>=1;
DQ=0;
j++;
DQ=1;
if(DQ)
dat=dat|0x80;
delay(1);//小延时//
DQ=1;
}
return(dat);
}
///======温度读取并且转换的程序=====/
uchar shuju()
{
int temp1,temp2;
float temp;
int18b20();
write_18b20(0xCC);
write_18b20(0x44);
delayms(100);
//等待数据转化完成//
int18b20();
write_18b20(0xCC);
write_18b20(0xBE);
temp1=read_18b20();//先读取的低位数据//
temp2=read_18b20();
temp2<<=8;
temp2=temp2|temp1;
if(temp<0xffff)
{temp2=temp2;}
else
{temp2=~temp2;temp2=+1;}
temp=temp2*0.625;
return(temp);
}
//=======显示=========//
void display()
{
uint temp;
temp=shuju();
w1=1;
w2=1;
w3=1;
w1=0;
P0=table1[temp/100];
delayms(10);
w1=1;
w2=0;
P0=table1[temp%100/10];
delayms(10);
w2=1;
w3=0;
P0=table1[temp%10];
delayms(10);
w3=1;
}
//延时//
void main()
{
delayms(2);
int18b20();
while(1)
{
delayms(30);
display();//数据的显示//(温度)
}
} 弄了好久,一直没有成功,,求各路大神帮忙解决。
|