打印

ds18b20为什么读回来都是1

[复制链接]
4652|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SaberLion|  楼主 | 2014-4-1 11:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define MASK 0x01

sbit DS18B20 = P3^7;
//sbit lcden = P2^7;
//sbit lcdrs = P2^6;
//sbit lcdrw = P2^5;
//uchar code table[]={0,0,1,2,2,3,4,4,5,6,6,7,8,8,9,9};

void Config18b20(void);
bit Reset(void);
void write_byte(uchar temp);
uchar read_byte(void);
bit read_temper(uchar * ls, uchar * ms);
void delay60us(uint i);
void delay5us(void);

int main(void)
{
        uchar ls = 0,ms = 0,temp;

        Config18b20();
        while(1)
        {
                if(read_temper(&ls,&ms))
                {
                        temp = ls & 0x0f;
                        P1 = temp;                               //  用来测试是否读取成功
                        delay60us(50);       
                }               
                else
                        P1 = 0x00;
        }
}

void Config18b20(void)  //重新配置报警限定值和分辨率
{
     Reset();
     write_byte(0xcc);  //skip rom
     write_byte(0x4e);  //write scratchpad
     write_byte(0x23);  //上限
     write_byte(0x0f);  //下限
     write_byte(0x7f);     //set 12 bit (0.125)
     Reset();
     write_byte(0xcc);  //skip rom
     write_byte(0x48);  //保存设定值
     Reset();
     write_byte(0xcc);  //skip rom
     write_byte(0xb8);  //回调设定值
}  

bit Reset(void)
{
        bit flag = 1;

        DS18B20 = 1;
        _nop_();
        DS18B20 = 0;
        delay60us(10);
        DS18B20        = 1;
        delay60us(1);
        delay5us();
        flag = DS18B20;
        delay60us(9);
        DS18B20 = 1;
        delay60us(20);

        return flag;
}

void write_byte(uchar temp)
{
        uchar i;

        DS18B20 = 1;
        _nop_();
        for(i = 0; i < 8; i++)
        {
                DS18B20 = 0;
                delay5us();
                DS18B20 = (temp >> i) & MASK;
                delay60us(1);
                DS18B20 = 1;
                _nop_();
        }
}

uchar read_byte(void)
{
        uchar i,temp;

        DS18B20 = 1;
        _nop_();
        for(i = 0; i < 8; i++)
        {
                DS18B20 = 0;
                _nop_();
                _nop_();
                DS18B20 = 1;
                delay5us();
                temp >>= 1;
                if(DS18B20)
                        temp |= 0x80;
                delay60us(1);               
        }
        return temp;       
}



bit read_temper(uchar * ls, uchar * ms)
{
        bit k = 0;

        if(!Reset())
        {
                write_byte(0xcc);
                write_byte(0x44);
                while(!DS18B20);                   //  等待转换换成
        }
        if(!Reset())
        {
                write_byte(0xcc);
                write_byte(0xbe);
                *ls = read_byte();
                *ms = read_byte();
                k = 1;
        }
        return k;
}

void delay60us(uint i)
{
        uchar j;

        for(i; i > 0; i--)
                for(j = 0; j < 15; j++)
                        continue;
}

void delay5us(void)
{
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
}


相关帖子

沙发
ayb_ice| | 2014-4-1 11:11 | 只看该作者
估计时序不对

使用特权

评论回复
板凳
SaberLion|  楼主 | 2014-4-1 11:13 | 只看该作者
ayb_ice 发表于 2014-4-1 11:11
估计时序不对

时序我对照看了好几遍 查不出问题

使用特权

评论回复
地板
SaberLion|  楼主 | 2014-4-1 11:15 | 只看该作者
yyy71cj 发表于 2014-4-1 11:14
这结果告诉人们,读写控制或者硬件有问题,还没进入状态……

硬件的话应该是没问题的  试过被的程序能运行
读写控制油哪些地方要注意的?

使用特权

评论回复
5
ningling_21| | 2014-4-1 11:16 | 只看该作者
时序不对,一个初始化18B20代码供参考...
uchar Init_DS18B201(void)
{

         unsigned char x=0;
         DQ1 = 1;          //DQ1复位
         delay_18B20(8);  //稍做延时
         DQ1 = 0;          //单片机将DQ1拉低
         delay_18B20(400); //精确延时 大于 480us       
         DQ1 = 1;          //拉高总线
         delay_18B20(80);
         x=DQ1;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
         delay_18B20(20);  //18b20发出存在脉冲,60-240US
         DQ1 = 1;
         return x;
}

使用特权

评论回复
6
SaberLion|  楼主 | 2014-4-1 11:34 | 只看该作者
ningling_21 发表于 2014-4-1 11:16
时序不对,一个初始化18B20代码供参考...

我的初始化代码时序也是这样呀。。。

使用特权

评论回复
7
ningling_21| | 2014-4-1 11:35 | 只看该作者
SaberLion 发表于 2014-4-1 11:34
我的初始化代码时序也是这样呀。。。

你延时的时间准确吗...

使用特权

评论回复
8
SaberLion|  楼主 | 2014-4-1 11:37 | 只看该作者
ningling_21 发表于 2014-4-1 11:35
你延时的时间准确吗...

嗯 用调试侧过延时

使用特权

评论回复
9
ningling_21| | 2014-4-1 11:38 | 只看该作者
SaberLion 发表于 2014-4-1 11:37
嗯 用调试侧过延时

调试有时没有,时间宽度要用示波器去测量...

使用特权

评论回复
10
ayb_ice| | 2014-4-1 11:47 | 只看该作者
有没有使用中断,如果用了,还要考虑中断的影响

使用特权

评论回复
11
SaberLion|  楼主 | 2014-4-1 12:51 | 只看该作者
ayb_ice 发表于 2014-4-1 11:47
有没有使用中断,如果用了,还要考虑中断的影响

没有用中断

使用特权

评论回复
12
ppxiaop| | 2014-4-1 12:54 | 只看该作者
用示波器吧。没有示波器的时候,有时候捣鼓半天也弄不对时序。
有了示波器,一切都非常简单了。

使用特权

评论回复
13
SaberLion|  楼主 | 2014-4-1 13:50 | 只看该作者
ppxiaop 发表于 2014-4-1 12:54
用示波器吧。没有示波器的时候,有时候捣鼓半天也弄不对时序。
有了示波器,一切都非常简单了。 ...

= =身边没有示波器啊。。。

使用特权

评论回复
14
SaberLion|  楼主 | 2014-4-1 14:32 | 只看该作者
本帖最后由 SaberLion 于 2014-4-1 14:39 编辑

我去 我知道了  我调试的时候改晶振大小 改成12M  但是好像没有用  所以实际上还是24M的延时
现在把单片机的晶振换成24M就可以了  真是蛋疼

使用特权

评论回复
15
ningling_21| | 2014-4-1 14:59 | 只看该作者
SaberLion 发表于 2014-4-1 14:32
我去 我知道了  我调试的时候改晶振大小 改成12M  但是好像没有用  所以实际上还是24M的延时
现在把单片机 ...

终究还是时间长短的问题...

使用特权

评论回复
16
amwrdfe| | 2014-4-1 15:00 | 只看该作者
void delay5us(void)
{
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
}
12M的晶振, 12T, 这不是5us, 是9us。

void delay_10us(u8 s)
{
  s = s;
  #pragma asm
  MOV A,R7
  MOV R1,A
L2:
  MOV R0,TIME_10US
L1:
  DJNZ R0,L1
  DJNZ R1,L3
  RET
L3:
  NOP
  NOP
  NOP
  NOP
  NOP
  SJMP L2
  #pragma endasm
}
这是咱写的,调试单总线的时候还算好用

使用特权

评论回复
17
m564522634| | 2014-4-1 18:00 | 只看该作者
不想看你的程序,你拿示波器看吧。一看就知道哪里出问题了,查程序你可能查不出什么了。看下你的读写时序与规定的数据手册上的有多少的差。

使用特权

评论回复
18
生无所息1| | 2014-4-2 09:42 | 只看该作者
呵呵,神奇的18b20!

使用特权

评论回复
19
nickyamw| | 2014-4-2 09:52 | 只看该作者
18B20就是时序难搞,

使用特权

评论回复
20
desertsailor| | 2014-4-2 19:16 | 只看该作者
延时不够

使用特权

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

本版积分规则

18

主题

59

帖子

1

粉丝