打印

求助:关于DS18B20温度传感器读不出数据的问题

[复制链接]
4270|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qizhying|  楼主 | 2011-1-19 09:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在编写DS18B20的驱动程序(主芯片LM3s9b92)时,读温度数据时一直全是高电平。不知道初始化有没有成功,资料上说初始化时读到低电平就说明总线上有器件,在我调试过程中读到了低电平,是不是说明我的初始化成功了呢?下面是我的程序,请高手们帮我看看,不胜感激!!!!

unsigned char Ds18b20_Init(void)
{ unsigned char flag;

Ds18b20_DatType_OUT(); //数据引脚默认为输出
// DS18B20_DAT_H();     //先将数据线拉高
// delayus_ds18b20(6);  //延时6us,然后将数据线拉低

DS18B20_DAT_L();
delayus_ds18b20(500); //略微延时约600微秒
       //以向DS18B20发出一持续480~960us的低电平复位脉冲

DS18B20_DAT_H();    //释放数据线,将数据线拉高
delayus_ds18b20(30);   //延时约30us,释放总线后需等待15~60us让DS18B20输出存在脉冲)
Ds18b20_DatType_IN();
flag = ROM_GPIOPinRead(DS18B20_DAT_PORT, DS18B20_DAT_PIN); //让单片机检测是否输出了存在脉冲(DQ=0表示存在)  
ROM_GPIOPinTypeGPIOOutput(DS18B20_DAT_PORT, DS18B20_DAT_PIN);
   
delayus_ds18b20(600);   //延时足够长时间,等待存在脉冲输出完毕
// Ds18b20_DatType_OUT();
return flag;      //返回检测成功标志
}

/*
*--------------------------------------------------------------------------------*
*功能:向DS18B20芯片写一个字节的数据
*--------------------------------------------------------------------------------*
*/
void Ds18b20_Write_Byte(unsigned char dat)
{
unsigned char i=0;

Ds18b20_DatType_OUT();
for (i=0; i<8; i++)
{
  delayus_ds18b20(2);
//  DS18B20_DAT_H();           // 先将数据线拉高
//  SysCtlDelay(1);     //等待一个机器周期
  DS18B20_DAT_L();            //将数据线从高拉低时即启动写时序   
  SysCtlDelay(1);     //等待一个机器周期
  if(dat & 0x01) { delayus_ds18b20(2);
   DS18B20_DAT_H();//ROM_GPIOPinWrite(DS18B20_DAT_PORT, DS18B20_DAT_PIN, 0xff);
  }
  else {
   DS18B20_DAT_L();// ROM_GPIOPinWrite(DS18B20_DAT_PORT,  DS18B20_DAT_PIN, 0x00);
  }     // ROM_GPIOPinWrite(DS18B20_DAT_PORT,  DS18B20_DAT_PIN, 0X00);
       // 利用与运算取出要写的某位二进制数据,
       // 并将其送到数据线上等待DS18B20采样   
  
  delayus_ds18b20(65);  //延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
  DS18B20_DAT_H();    //释放数据线?????????????????????////
//  delayus_ds18b20(5);  //延时3us,两个写时序间至少需要1us的恢复期
  dat>>=1;            //将dat中的各二进制位数据右移1位
}
delayus_ds18b20(3); //稍作延时,给硬件一点反应时间
}



unsigned char  Ds18b20_Read_Byte(void)
{
unsigned char i=0;
unsigned char dat=0,DQ_flag;  //储存读出的一个字节数据

for (i=0;i<8;i++)
{
  delayus_ds18b20(2);
  Ds18b20_DatType_OUT();
  
//  DS18B20_DAT_H();       // 先将数据线拉高
//   delayus_ds18b20(1); //延时1us
  DS18B20_DAT_L();      //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
   delayus_ds18b20(2); //延时1us
  DS18B20_DAT_H();     //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
  
  Ds18b20_DatType_IN(); //配置为输入,准备读数据
  delayus_ds18b20(6);     //延时约6us,使主机在15us内采样
  DQ_flag = ROM_GPIOPinRead(DS18B20_DAT_PORT, DS18B20_DAT_PIN); //读引脚
  dat >>= 1;
  if((DQ_flag & DQ_FLAG) == DQ_FLAG){
   dat |=0X80;  //如果读到的数据是1,则将1存入dat
  }
  else{
   dat &= 0x7f;
  }
  delayus_ds18b20(65);
  Ds18b20_DatType_OUT(); //配置为输出
  DS18B20_DAT_H();
  delayus_ds18b20(3);  //延时5us,两个读时序之间必须有大于1us的恢复期   
}                     
return(dat);    //返回读出的十六进制数据
}

相关帖子

沙发
xilinxer| | 2011-1-20 16:46 | 只看该作者
读不出来肯定是时序不对.
严格按照datasheet的时序要求来做,尤其是要求最大的时间一定要满足.

使用特权

评论回复
板凳
chunyang| | 2011-1-20 17:20 | 只看该作者
楼上说的不错,楼主首先应正确、完整的理解器件手册。

使用特权

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

本版积分规则

3

主题

23

帖子

1

粉丝