7940|18

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于DS18B20读取温度的问题 [复制链接]

我已经把程序写好了··但是读出来的一直都是0,不知道什么原因··请高手解答啊··
#include

extern void delay(unsigned int z);   //延时子程序   

#define  uchar  unsigned char
#define  uint   unsigned int

#define T_CONVER 0x44  //开始温度转换
#define T_CONFIG 0x5f  //11位转换
#define T_READ 0xbe    //读暂存器
#define T_WRITE 0x4e   //写暂存器
#define T_ROM_JMP 0xcc  //忽略64ROM地址  
#define T_cont  0.0625  //温度转换常数

sbit DQ = P0^0;  //DS18B20数据输出端
bit REC_suc = 0;  //DS18B20成功复位标志位
bit T_sign;   //温度正负符号
float temp = 0;  //转换好的温度数值
unsigned char t_bai,t_shi,t_ge,t_feng; //温度转换好的各个位
bit DS18B20_init();  //DS18B20初始化函数
void DS18B20_send(unsigned char in_data); //DS18B20发送一个字节数据函数
unsigned char DS18B20_read(); //从DS18B20读取一个字节函数
void ReadTemperature(); //读取温度数值
void temp_data_turn(float in_data); //温度转换

void Delayus(uchar us)   
{
    while(us--);   
}

bit DS18B20_init()
{
bit tem = 1;
  unsigned char i = 1,j = 0;
  DQ = 0;
  j ++;
  DQ = 1;
  Delayus(2);
  while(REC_suc == 0)
{
     DQ = 0;
     Delayus(100);  
     DQ = 1;
     Delayus(10);  //等待DS18B20作出相应
     while(1)
    {
   i = DQ;
       if(i == 0)
      {
    REC_suc = 1;
    tem = i ;
    Delayus(70);  
    break;
   }
    }
  DQ = 1;
}
  REC_suc = 0;
  return tem;
}

void DS18B20_send(unsigned char in_data)
{   
    unsigned char i,out_data,k,j = 0;
    out_data = in_data;
    for(i = 1; i < 9; i++)  //串行发送数据
{
     DQ = 0;
  _nop_();
     _nop_();
     k = out_data&0x01;
  if(k == 0x01)    //判断数据  写1
  {
   DQ = 1;
     }
  else       //写0
     {
   DQ = 0;
  }
  Delayus(9);  //延时62us
  DQ = 1;
     out_data = _cror_(out_data,1);  //循环左移1位
   }
DQ = 1;
}

unsigned char DS18B20_read()
{
   unsigned char i,in_data,k,j = 0;
   in_data = 0;
   for(i = 1; i < 9; i ++)  //串行发送数据
   {
   DQ = 0;
  _nop_();
     _nop_();
  DQ=1;
  j ++;
  _nop_();
     _nop_();
  k = DQ;     //读DQ端
  if(k == 1)     //读到的数据是1
  {
      in_data = in_data|0x01;
  }
   else
  {
      in_data = in_data|0x00;
  }
  Delayus(7);  //延时51us
  DQ=1;
  in_data = _cror_(in_data,1); //循环左移1位
  j ++;
   }
   return(in_data);
}

void ReadTemperature()
{
unsigned char T_L = 0;
unsigned char T_H = 0;
unsigned char k;
DS18B20_init();
DS18B20_send(T_ROM_JMP); // 跳过读序号列号的操作
DS18B20_send(T_CONVER); // 启动温度转换
DS18B20_init();
DS18B20_send(T_ROM_JMP); //跳过读序号列号的操作
DS18B20_send(T_READ); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

T_L=DS18B20_read();
T_H=DS18B20_read();

k = T_H&0xf8;   
if(k == 0xf8)
T_sign = 1;   //温度是负数
else
T_sign = 0;  //温度是正数

T_H = T_H&0x07;
temp = (T_H*256+T_L)*T_cont;
}


void temp_data_turn(float in_data)
{
  unsigned int y;
  in_data = in_data*10; //数值扩大10倍,精度到0.1
  t_bai = in_data/1000;
  y = (unsigned int)in_data%1000;
  t_shi = y/100;
  y = y%100;
  t_ge = y/10;
  t_feng = y%10;
}

最新回复

首先DS18B20 上电默认要精度为12位,转换时间为750ms, 楼主怎么解决的  ,详细分享下, 我的读出来的数据总是0xff, 初始化是对的啊,  详情 回复 发表于 2013-7-15 18:18
点赞 关注

回复
举报

2

帖子

0

TA的资源

禁止访问

沙发
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 guetcw 的回复:
这种问题一般都是单片机的指令周期不一样导致的,适当调整一下延时量


我已经在网上找了很多版本了···我昨天晚上也是调这个延时还是没反映···我用的51晶振是12M的··
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
对了··我在初始化的时候设置一个标志量,返回的是0 说明初始化应该成功了啊···但是就是读不出来啊··温度··
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

5
 
DS1802那个IO上拉了没有?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 4 楼 lbing7 的回复:
DS1802那个IO上拉了没有?


我接了个4k的电阻接在io口上没上拉···但是现在没有出现0了···出现的数字都是一样的啦
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(初级)

7
 
温度转换和温度读取之间应该有个延时吧,
DS18B20_send(T_ROM_JMP); // 跳过读序号列号的操作
DS18B20_send(T_CONVER); // 启动温度转换
延时750ms左右吧
DS18B20_init();
DS18B20_send(T_ROM_JMP); //跳过读序号列号的操作
DS18B20_send(T_READ); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
或者直接把显示程序加到那个位置 只要有足够的时间
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
网上有很多现成的程序的

可能主要是时序不对。

还有:
18b20转换时间好像跟设置的精度有关系,最慢时可能要750ms吧? 忘了
所以给指令之后可能要等一会才有结果的。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
网上有很多现成的程序的,一般你要注意一下晶振的数值。
再就是上拉电阻一般事10k呢。
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

11
 
哈哈,我刚搞定,又一个兄弟在问了。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
时序不对。。。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 
帮顶
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
时序不对!
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 
恩,学习一下了!
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 
恩,学习一下了!
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

17
 
把延时函数的具体时间标注出来
对照时序图   
我觉得是时序不对  
我记得初始化的时候 要有480--960US的延时的 是信号量
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

18
 
要注意DS18B20在应答后要有一个延时。
void ds18b20_rst(void)
{
        DDRB |= (1 << DQ);                        // 输出
        PORTB &= ~(1 << DQ);                        // 0电平
        _delay_us (100);
        _delay_us (100);
        _delay_us (100);
        _delay_us (100);
        _delay_us (100);
        _delay_us (100);
        PORTB |= (1 << DQ);                        // 输出高
        DDRB &= ~(1 << DQ);                        // 读
        _delay_us (50);                                // 等待50uS
        while (PINB & (1 << DQ));                // 等待DS18B20应答脉冲
        _delay_us (100);
        _delay_us (100);
        _delay_us (100);
        _delay_us (100);
        _delay_us (100);
        _delay_us (100);
}
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

19
 
首先DS18B20 上电默认要精度为12位,转换时间为750ms,
楼主怎么解决的  ,详细分享下,
我的读出来的数据总是0xff, 初始化是对的啊,
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表