4182|6

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

DS18B20 不能读取温度 [复制链接]

现在我的问题是,复位没问题,已经通过示波器查看波形。

写字节的波形也对,但是就是看不到DS18B20传过来的温度波形,输出信息一直是104或10c .

从网上找了很多资料,修改了很多,但是就是没有波形,各位高手麻烦看一下我的程序,帮帮忙~ 在此非常感谢。

以下是我的程序:

void Ds18b20_Delay_Unit(BYTE wUSec) //delay
{
    WORD wCount; // loop counter

    while (wUSec--)
    {
        wCount = 100; // reset loop counter
        while (--wCount) ;
    }
}


//--------------DS18B20 driver------------------

//write one byte
void DS18B20_WriteOneByte(UCHAR ucWriteData)
{
//int i;
UCHAR uci;
for(uci=0; uci<8; uci++)
{
  P1_7=0;
  P1_7=ucWriteData&0x01;
  Ds18b20_Delay_Unit(3);//delay 66us
  P1_7=1;
  //i=10;
  //while(i--);//delay 2us
  
  ucWriteData>>=1;
}
}
//read one byte
UCHAR  DS18B20_ReadOneByte(void)
{
int i;
UCHAR uci;
UCHAR ucReadData=0;

for(uci=0; uci<8; uci++)
{
  P1_7=0;
  ucReadData >>=1;
  P1_7=1;
  i=10;
  while(i--);//delay 2us
  ucReadData |= P1_7;
  Ds18b20_Delay_Unit(3);
}
return ucReadData;
}

//initial DS18B20
void InitDS18B20(void)
{
int i;
P1_7=1;
i=5;
while(i--);
P1_7=0;
Ds18b20_Delay_Unit(30);//delay 860us
P1_7=1;
}

//read temprature
float DS18B20_GetTemperature(void)
{

UCHAR bTemperature;
UCHAR ucTemperatureLowByte;
UCHAR ucTemperatureHighByte;

//EA=0; //disable MCU interrupt
InitDS18B20();
Delay1ms(2);
DS18B20_WriteOneByte(0xCC); //skip rom
DS18B20_WriteOneByte(0x44);//convert temperature

Delay1ms(1000); //long time delay

InitDS18B20();
Delay1ms(2);
DS18B20_WriteOneByte(0xCC); //skip rom
DS18B20_WriteOneByte(0xBE);//read temperature

ucTemperatureLowByte = DS18B20_ReadOneByte();
ucTemperatureHighByte = DS18B20_ReadOneByte();
//ucTemperatureHighByte = DS18B20_ReadOneByte()<<8;
//bTemperature = (ucTemperatureHighByte | ucTemperatureLowByte) *0.0625;
bTemperature = (ucTemperatureHighByte>>4 | ucTemperatureLowByte<<4)&0x3F ;

printk("\ntemp===>%x",ucTemperatureLowByte);
printk("\ntemp===>%x",ucTemperatureHighByte);
printk("\ntemp===>%x\n",bTemperature);

//EA=1;//enable MCU interrupt

return bTemperature;
}

最新回复

根据时序来就没问题的 我也刚有做这个· 延时要准确计算啊~~   详情 回复 发表于 2010-3-16 11:23
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
18b20对时序的延时要求是有限制的,不同的单片机或者频率不同,直接拿别人的程序不一定能用,你要确定你程序里的延时是否正确,最好用示波器看。一般读不出来温度都是延时不对。不是你想延时多久就延时多久,仔细看数据手册。
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
还有。。。

上拉有没有做好

 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(初级)

4
 
要用定时器看看 你的延时程序的时间,不过楼主用 示波器应该也行哈,我是用定时器哈,
 
 
 

回复

99

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢大家,问题已经解决。

程序没有问题,是因为原来的想法有问题~~ 呵呵。
原来以为只要写ROM,数据线上就会有波形传回,后来才知道也得先拉低电平并保持1-15us才有数据传回。


 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 4 楼 wuqing0811 的回复:
谢谢大家,问题已经解决。

程序没有问题,是因为原来的想法有问题~~ 呵呵。
原来以为只要写ROM,数据线上就会有波形传回,后来才知道也得先拉低电平并保持1-15us才有数据传回。





我好像也遇到这种情况··请问在哪加低电平啊···
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

7
 
根据时序来就没问题的
我也刚有做这个· 延时要准确计算啊~~
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表