ds18b20温度值显示55度

#include <REGX52.H>
void init_ds18b20();
void write_byte(unsigned char dat);
unsigned char read_byte(void);
unsigned int read_temp(void);
void display();
unsigned int temp;
sbit DQ=P2^6;
sbit smg0=P2^0;
sbit smg1=P2^1;
sbit smg2=P2^2;
sbit smg3=P2^3;
unsigned char code duanma[]={0x5f,0x06,0x3b,0x2f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};// 显示段码值01234567
void delay(unsigned char t)
{while(t--);}
/*------------------------------------------------
18b20初始化
------------------------------------------------*/
void init_ds18b20()
{
bit n;
DQ=1;
delay(8);
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us 小于960us
DQ = 1; //拉高总线
delay(8); //15~60us 后 接收60-240us的存在脉冲
n=DQ;
delay(4);
}

/*------------------------------------------------
写入一个字节
------------------------------------------------*/
void write_byte(unsigned char dat)
{
unsigned char i;
for (i=0; i<8; i++)
{
DQ = 0;
DQ = dat&0x01;
delay(4);
DQ = 1;
dat>>=1;
}
delay(4);
}
/*------------------------------------------------
读取一个字节
------------------------------------------------*/
unsigned char read_byte(void)
{
unsigned char i,value;
for (i=0;i<8;i++)
{
DQ = 0;
value>>=1;
DQ = 1;
if(DQ)
value|=0x80;
delay(4);
}
return(value);
}

/*------------------------------------------------
读取温度
------------------------------------------------*/
unsigned int read_temp(void)
{
unsigned char a=0;
unsigned int b=0;
init_ds18b20();
write_byte(0xCC); // 跳过ROM
write_byte(0x44); // 启动温度测量
delay(500);
init_ds18b20();
write_byte(0xCC); //跳过ROM
write_byte(0xBE); //读取温度 2个字节
a=read_byte(); //低位
b=read_byte(); //高位
b<<=4;
b+=(a&0xf0)>>4;
return(b);
}
void display()
{
smg0=1;
smg1=1;
smg2=1;
smg3=0;
P0=duanma[temp%10];
delay(20);
smg0=1;
smg1=1;
smg2=0;
smg3=1;
P0=duanma[temp/10];
delay(20);
}
void main()
{

while(1)
{
temp=read_temp();
display();
}
}
有的时候第一次读取出来的是不正常的,你可迅斗以在软件里做个判断,如果值不正常重新读或者干脆直接连续读两次,直接取亩兄磨第二次尘拦的值就可以了。
肯定是你的程序初始化出问题了,ds18b20对时序的要求很严格的,