新手请教关于DS18B20+1602的问题,请兄弟们看看

2020-02-01 16:34发布

有兄弟写过DS18B20+1602的程序吗?大家帮我看看有啥问题,昨晚显示温度为25.5度,今天怎么还是显示为25.5度呢
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit DQ=P2^2;
uchar dates[]={0,0,0};       

uchar num;
void delay(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
   for(y=110;y>0;y--);

}


void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;

}
void write_date(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;

}

void init()
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);

}


void delay_us(uchar x)                         //延时 x * 1.084 + 2.73 us
{
        while(--x);
}



void delay_ms(uint z)                          //延时任意ms
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=240;y>0;y--);
}



void DS18B20_init()
{
        DQ = 1;                                                //拉高数据总线线
        _nop_();                                           //延时1us
        DQ = 0;                                                 //拉低数据总线       
        delay_us(250);                                  //延时273us
        delay_us(250);                                  //延时273us
        DQ = 1;                                                 //释放总线       
        delay_us(75);                                   //延时84us,等待DS18B2发存在信号
        delay_us(210);                                 //延时230us
        DQ = 1;                                                  //释放总线
}


void DS18B20_write_byte(uchar temp)
{
        uchar i;
        ACC = temp;
        for(i=8;i>0;i--)
        {
                DQ = 0;
                delay_us(12);                        //延时15.73us
                DQ = ACC0;
                ACC>>=1;
                delay_us(40);                        //延时46us
                DQ = 1;
                _nop_();       
        }
}

uchar DS18B20_read_byte()
{
        uchar i;
        for(i=8;i>0;i--)
        {
                ACC>>=1;
                DQ = 0;
                delay_us(8);                        //延时11.4us
                DQ = 1;
                _nop_();
                ACC7 = DQ;
                delay_us(45);                         //延时51.5us
                DQ = 1;
        }
        return ACC;       
}


uint DS18B20_read()
{
        uchar wh,wl;
        uint temp;
        float t;
        DS18B20_init();                                //复位信号
        DS18B20_write_byte(0xcc);        //跳过ROM命令
        DS18B20_write_byte(0x44);        //执行温度转换命令
        delay_ms(1);                                //等待温度转换
        DS18B20_init();                                //复位信号
        DS18B20_write_byte(0xcc);        //跳过ROM命令
        DS18B20_write_byte(0xbe);        //读暂存器命令
        wl = DS18B20_read_byte();        //读温度的低字节
        wh = DS18B20_read_byte();        //读温度的高字节
        _nop_();
           temp = wh;
        temp<<=8;
        temp|=wl;
    t = temp*0.0625;
    temp = t*10+0.5;
        return temp;
}



void dealvel(uint v)
{
   dates[0]        =v/100;
   dates[1]        =v%100/10;
   dates[2]=v%10;

}

void main()
{ uchar t;
  init();
          while(1)
   {
    t=DS18B20_read();
        dealvel(t)        ;
        write_com(0x80+0x45);
    write_date(dates[0]+0x30);
        write_com(0x80+0x46);
    write_date(dates[1]+0x30);
        write_com(0x80+0x47);
    write_date(dates[2]+0x30);

         //delay(2);
   }       
}
请大家帮我看一下啊,程序运行没问题,就是显示数值一直不变呢,昨晚搞了一晚上,也没搞明白
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。