打印

DS18B20读不出数据

[复制链接]
1820|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laibour|  楼主 | 2011-3-14 20:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各校大侠:我用的是PIC18F97J60,时钟为25M,DS18B20接的端口为PH5(是一个模拟通道口,开发板上固定的),写了一段程序,但是读不出转换后的值,不知道为什么?

#include<p18f97j60.h>

#define uchar   unsigned char
#define uint   unsigned int

#define Temp_DQ_TRIS        (TRISHbits.TRISH5)
#define DQ                          (PORTHbits.RH5)


#define SkipROM                   0xcc
#define ReadScratchpad         0xbe
#define ConvertT                  0x44

uchar TP=0,TP_H=0,TP_L=0;
uchar presence=1;

void delay(uchar n)   
{      
uchar i;   
for(i = 0; i < n; i++)
{
  Nop();   
}
      
}

/**********************Reset*********************/
void Bus_reset(void)
{
while(presence)
{
DQ = 0;
Temp_DQ_TRIS = 0;
delay(250);
delay(250);                      //master keep 480~960 us
DQ = 1;
Temp_DQ_TRIS = 1;
delay(85);                       // DS18B20 wait 15~60 us ,then active low
presence = DQ;
delay(150);   
}
}

/********************Write one bit*************************/
void Write_bit(uchar bit_value)
{
DQ = 0;
Temp_DQ_TRIS = 0;
delay(13);
if(bit_value == 1)
DQ = 1;
delay(72);    //delay 58us
Temp_DQ_TRIS = 1;
}

/**********************Write one byte*********************/
void Write_byte(uchar bytevalue)
{
uchar i;
uchar temp;
for(i = 0; i < 8; i++)
{
  temp = bytevalue >> i;
  temp = temp&0x01;
  Write_bit(temp);
}
delay(2);
}

/**********************Read one bit*********************/
uchar Read_bit(void)
{
uchar bit_value;
DQ = 0;
Temp_DQ_TRIS = 0;
delay(13);     // delay 0~15us
DQ = 1;
Temp_DQ_TRIS = 1;
bit_value = DQ;
delay(72);     //delay 55us
return bit_value;
}
/********************Read one byte*******/
uchar Read_byte(void)
{
uchar i;
uchar value = 0;
for(i = 0; i < 8; i++)
{
  if(Read_bit())
  value = value | (0x01 << i);   //ds18b20的数据输出从第0位开始输出
}
delay(2);
return value;
}

void main(void)
{
int i;
ADCON1=0x0f;
DQ = 0;
Temp_DQ_TRIS = 1;

Bus_reset();                         //复位
Write_byte(SkipROM);            //跳过ROM指令
Write_byte(ConvertT);            //温度转换
delay(250);
delay(250);                           //延时500uS以上
Bus_reset();                           //复位
Write_byte(SkipROM);              //跳过ROM指令
Write_byte(ReadScratchpad);    //执行读RAM存储器指令
TP_L=Read_byte();                   //读RAM数据
TP_H=Read_byte();
Bus_reset();
while(1);
}

运行后,通过view看TP_L和TP_H看到的值均为0
沙发
paulful| | 2013-6-20 21:05 | 只看该作者
楼主 您好,请问你这个问题怎么解决的呀

使用特权

评论回复
板凳
圈圈虫1989| | 2013-6-23 09:45 | 只看该作者
DS18B20的转换时间很长的,500ms以上,你延时小了。

使用特权

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

本版积分规则

22

主题

81

帖子

0

粉丝