搜索
bottom↓
回复: 1

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

[复制链接]

出0入0汤圆

发表于 2012-5-30 22:35:13 | 显示全部楼层 |阅读模式
还是先上程序吧,也是网上借鉴的一个程序:
#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[6];
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[m]);}
     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[0]=tvalue/10000+0x30;
     disdata[1]=tvalue%10000/1000+0x30;
     disdata[2]=tvalue%1000/100+0x30;
     disdata[3]=0x2e;
     disdata[4]=tvalue%100/10+0x30;
     disdata[5]=tvalue%10+0x30;
     if(tflag==0)
     flagdat=0x20;
     else
      flagdat=0x2d;
     if(disdata[0]==0x30)
     {disdata[0]=0x20;
          
       if(disdata[1]==0x30)
       {disdata[1]=0x20;
        }
      }
   wr_com(0xc2);
   wr_dat(flagdat);
   wr_com(0x80+0x45);
   for(k=0;k<6;k++)
    {
     wr_dat(disdata[k]);
    }
}
void main()
{  init_play();
    while(1)
     { read_temp();
          ds1820disp();
     }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-5-30 22:40:17 | 显示全部楼层
问题:开始时上电就是85度,过了1s左右就显示正常,这个可以理解,第一次转换还没完成这是默认值,但是我在转换之后加了个延时后就不是85度了,跟准确值比较相近,总有点差距,也是过了1s以后就显示正常值了,求高手解释!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 00:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表