4188|8

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

不理解ds18b20的时序问题 [复制链接]

这段时间都在研究51机上的DS18B20温度传感器。好像它并没有严格按照时序上的时间来安排,比如下面这个读时序,这个DS是温控主线,DS把值传递给dat后按时序图上说要维持一段时间45us左右,但我测了一下这里的delay(3)就延迟了0.0031684秒(316.84us)。但我把这段程序放入程序中它确可以成功读出温度。我也曾把这个程序的时序按时序图里的时间改过,但改完后发现不能正确读温度了。这是怎么回事呢?
bit tmpreadbit(void)       //read a bit
{
   uint i;
   bit dat;
   DS=0;
   //i++;        //i++ for delay
   DS=1;
   //i++;
   dat=DS;
   delay(3);
   return dat;
}

最新回复

问题我自己找到了,觉得楼上说的对。DS18B20这个东东在单片机上是不好搞,不像在电脑上有什么东西可以直接显示出来。元件发来什么东西要显示出来还要写个数码管程序。如果一个地方没写好就不对。  详情 回复 发表于 2009-10-3 21:06
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
DS18B20对时序的要求是很严格的,我想知道你是怎么样进行时间测量的,最好是用逻辑分析仪或是数字示波器抓波形。
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我只是用keilC51调试程序里面调试发现的。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
把你的delay函数发来看一下,我用汇编写的就是大概等了45us,可以成功读取温度的
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
新概念51单片机C语言教程——入门、提高、开发、拓展全攻略
郭天祥编著
#include
#define unint unsigned int
#define unchar unsigned char
sbit wd=P2^2;
sbit dula=P2^6;
sbit wela=P2^7;

unchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

unchar code weima[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf};

sbit deng=P1^1;

void delay15()
{unchar i;
i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;
}

void delay45()
{unchar i;
for(i=18;i>0;i--);
}

void delay103()
{unchar i;
for(i=45;i>0;i--);
}

void delay482()
{unchar i;
for(i=220;i>0;i--);
}

void delay(unint count)      //delay
{
  unint i;
  while(count)
  {
    i=10;
    while(i>0)
    i--;
    count--;
  }
}


bit init()
{ wd=0;
  delay482();
  wd=1;
  delay15();
  return (wd);
}


void write(char command)
{unint i,j;
bit bit_code;
for(i=0;i<7;i++)
{
bit_code=command&0x01;
command=command>>1;
if(bit_code)
{        wd=0;
        j--;j--;
        wd=1;
        delay45();
}
else{
        wd=0;
        delay45();
        wd=1;
        j--;
}
}
}


bit readbit()
{bit date;
wd=0;
wd=1;
date=wd;
delay45();
return date;
}

unchar tempread()
{unchar temp,date,i;
for(i=0;i<7;i++)
{       
        date=readbit();
        temp=date<<7;
        temp=temp>>1;
}
        return temp;

}


unint temp()
{float tt;
unchar a,b,temp;
init();
delay482();
write(0xcc);
write(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<<=8;
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;

}

void display(unint temp)                        //显示程序
{
   unchar A1,A2,A2t,A3;  
   A1=temp/100;
   A2t=temp%100;
   A2=A2t/10;
   A3=A2t%10;
   dula=0;
   P0=table[A1];                //显示百位
   dula=1;
   dula=0;

   wela=0;
   P0=0x7e;
   wela=1;
   wela=0;
   delay482();

   dula=0;
   P0=table[A2];                //显示十位
   dula=1;
   dula=0;

   wela=0;
   P0=0x7d;
   wela=1;
   wela=0;
   delay482();

   P0=table[A3];                //显示个位
   dula=1;
   dula=0;

   P0=0x7b;
   wela=1;
   wela=0;
   delay482();
}

void tmpchange(void)  //DS18B20 begin change
{
  init();
  delay482();
  write(0xcc);  // address all drivers on bus
  write(0x44);  //  initiates a single temperature conversion
}

void main()
{unchar a;
while(1)
{
tmpchange();

for(a=10;a>0;a--)
{
display(temp());
}
}
}
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

6
 
这个要求还是比较严格的。
贴图?
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
贴图?什么贴图啊?前面的数据是数码管。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

8
 
关于DS18B20的时间控制问题,楼主在用Keil编译的时候适当的设置断点,比较断点之间的时间其实是比较准确的,刚学 DS18B20时都有这么一个瓶颈,等你把断点运用熟练了,以后什么时序问题都可以解决了,花不了多少时间的,别傻傻的把程序换来换去,病急乱投医!
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

9
 
问题我自己找到了,觉得楼上说的对。DS18B20这个东东在单片机上是不好搞,不像在电脑上有什么东西可以直接显示出来。元件发来什么东西要显示出来还要写个数码管程序。如果一个地方没写好就不对。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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