stc89c51用ds18b20测试温度lcd1602显示温度,不能正确显示

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

lcd1602不显示

问题相关代码,请勿粘贴截图
#include<reg52.h>
#define uchar unsigned char                        
#define uint unsigned int  
uchar i;
sbit lcdrs=P3^0;
sbit lcdrw=P3^1;
sbit lcden=P3^2;
sbit  d1=P1^0;
sbit  d2=P1^1;
uchar code table1[]="wendu:" ;
uchar code table2[]="H:      L:";
uchar code wendu[]="0123456789";    //利用一个温度表解决温度显示乱码
sbit DQ = P3^7;//定义ds18B20总线IO
sbit beep=P3^5;
uchar fuhao=0;//;标记温度正负     1为负数 0为正数
int HIGH_temp=0,LOW_temp=0,temp,l; 
uint num=0;                            
uchar bai,shi,ge,xiaoshu,k=0;
//延时模块
void delay(uint z)
{
    uint x,y;
    for(x=100;x>1;x--)
        for(y=z;y>1;y--);
}
//液晶显示模块
void write_com(uchar com)
{
    lcdrs=0;//写命令
    P2=com;    
    delay(5);
    lcden=1;
    delay(5);
    lcden=0;
}
void write_data(uchar date)
{
    lcdrs=1;
    P2=date;
    delay(5);
    lcden=1;
    delay(5);
    lcden=0;
}
void init_lcd() //初始化液显
{
    uchar i;
    lcden=0;//en开始时拉低
    lcdrw=0;//写
    write_com(0x38);
    write_com(0x01);
    write_com(0x0c);//开显示,显示光标
    write_com(0x06);
    write_com(0x80);
    for(i=0;table1[i]!='\0';i++)
    write_data(table1[i]);
    write_com(0xC0);
    for(i=0;table2[i]!='\0';i++)
    write_data(table2[i]);    
}
//温度采集模块
void tmpDelay(int num)//延时函数
{
    while(num--) ;
}    
/*************************************************************************/
void Init_DS18B20()//初始化ds1820
{
    uchar x=0;
    DQ = 1;    //DQ复位
    tmpDelay(8);  //稍做延时
    DQ = 0;    //单片机将DQ拉低
    tmpDelay(80); //精确延时 大于 480us
    DQ = 1;    //拉高总线
    tmpDelay(14);
    x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
    tmpDelay(20);
}
uchar ReadOneChar()//读一个字节
{
    uchar i=0;
    uchar dat=0;
    for (i=8;i>0;i--)
    {
        DQ = 0; // 给脉冲信号
        dat>>=1;
        DQ = 1; // 给脉冲信号
        if(DQ)
        dat|=0x80;
        tmpDelay(4);
    }
    return(dat);
}
void WriteOneChar(unsigned char dat)//写一个字节
{
    uchar i=0;
    for (i=8; i>0; i--)
    {
        DQ = 0;
        DQ = dat&0x01;
        tmpDelay(5);
        DQ = 1;
        dat>>=1;
    }
}
 unsigned int Readtemp()//读取温度
{
    uchar a=0;
    uchar b=0;
    uint t=0;
    float tt=0;    
    Init_DS18B20();
    WriteOneChar(0xCC); // 跳过读序号列号的操作
    WriteOneChar(0x44); // 启动温度转换
    delay(750);
    Init_DS18B20();
    WriteOneChar(0xCC); //跳过读序号列号的操作
    WriteOneChar(0xBE); //读取温度寄存器
    a=ReadOneChar();   //连续读两个字节数据   //读低8位 
    b=ReadOneChar();                          //读高8位
    t=b;
    t<<=8;
    t=t|a; //两字节合成一个整型变量。
     if(t&0x8000)
     {
       fuhao=1;
       t=(~t)+1; 
     }
     t=t*10/16;//屏蔽低四位
    return(t);
}
 //报警模块
void Alarm(uchar t)
{
     uchar i,j;
    for(i=0;i<200;i++)
    {
         beep = ~beep;
        for(j=0;j<t;j++);
    }
} 
void dis(uchar a,int b)
{
    if(a==1)
    {
        write_com(0xC0+2);
        if(b<0) 
        {
            b=0-b;
            write_data('-');
        }
        else  if(b>0)
        {
            write_data('+');
        }
    }
    else if(a==2)
    {
        write_com(0xC0+10);
        if(b<0) 
        {
            b=0-b;
            write_data('-');
        }
        else  if(b>0)
        {
            write_data('+');
        }            
    }
    bai=b/1000;
    shi=b/100%10;
    ge=b/10%10;
    xiaoshu=b%10;        
    write_data(wendu[bai]);
    write_data(wendu[shi]);
    write_data(wendu[ge]);
    write_data(0x2e);
    write_data(wendu[xiaoshu]);
}
void display()
{        
    num=Readtemp();        
    bai=num/1000;
    shi=num/100%10;
    ge=num/10%10;
    xiaoshu=num%10;
    write_com(0x80+6);
    if(fuhao) write_data('-');
    else write_data('+');
    write_data(wendu[bai]);
    write_data(wendu[shi]);
    write_data(wendu[ge]);
    write_data(0x2e);
    write_data(wendu[xiaoshu]);
    if((fuhao==0)&&(shi>=3))
    {
        if(ge>0)
        {
            d1=1;d2=0;Alarm(90);Alarm(120);delay(500);
        }
        else
        {d1=0;d2=1;}
    }
    else if((fuhao==1)&&(shi>=0))
    {
        if(ge>0)
        {
            d1=1;d2=0;Alarm(90);Alarm(120);delay(500);
        }    
    }
    else
    {d1=0;d2=1;}
    if(fuhao) temp=0-num;
    else temp=num;
    if(k==0) 
    {
        LOW_temp=temp;
        dis(2,LOW_temp); 
        k++;
    }
    else if(k==1) 
    {
        HIGH_temp=temp;
        if(HIGH_temp<LOW_temp)
        {
            l=HIGH_temp;HIGH_temp=LOW_temp;LOW_temp=l;
        }
        dis(1,HIGH_temp);
        k++;
    }  
    else if(k==2)
    {
        if(temp>HIGH_temp) HIGH_temp=temp;
        else if(temp<LOW_temp) LOW_temp=temp;
        dis(1,HIGH_temp);
        dis(2,LOW_temp);
    }
    fuhao=0;
}
void main()
{
    init_lcd();
    while(1)
    {
        display();
        delay(100);
    }
}



运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

帮忙看一下代码,写一下哪里错了,给一下正确的。