blueice1108 发表于 2014-7-16 11:48:15

DS18B20时序问题

参考坛子内的程序
但MCLK=20M
初始化可以通过
但得不到正确温度
读和写时序是否有错

/*******************************************
函数名称:Init_18B20
功    能:对DS18B20进行复位操作
参    数:无
返回值:初始化状态标志:1--失败,0--成功
********************************************/
unsigned char Init_18B20(void)
{
   unsigned char flag;
   _DINT();
   OW_OUT_0;
   delay_us(480); //480us
   OW_OUT_1;
   delay_us(70); //15-60us
   OW_IN;
   delay_us(1);
   if (OW_IN_DATA)
   {
      flag = 1; //初始化失败
   }
   else
   {
      flag = 0; //初始化OK
   }
   OW_OUT_1;
   delay_us(480); //410us
   _EINT();
   return   flag;
   
}
/*******************************************
函数名称:Write_18B20
功    能:向DS18B20写入一个字节的数据
参    数:wdata--写入的资料
返回值:无
********************************************/
void Write_18B20(unsigned char data)
{
   unsigned char i;
   _DINT();
   for (i = 0; i < 8; i++)
   {
      OW_OUT_0;
      delay_us(1);
      if (data & 0x01)   
      {OW_OUT_1;}
      else OW_OUT_0;
      delay_us(1);
      data >>= 1;
      delay_us(70); //延时70us
      OW_OUT_1;
   }
   _EINT();
}
/*******************************************
函数名称:Read_18B20
功    能:从DS18B20读取一个字节的数据
参    数:无
返回值:读出的一个字节数据
********************************************/
unsigned char Read_18B20(void)
{
   unsigned char i;
   unsigned char temp = 0;
   
   _DINT();
   
   for (i = 0; i < 8; i++)
   {
      temp >>= 1;
      OW_OUT_0;
      delay_us(1);
      OW_OUT_1;
    delay_us(1);
      if (OW_IN_DATA)temp |= 0x80;
      delay_us(70);
   }
   _EINT();
   
   returntemp;
}

/*******************************************
函数名称:Skip
功    能:发送跳过读取产品ID号命令
参    数:无
返回值:无
********************************************/
void Skip(void)
{
   Write_18B20(0xcc);
}
/*******************************************
函数名称:Convert
功    能:发送温度转换命令
参    数:无
返回值:无
********************************************/
void Convert(void)
{
   Write_18B20(0x44);
}
/*******************************************
函数名称:Read_SP
功    能:发送读ScratchPad命令
参    数:无
返回值:无
********************************************/
void Read_SP(void)
{
   Write_18B20(0xbe);
}
/*******************************************
函数名称:ReadTemp
功    能:从DS18B20的ScratchPad读取温度转换结果
参    数:无
返回值:读取的温度数值
********************************************/
unsigned int ReadTemp(void)
{
   unsigned char temp_low;
   unsigned inttemp;
   
   temp_low = Read_18B20();      //读低位
   temp = Read_18B20();          //读高位
   temp = (temp << 8) | temp_low;
   
   returntemp;
}
/*******************************************
函数名称:ReadTemp
功    能:控制DS18B20完成一次温度转换
参    数:无
返回值:测量的温度数值
********************************************/
unsigned int Do1Convert(void)
{
   unsigned char i, j;
   j = 0;
   do
   {
      i = Init_18B20();
      j++;
      if (j > 200) return 0x0000;//复位超时返回0
   }
   while (i);
   Skip();
   Convert();
   for (i = 20; i > 0; i--)
   {
      __delay_cycles(22000); //延时800ms以上
   }
   j = 0;
   do
   {
      i = Init_18B20();
      j++;
      if (j > 200) return 0x0000;//复位超时返回0
   }
   while (i);
   Skip();
   Read_SP();
   return ReadTemp();
}

dalarang 发表于 2014-7-16 12:53:14

好像不大对,看了下自己的程序,读和写每BIT时都有延时十几微秒,你才延时1微秒,应该不对吧。
现在手上没18B20的数据手册,你自己分析下吧,尽量模拟手册上的时序,读写不难的。

blueice1108 发表于 2014-7-16 22:25:33

调试快一天了
高手帮忙~~~
页: [1]
查看完整版本: DS18B20时序问题