搜索
bottom↓
回复: 2

DS18B20时序问题

[复制链接]

出0入0汤圆

发表于 2014-7-16 11:48:15 | 显示全部楼层 |阅读模式
参考坛子内的程序
但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();
   
   return  temp;
}

/*******************************************
函数名称: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 int  temp;
   
   temp_low = Read_18B20();      //读低位
   temp = Read_18B20();          //读高位
   temp = (temp << 8) | temp_low;
   
   return  temp;
}
/*******************************************
函数名称: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();
}

出0入0汤圆

发表于 2014-7-16 12:53:14 | 显示全部楼层
好像不大对,看了下自己的程序,读和写每BIT时都有延时十几微秒,你才延时1微秒,应该不对吧。
现在手上没18B20的数据手册,你自己分析下吧,尽量模拟手册上的时序,读写不难的。

出0入0汤圆

 楼主| 发表于 2014-7-16 22:25:33 | 显示全部楼层
调试快一天了
高手帮忙~~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 07:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表