打印
[STC单片机]

为什么我的18B20 采集的数据一直不变的

[复制链接]
1072|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
王红博|  楼主 | 2016-12-4 15:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*****ζȴ«¸ÐÆ÷³ÌÐò******/



void delay(uint i)      //delay   
{
      while(i--);
}
/************************************************/
/*          ³õʼ»¯ds18b2×Óº¯Êý*                 */
/************************************************/
Init_DS18B20(void)
  {
     uchar x=0;
     DQ = 1;               //DQ¸´Î»
     delay(8);             //ÉÔ×öÑÓʱ
     DQ = 0;               //µ¥Æ¬»ú½«DQÀ­µÍ
     delay(80);            //¾«È·ÑÓʱ ´óÓÚ 480us
     DQ = 1;               //À­¸ß×ÜÏß
     delay(14);
     x=DQ;                 //ÉÔ×öÑÓʱºó Èç¹ûx=0Ôò³õʼ»¯³É¹¦ x=1Ôò³õʼ»¯Ê§°Ü
     delay(20);
  }

/*************************************************/
/*              ¶Á×Ö½Ú×Óº¯Êý                     */
/*************************************************/
ReadOneChar(void)
  {
     uchar i = 0;
     uchar dat = 0;
   for (i=8;i>0;i--)
    {
      DQ = 0;              // ¸øÂö³åÐźÅ
      dat>>=1;             // Êý¾ÝÓÒÒÆһλ
      DQ = 1;              // ¸øÂö³åÐźÅ
      if(DQ)               // DQΪ1
      dat|=0x80;          // ¶Á³öÊý¾Ý
      delay(4);            // ÑÓʱ
     }
   return(dat);
  }
/*************************************************/
/*               Ð´×Ö½Ú×Óº¯Êý                    */
/*************************************************/
WriteOneChar(unsigned char dat)
  {
    uchar i = 0;
    for (i=8; i>0; i--)
     {
       DQ = 0;
       DQ = dat&0x01;   //дÈëһλÊý¾Ý
       delay(5);
       DQ = 1;
       dat>>=1;        //ÓÒÒÆһλÊý¾Ý
     }
  }
/*************************************************/
/*           DS18B20дÃüÁÊý                   */
/*************************************************/
void tmpwritebyte(uchar dat)   // write a byte to ds18b20  
  {                              // ¸øζȴ«¸ÐÆ÷дһ¸ö×Ö½Ú
    uint i;
    uchar j;
    bit testb;
    for(j=1;j<=8;j++)
     {
        testb=dat&0x01;
        dat=dat>>1;
        if(testb)     //дÈë 1
          {
             DQ=0;
             i++;i++;
             DQ=1;
             i=8;while(i>0)i--; // Êʵ±ÑÓʱ
          }
        else          //дÈë 0
          {
             DQ=0;        
             i=8;while(i>0)i--; // Êʵ±ÑÓʱ
             DQ=1;
             i++;i++;
          }
      }
  }
/******************************************/
/*         ·¢ËÍζÈת»»ÃüÁî               */
/******************************************/
void tmpchange(void)          // DS18B20 begin change   
{
  Init_DS18B20();             // ³õʼ»¯DS18B20
  delay(200);                 // ÑÓʱ
  WriteOneChar(0xcc);         // Ìø¹ýÐòÁкÅÃüÁî
  WriteOneChar(0x44);         // ·¢ËÍζÈת»»ÃüÁî
}
/******************************************/
/*            ¶Á³öζȺ¯Êý                */
/******************************************/
void tmp()                    //get the temperature
{
  float tt;
  Init_DS18B20();             // ³õʼ»¯ds18b2×Óº¯Êý  
  delay(1);
  WriteOneChar(0xcc);   // Ìø¹ýROMÃüÁî
  _nop_();
  _nop_();
  WriteOneChar(0xbe);         // ·¢ËͶÁÈ¡Êý¾ÝÃüÁî
  temp_data[0]=ReadOneChar(); // Á¬Ðø¶ÁÁ½¸ö×Ö½ÚÊý¾Ý
  _nop_();
  _nop_();
  temp_data[1]=ReadOneChar();
  temp=temp_data[1];
  temp<<=8;                                                
  temp=temp|temp_data[0];     // Á½×ֽںϳÉÒ»¸öÕûÐͱäÁ¿¡£
  tt=temp*0.0625;           // µÃµ½Õæʵʮ½øÖÆζÈÖµ£¬ÒòΪDS18B20
                              // ¿ÉÒÔ¾«È·µ½0.0625¶È£¬ËùÒÔ¶Á»ØÊý¾ÝµÄ×îµÍλ´ú±íµÄÊÇ
                              // 0.0625¶È¡£
  temp=tt*10+0.5;           // ·Å´óÊ®±¶£¬ÕâÑù×öµÄÄ¿µÄ½«Ð¡ÊýµãºóµÚһλ
                              // Ҳת»»Îª¿ÉÏÔʾÊý×Ö£¬Í¬Ê±½øÐÐÒ»¸öËÄÉáÎåÈë²Ù×÷¡£
                                                          
        temp_buffer[0]=temp/1000+48;
        temp_buffer[1]=temp%1000/100+48;
        temp_buffer[2]=temp%100/10+48;
        temp_buffer[3]=temp%10+48;
                  // ·µ»ØζÈÖµ
}

/*Ö÷¿ØÖƳÌÐò*/
void main()
{
        init();//³õʼ»¯´®¿ÚºÍ¶¨Ê±Æ÷
        while(1)//ËÀÑ­»·
        {       
       
                if(rec_flag==1)//½ÓÊÕ±ê¼ÇΪ1,ÔòÖ´ÐÐÏÂÃæµÄµÄ³ÌÐò,Ö÷Ìâ˼Ïë¾ÍÊÇ  Èç¹û½ÓÊÕµ½×Ö·û,¾Í»á·¢ËÍÒ»´®×Ö·û¸øµçÄÔ,ÀàËÆÓÚÎÊѯ·½Ê½(ÄãÎÊÒ»¾ä,ÎÒ´ðÒ»¾ä)
                {
                        delay(10);
                        tmpchange();
                        _nop_();
                        _nop_();
                        tmp();
                        _nop_();
                        _nop_();
                        send_all(temp_buffer);
                }
        }
}
我贴出了一部分代码,我用的是18B20采集温度然后通过串口上传到电脑,但是串口调试工具显示的温度一直不变.用手摸也不变

相关帖子

沙发
694844985| | 2016-12-4 18:26 | 只看该作者
时序有问题

使用特权

评论回复
板凳
NE5532| | 2016-12-4 22:03 | 只看该作者
请看《程序调试黑宝书》,另请先调ID读取,读对了(CRC算对了)再读温度。

使用特权

评论回复
地板
songchenping| | 2016-12-5 08:37 | 只看该作者
这种片子按理说不应该出问题啊,

使用特权

评论回复
5
songchenping| | 2016-12-5 08:37 | 只看该作者
要先看明白Datasheet资料啊

使用特权

评论回复
6
songchenping| | 2016-12-5 08:38 | 只看该作者
要先看明白Datasheet资料啊

使用特权

评论回复
7
laocuo1142| | 2016-12-5 09:22 | 只看该作者
18B20是单总线,所以对时序要求比较高,你需要严格按照手册上的时间,对照示波器验证时序,花点时间是完全可以调通的!!!

使用特权

评论回复
8
laocuo1142| | 2016-12-5 09:23 | 只看该作者
另外通信脚需要4.7k上拉电阻

使用特权

评论回复
9
数码小叶| | 2016-12-5 11:38 | 只看该作者
得上示波器或者逻辑分析仪看时序,最直接

使用特权

评论回复
10
数码小叶| | 2016-12-5 11:39 | 只看该作者
laocuo1142 发表于 2016-12-5 09:23
另外通信脚需要4.7k上拉电阻

这个上拉很坑,以前就掉下去了

使用特权

评论回复
11
皈依| | 2016-12-5 13:37 | 只看该作者
先看波形吧。。。

使用特权

评论回复
12
ningling_21| | 2016-12-5 15:21 | 只看该作者
没有等待转换完成

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝