DS18B20 读数,在LCD上显示不正确,程序照着时序图写的,找不到问题出在哪

问题遇到的现象和发生背景

img

img

问题相关代码,请勿粘贴截图

#include "reg52.h"
#include <intrins.h>

unsigned int temp,temp1,temp2;
unsigned char ge,shi;
unsigned char Disp[]="TEMP=88";
sbit k1=P1^1;
sbit k2=P1^2;
sbit k3=P1^3;
sbit led=P1^0;
#define LCD1602_DB P2
sbit LCD1602_RS = P3^0;
sbit LCD1602_RW = P3^1;
sbit LCD1602_E = P3^2;
sbit DS18B20_DQ=P3^3;

void delay10us(void)
{
nop();
nop();

}

void delay595us(void)
{
unsigned char a,b;
unsigned int i;
for(i=0;i<1;i++)
for(b=20;b>0;b--)
for(a=1;a>0;a--);
}

void delay1ms(unsigned int t)
{
unsigned char a,b;
unsigned int i;
for(i=0;i<t;i++)
for(b=35;b>0;b--)
for(a=1;a>0;a--);

}

void LcdWriteCom(unsigned char com)
{
LCD1602_E = 0;
LCD1602_RS = 0;
LCD1602_RW = 0;

LCD1602_DB= com;     

delay1ms(1);

LCD1602_E = 1;              
delay1ms(1);      
LCD1602_E = 0;

}

void LcdWriteData(unsigned char dat)
{
LCD1602_E = 0;
LCD1602_RS = 1;
LCD1602_RW = 0;

LCD1602_DB= dat; 
delay1ms(1);    

LCD1602_E = 1;   
delay1ms(1);     
LCD1602_E = 0;

}

void Lcd_Init()
{
LcdWriteCom(0x38); //¿ªÏÔʾ
LcdWriteCom(0x0c); //¿ªÏÔʾ²»ÏÔʾ¹â±ê
LcdWriteCom(0x06); //дһ¸öÖ¸Õë¼Ó1
LcdWriteCom(0x01); //ÇåÆÁ
LcdWriteCom(0x80); //ÉèÖÃÊý¾ÝÖ¸ÕëÆðµã
}

void Ds18b20_Init(void)
{

_nop_();

DS18B20_DQ= 0;
delay595us();
DS18B20_DQ=1;

delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();

while(DS18B20_DQ==0);

DS18B20_DQ=1;
}

unsigned char Ds18b20Read(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=0;i<8;i++)
{
DS18B20_DQ= 0;
_nop_();
dat>>=1;
DS18B20_DQ= 1;
nop();
nop();
nop();
nop();
nop();
nop();
nop();

if(DS18B20_DQ)     
{
    dat |= 0x80;
}
delay10us();  
delay10us(); 
delay10us(); 
delay10us(); 
delay10us(); 
delay10us(); 

}
return(dat);
}

void Ds18b20Write(unsigned char dat)
{
unsigned char i=0;
for (i=0; i<8; i++)
{
DS18B20_DQ= 0;
_nop_();
_nop_();
DS18B20_DQ= (dat&0x01);
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
DS18B20_DQ= 1;
dat>>=1;
nop();
nop();
}

}
unsigned int Ds18b20ReadTemp()
{
unsigned int tp ,T;
unsigned char tmh, tml;
float tep;

delay1ms(10);
Ds18b20_Init();
delay1ms(1);
Ds18b20Write(0xcc);        
Ds18b20Write(0x44);             

Ds18b20_Init();
delay1ms(1);
Ds18b20Write(0xcc);     
Ds18b20Write(0xbe);
                         
tml = Ds18b20Read();           
tmh = Ds18b20Read();             
tp = tmh;
tp <<= 8;
tp =tp|tml;
tep=tp;
T=tep*0.0625;
return T;

}

unsigned char IntToChar(unsigned int x)
{
unsigned char r=(char)x+'0';
return r;
}

void Display()
{
unsigned int i;
Lcd_Init();
ge=IntToChar(temp2 %10);
shi=IntToChar(temp2 /10);
Disp[5]=shi;
Disp[6]=ge;

for(i=0;i<7;i++)
{
    LcdWriteData(Disp[i]);    
}        
delay1ms(100);

}

void key()
{
if(k1==0)
{
delay1ms(10);
if(k1==0)
{
temp=20;
}
while(!k1);
}

if(k2==0)          
{
        delay1ms(10);
    if(k2==0)
    {
        temp++;    
    }
    while(!k2);
}

if(k3==0)        
{
    delay1ms(10);
    if(k3==0)
    {
        temp1=temp;
    }
    while(!k2);
}
    

}

void main(void)
{
temp=88;

while(1)
{ 
    temp2=Ds18b20ReadTemp();
    key();
    Display();
        
if(temp1!= 0){

    if(temp1<temp2)
        {
        led=0;
        while(1)
            {
            delay1ms(10);
            led=~led;
      }
    }

}

}    

}

运行结果及报错内容

改变DS18B20模拟器件数值,读数随着改变,但读数读不对

我的解答思路和尝试过的方法

延时函数 0us 误差