打印

关于DS18B20温度传感器时序问题

[复制链接]
2159|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xl042140|  楼主 | 2008-9-12 14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于DS18B20温度传感器时序问题 

 请教C语言高手和汇编高手帮我看下下面一段程序时序有无出错,调试DS18B20很久了,一直不能调试通

程序如下:
/**************************************************/
/*延时程序
/**************************************************/
void Delay(uint8 n)
{
   while(--n); //采用12时钟,晶振为3.6864MHZ,一个机器周期3.25us 9个指令周期+一个RET 2指令周期
}

/**************************************************/
/*DS18b20 初始化程序
/**************************************************/
void Ds_Init(void)
{   uchar x;
    Ds_Data=1; //单片机初始状态
    _nop_();
    _nop_();

    Ds_Data=0;
    Delay(20);//最小480us RESET PULSE

    Ds_Data=1;
    Delay(1);
               //15-60us WAIT PULSE 我选择32.5us等待信号
               //如果Ds_data持续0电平超过个机器周期
               //初始化成功,返回1
    while(!Ds_Data)            //初始化失败,返回0
      {
      Delay(5);//150us presence pulse (60-240)

        Ds_Data=1;  //上拉280  总计530US  TX 时间
        Delay(10);
        //return 1;
     }
    //else return 0;
}
时序资料如图.所使用的P89V51RD2FN 型号单片机,晶振的频率是3.6864MHZ

现在我主要的问题就是程序是否正确,还有就是我的延迟时间推算的准确否.

我用示波器查看delay(1) 时间约为44US
              delay(10)时间约为280US
              delay(5)  时间约为152us
              delay(3)时间约为104us
              delay(20) 时间约为600us
那位汇编高手帮我算下 是不是延迟时间是准确的?
第一次在这个分坛发帖,希望路过看过的多多捧场!!!
调试出来也会与大家分享成果,尤其是调试过程遇到的问题,


    网上有很所谓的调试成功的程序,看了是一头雾水,自己的硬件图都不给,单发程序,连晶振频率都不给,,,真郁闷这些人


  恰逢中秋,还望各位白忙之中抽出宝贵时间给于解答,小弟不胜感激。

祝大家中秋节 玩的快乐
 
 

相关帖子

沙发
adming| | 2008-9-12 17:23 | 只看该作者

用示波器抓的

用示波器抓的应该没错,我当初就是用示波器抓的,照样跑得呼呼的,呵呵。

使用特权

评论回复
板凳
hex99| | 2008-9-13 04:14 | 只看该作者

》》

Software delay should be tested by timer.. as follow:
start timer;
your delay(1,2,3..n);
stop timer;
see what exact is inside...

给你个AVR的,参考一下:

unsigned char ds_reset(void)
    {
    unsigned char ack;
    DQ_out;            // direction for output
    slew_set;          // drives the DQ low
    usdelay(250);
    usdelay(220);      // delay for 480 us
    slew_clear;        // releases the bus

     DQ_in;             // direction for input
    usdelay(65);       // delay for 70 us

    ack = (get_bit);   // get reply

    usdelay(250);
    usdelay(150);      // delay for 410 us
    return ack;
    }

使用特权

评论回复
地板
zsy| | 2008-9-15 10:32 | 只看该作者

例子

发E_MAIL 我可以给你一个完整的例子.
zhoushiyuan@sohu.com

使用特权

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

本版积分规则

14

主题

24

帖子

0

粉丝