fengyuxiaoxiao 发表于 2012-5-30 22:35:13

ds18b20+1602温度传感器上电初始值为什么不准确

还是先上程序吧,也是网上借鉴的一个程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
sbit DQ=P3^7;
unsigned char code str1[]={"temperature is:"};
unsigned char code str2[]={"            "};
uchar data disdata;
uint tvalue;
uchar tflag;
/*************************lcd1602**************************/
void delay1(unsigned int ms)
{unsigned int i,j;
   for(i=0;i<ms;i++)
    for(j=0;j<100;j++);
}
void wr_com(unsigned char com)        //1602写命令
{delay1(1);
   RS=0;
   RW=0;
   EN=0;
   P0=com;
   delay1(1);
   EN=1;
   delay1(1);
   EN=0;
}
void wr_dat(unsigned char dat) //1602读数据
{ delay1(1);;
   RS=1;
   RW=0;
   EN=0;
   P0=dat;
   delay1(1);
   EN=1;
   delay1(1);
   EN=0;
}
void lcd_init()                   //LCD1602初始化
{
delay1(15);
wr_com(0x38);delay1(5);
   wr_com(0x08);delay1(5);
    wr_com(0x01);delay1(5);
   wr_com(0x06);delay1(5);
      wr_com(0x0c);delay1(5);
}
init_play()                       //初始静态显示部分
{   uint m;
    lcd_init();
    wr_com(0x80);
   for(m=0;m<16;m++)
    {wr_dat(str1);}
   wr_com(0xCE);
   wr_dat(0xDF);
   wr_com(0xCF);
   wr_dat(0x43);
    //display(str2);
}
/******************************ds18b20***************************************/
void delay_18B20(unsigned int i)
{   while(i--);
}
void ds1820rst()                //初始化
{unsigned char x=0;
   DQ = 1;         
   delay_18B20(4);
   DQ = 0;         
   delay_18B20(100);
   DQ = 1;      
   delay_18B20(40);
}
uchar ds1820rd()                       //读
{unsigned char i=0;
   unsigned char dat = 0;
for (i=8;i>0;i--)
   {   DQ = 0;
       dat>>=1;
       DQ = 1;
       if(DQ)
       dat|=0x80;
           delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)                //写
{unsigned char i=0;
   for(i=8; i>0; i--)
    { DQ=0;
      DQ=wdata&0x01;
      delay_18B20(10);
      DQ=1;
   wdata>>=1;
    }
}
read_temp()                                        //读取温度
{   uchar a,b;
    ds1820rst();
        ds1820wr(0xcc);                       //跳过RAM读取指令
        ds1820wr(0x44);                          //启动温度转换指令
        ds1820rst();   
        ds1820wr(0xcc);
        ds1820wr(0xbe);//开始温度转换
        delay1(1000);       //注意:如果不加延时函数,上电后显示85度
        a=ds1820rd();           //读低八位
        b=ds1820rd();          //读高八位
        tvalue=b;             //
        tvalue<<=8;              //两字节组合
        tvalue=tvalue|a;
    if(tvalue<0x0fff)       //判断正负
    tflag=0;
    else
    {tvalue=~tvalue+1;
   tflag=1;
   }
    tvalue=tvalue*(6.25);
    return(tvalue);
}
/*******************************************************************/
void ds1820disp()
{
   uchar flagdat;
   uint k;
   disdata=tvalue/10000+0x30;
   disdata=tvalue%10000/1000+0x30;
   disdata=tvalue%1000/100+0x30;
   disdata=0x2e;
   disdata=tvalue%100/10+0x30;
   disdata=tvalue%10+0x30;
   if(tflag==0)
   flagdat=0x20;
   else
      flagdat=0x2d;
   if(disdata==0x30)
   {disdata=0x20;
          
       if(disdata==0x30)
       {disdata=0x20;
      }
      }
   wr_com(0xc2);
   wr_dat(flagdat);
   wr_com(0x80+0x45);
   for(k=0;k<6;k++)
    {
   wr_dat(disdata);
    }
}
void main()
{init_play();
    while(1)
   { read_temp();
          ds1820disp();
   }
}

fengyuxiaoxiao 发表于 2012-5-30 22:40:17

问题:开始时上电就是85度,过了1s左右就显示正常,这个可以理解,第一次转换还没完成这是默认值,但是我在转换之后加了个延时后就不是85度了,跟准确值比较相近,总有点差距,也是过了1s以后就显示正常值了,求高手解释!
页: [1]
查看完整版本: ds18b20+1602温度传感器上电初始值为什么不准确