ds18b20为什么读回来都是1

[复制链接]
5449|20
 楼主| SaberLion 发表于 2014-4-1 11:10 | 显示全部楼层 |阅读模式
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define MASK 0x01

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

  11. void Config18b20(void);
  12. bit Reset(void);
  13. void write_byte(uchar temp);
  14. uchar read_byte(void);
  15. bit read_temper(uchar * ls, uchar * ms);
  16. void delay60us(uint i);
  17. void delay5us(void);

  18. int main(void)
  19. {
  20.         uchar ls = 0,ms = 0,temp;

  21.         Config18b20();
  22.         while(1)
  23.         {
  24.                 if(read_temper(&ls,&ms))
  25.                 {
  26.                         temp = ls & 0x0f;
  27.                         P1 = temp;                               //  用来测试是否读取成功
  28.                         delay60us(50);       
  29.                 }               
  30.                 else
  31.                         P1 = 0x00;
  32.         }
  33. }

  34. void Config18b20(void)  //重新配置报警限定值和分辨率
  35. {
  36.      Reset();
  37.      write_byte(0xcc);  //skip rom
  38.      write_byte(0x4e);  //write scratchpad
  39.      write_byte(0x23);  //上限
  40.      write_byte(0x0f);  //下限
  41.      write_byte(0x7f);     //set 12 bit (0.125)
  42.      Reset();
  43.      write_byte(0xcc);  //skip rom
  44.      write_byte(0x48);  //保存设定值
  45.      Reset();
  46.      write_byte(0xcc);  //skip rom
  47.      write_byte(0xb8);  //回调设定值
  48. }  

  49. bit Reset(void)
  50. {
  51.         bit flag = 1;

  52.         DS18B20 = 1;
  53.         _nop_();
  54.         DS18B20 = 0;
  55.         delay60us(10);
  56.         DS18B20        = 1;
  57.         delay60us(1);
  58.         delay5us();
  59.         flag = DS18B20;
  60.         delay60us(9);
  61.         DS18B20 = 1;
  62.         delay60us(20);

  63.         return flag;
  64. }

  65. void write_byte(uchar temp)
  66. {
  67.         uchar i;

  68.         DS18B20 = 1;
  69.         _nop_();
  70.         for(i = 0; i < 8; i++)
  71.         {
  72.                 DS18B20 = 0;
  73.                 delay5us();
  74.                 DS18B20 = (temp >> i) & MASK;
  75.                 delay60us(1);
  76.                 DS18B20 = 1;
  77.                 _nop_();
  78.         }
  79. }

  80. uchar read_byte(void)
  81. {
  82.         uchar i,temp;

  83.         DS18B20 = 1;
  84.         _nop_();
  85.         for(i = 0; i < 8; i++)
  86.         {
  87.                 DS18B20 = 0;
  88.                 _nop_();
  89.                 _nop_();
  90.                 DS18B20 = 1;
  91.                 delay5us();
  92.                 temp >>= 1;
  93.                 if(DS18B20)
  94.                         temp |= 0x80;
  95.                 delay60us(1);               
  96.         }
  97.         return temp;       
  98. }



  99. bit read_temper(uchar * ls, uchar * ms)
  100. {
  101.         bit k = 0;

  102.         if(!Reset())
  103.         {
  104.                 write_byte(0xcc);
  105.                 write_byte(0x44);
  106.                 while(!DS18B20);                   //  等待转换换成
  107.         }
  108.         if(!Reset())
  109.         {
  110.                 write_byte(0xcc);
  111.                 write_byte(0xbe);
  112.                 *ls = read_byte();
  113.                 *ms = read_byte();
  114.                 k = 1;
  115.         }
  116.         return k;
  117. }

  118. void delay60us(uint i)
  119. {
  120.         uchar j;

  121.         for(i; i > 0; i--)
  122.                 for(j = 0; j < 15; j++)
  123.                         continue;
  124. }

  125. void delay5us(void)
  126. {
  127.         _nop_();
  128.         _nop_();
  129.         _nop_();
  130.         _nop_();
  131.         _nop_();
  132. }


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
这结果告诉人们,读写控制或者硬件有问题,还没进入状态……

硬件的话应该是没问题的  试过被的程序能运行
读写控制油哪些地方要注意的?
ningling_21 发表于 2014-4-1 11:16 | 显示全部楼层
时序不对,一个初始化18B20代码供参考...
  1. uchar Init_DS18B201(void)
  2. {

  3.          unsigned char x=0;
  4.          DQ1 = 1;          //DQ1复位
  5.          delay_18B20(8);  //稍做延时
  6.          DQ1 = 0;          //单片机将DQ1拉低
  7.          delay_18B20(400); //精确延时 大于 480us       
  8.          DQ1 = 1;          //拉高总线
  9.          delay_18B20(80);
  10.          x=DQ1;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  11.          delay_18B20(20);  //18b20发出存在脉冲,60-240US
  12.          DQ1 = 1;
  13.          return x;
  14. }
 楼主| SaberLion 发表于 2014-4-1 11:34 | 显示全部楼层
ningling_21 发表于 2014-4-1 11:16
时序不对,一个初始化18B20代码供参考...

我的初始化代码时序也是这样呀。。。
ningling_21 发表于 2014-4-1 11:35 | 显示全部楼层
SaberLion 发表于 2014-4-1 11:34
我的初始化代码时序也是这样呀。。。

你延时的时间准确吗...
 楼主| SaberLion 发表于 2014-4-1 11:37 | 显示全部楼层
ningling_21 发表于 2014-4-1 11:35
你延时的时间准确吗...

嗯 用调试侧过延时
ningling_21 发表于 2014-4-1 11:38 | 显示全部楼层
SaberLion 发表于 2014-4-1 11:37
嗯 用调试侧过延时

调试有时没有,时间宽度要用示波器去测量...
ayb_ice 发表于 2014-4-1 11:47 | 显示全部楼层
有没有使用中断,如果用了,还要考虑中断的影响
 楼主| SaberLion 发表于 2014-4-1 12:51 | 显示全部楼层
ayb_ice 发表于 2014-4-1 11:47
有没有使用中断,如果用了,还要考虑中断的影响

没有用中断
ppxiaop 发表于 2014-4-1 12:54 | 显示全部楼层
用示波器吧。没有示波器的时候,有时候捣鼓半天也弄不对时序。
有了示波器,一切都非常简单了。
 楼主| SaberLion 发表于 2014-4-1 13:50 | 显示全部楼层
ppxiaop 发表于 2014-4-1 12:54
用示波器吧。没有示波器的时候,有时候捣鼓半天也弄不对时序。
有了示波器,一切都非常简单了。 ...

= =身边没有示波器啊。。。
 楼主| SaberLion 发表于 2014-4-1 14:32 | 显示全部楼层
本帖最后由 SaberLion 于 2014-4-1 14:39 编辑

我去 我知道了  我调试的时候改晶振大小 改成12M  但是好像没有用  所以实际上还是24M的延时
现在把单片机的晶振换成24M就可以了  真是蛋疼
ningling_21 发表于 2014-4-1 14:59 | 显示全部楼层
SaberLion 发表于 2014-4-1 14:32
我去 我知道了  我调试的时候改晶振大小 改成12M  但是好像没有用  所以实际上还是24M的延时
现在把单片机 ...

终究还是时间长短的问题...
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
}
这是咱写的,调试单总线的时候还算好用
m564522634 发表于 2014-4-1 18:00 | 显示全部楼层
不想看你的程序,你拿示波器看吧。一看就知道哪里出问题了,查程序你可能查不出什么了。看下你的读写时序与规定的数据手册上的有多少的差。
生无所息1 发表于 2014-4-2 09:42 | 显示全部楼层
呵呵,神奇的18b20!
nickyamw 发表于 2014-4-2 09:52 | 显示全部楼层
18B20就是时序难搞,
desertsailor 发表于 2014-4-2 19:16 | 显示全部楼层
延时不够
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

59

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部