发新帖我要提问
12
返回列表
打印

关于DS18B20 温度传感器的问题

[复制链接]
楼主: 天凡云赐
手机看帖
扫描二维码
随时随地手机跟帖
21
HORSE7812| | 2015-5-8 09:17 | 只看该作者 回帖奖励 |倒序浏览
mark

使用特权

评论回复
22
WJSW_BYYDYH| | 2015-5-8 09:21 | 只看该作者
感觉18B20不好用

使用特权

评论回复
23
天凡云赐|  楼主 | 2015-5-8 09:47 | 只看该作者
jordan1111 发表于 2015-5-8 08:37
你的主函数只读了一次把。温度不会更新。

嗯 是的 只让他转换一次 不更新 现在问题主要就是没办法转换出来正确的温度

使用特权

评论回复
24
jordan1111| | 2015-5-8 09:51 | 只看该作者
先循环读看看对不对吧。对的话就是一个延时问题了。

使用特权

评论回复
25
jordan1111| | 2015-5-8 09:54 | 只看该作者
uchar read_DS_wendu()    这个返回值类型与函数不一致。

使用特权

评论回复
26
lvyunhua| | 2015-5-8 10:58 | 只看该作者
循环多读几次,找出规律吗!

使用特权

评论回复
27
天凡云赐|  楼主 | 2015-5-8 12:55 | 只看该作者
lvyunhua 发表于 2015-5-8 10:58
循环多读几次,找出规律吗!

嗯 好的 我去试下@

使用特权

评论回复
评论
ningling_21 2015-5-8 15:51 回复TA
器件初始化正常吗 
28
天凡云赐|  楼主 | 2015-5-8 12:55 | 只看该作者
jordan1111 发表于 2015-5-8 09:54
uchar read_DS_wendu()    这个返回值类型与函数不一致。

嗯 谢谢大哥 我去改下试试

使用特权

评论回复
29
天凡云赐|  楼主 | 2015-5-9 21:27 | 只看该作者
#include<reg51.h>
#include<intrins.h>
#define lcd P0
#define uchar unsigned char
#define uint unsigned int

sbit RS=P2^6;
sbit E=P2^7;
sbit RW=P2^5;

sbit DS_DQ=P3^7;
sbit led=P2^0;

uint xum;
uchar flag;

uchar code table[]="wendu";
uchar code table1[]="   . C";

void delay_long(uint delay)         //延迟函数
{
   uchar i,j;
   for(i=delay;i>0;i--)
    for(j=110;j>0;j--);
        }



void delay(uchar t)           //延时T*us
{
   do{
    _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        } while(--t);
}






//  DS温度传感器部分





  
bit  init_DS()                  //初始化DS总线
{
    bit ack;

    DS_DQ=0;
    delay(50);
        DS_DQ=1;
        delay(6);
        ack=DS_DQ;
        while(!DS_DQ);

        return ack;
  }
            



  void DS_writeBY(uchar BY)         //写字节函数
{
  uchar mak;
  for(mak=0x01;mak!=0;mak<<=1)
  {
    DS_DQ=0;
        _nop_();
        _nop_();
        if((mak&BY)==0)
         DS_DQ=0;
         else
         DS_DQ=1;
         delay(6);
         DS_DQ=1;
         }
   }





    uchar DS_readBY()              //读一个字节
{
   uchar k,date;
   date=0;
   for(k=0x01;k!=0;k<<=1)
        {
           DS_DQ=0;
           _nop_();
           _nop_();
           DS_DQ=1;
           _nop_();
           _nop_();
           if(!DS_DQ)
            date &= ~k;
           else
            date |= k;
          delay(6);
          }
         return date;
        }   
          



  void DS_zhuanhuan_com()                   //温度转换指令
{
  bit ack;
   ack=init_DS();                                        //初始化
   if(ack==0)
   {
   DS_writeBY(0xcc);
   DS_writeBY(0x44);                         //开始温度转换 0X44
        }
   else
    flag=1;                                          //温度转换需要时间 具体 参考手册
}




  uint read_DS_wendu()                     //读取温度 因为有正负 所以用int 类型
{
   uchar tml=0;
   uchar tmh=0;
   float xum1;
   bit ack;


   ack=init_DS();
   if(ack==0)
   {
   DS_writeBY(0xcc);
   DS_writeBY(0xbe);
        }
        else
        flag=1;
                                  
   tml=DS_readBY();                                   //温度值16位 低位
   tmh=DS_readBY();                                   // 高位

  
   xum=tmh;
   xum=(xum<<8)|tml;

   P1=tmh;
   
        xum1=xum*0.0625;
        xum=xum1*10+0.5;

   return xum;
  }








// LCD部分




   void lcd_write_com(uchar xun)
  {
     RS=0;
         RW=0;
         lcd=xun;
         delay_long(5);
         E=1;
         E=0;
         }




  void lcd_write_date(uchar xun1)
  {
     RS=1;
         RW=0;
         lcd=xun1;
         delay_long(5);
         E=1;
         E=0;
         }


   void init_lcd()
{
        uchar i,j;

        lcd_write_com(0x38);
        lcd_write_com(0x0c);
        lcd_write_com(0x06);
        lcd_write_com(0x01);

        lcd_write_com(0x80);

        for(i=0;i<5;i++)
         {
           lcd_write_date(table[i]);
           delay_long(20);
           }

         lcd_write_com(0xc0);

        for(j=0;j<6;j++)
         {
          lcd_write_date(table1[j]);
          delay_long(20);
          }


        }


        void LCD_xianshi(uint num)
  {
             uchar bai,shi,ge;

       
           bai=num/100;
           shi=(num%100)/10;
           ge=(num%100)%10;


         lcd_write_com(0xc1);
         lcd_write_date(0x30+bai);

         lcd_write_com(0xc2);
         lcd_write_date(0x30+shi);

         lcd_write_com(0xc4);
         lcd_write_date(0x30+ge);

        }







  //   主函数部分



void main()
{
     uchar c;
         init_lcd();

    while(1)
   {
             DS_zhuanhuan_com();
            delay_long(800);
       for(c=10;c>0;c--)
       {
          LCD_xianshi(read_DS_wendu);
                  led=flag;   
           }                  
         }
        }  
      


使用特权

评论回复
30
天凡云赐|  楼主 | 2015-5-9 21:29 | 只看该作者
目前问题  我初始化是成功了的 但是为什么我读出来的数据 全是1呢? 还是显示的是固定的值 用P1口去测 读出来的高位和低位 都是1 这是为什么呢?

使用特权

评论回复
31
天凡云赐|  楼主 | 2015-5-10 09:01 | 只看该作者
谢谢各位大哥,问题 解决了~完全是细节问题 自己大意了~LCD_xianshi(read_DS_wendu); 这一句应该是LCD_xianshi(read_DS_wendu()); 才对~~~悲剧啊 太大意了~

使用特权

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

本版积分规则