微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于ds 18b20的 写时间隙、、

关于ds 18b20的 写时间隙、、

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit ds18=P2^2;
sbit duan=P2^6;
sbit wei=P2^7;
sbit deng=P1^0;
uint temp;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void display(uint temp);
void init();
void delay(uchar c);
void fuwei();
uchar rd(void);
void wr(uchar ml);
bit tmpreadbit(void);
main()
{        uchar i;
                uchar a,b;
        float tt;
        init();
       
        while(1)
        {        for(i=0;i<9;i++)
                {
                                        fuwei();
                        delay(1);
                        wr(0xcc);
                        wr(0x44);
                        delay(658);
                                fuwei();
                        delay(1);
                        wr(0xcc);
                        wr(0xbe);
                        a=rd();
                        b=rd();
                          temp=b;
                  temp<<=8;            
                  temp=temp|a;
                  tt=temp*0.0625;
                  temp=tt*10+0.5;
                                display(temp);
                }
        }
}
void init()
{
                P0=0xff;
                duan=0;
                wei=0;
                temp=0;
}
void delay(uchar c)
{
        uchar a,b;
        for(a=c;a>0;a--)
        for(b=100;b>0;b--);
}
void display(uint c)
{        uchar bai,shi,ge;
        bai=c/100;
        shi=c%100/10;
        ge=c%10;
       
        P0=0xff;
        wei=1;
        P0=0xf7;
        wei=0;
        P0=0x00;
        duan=1;
        P0=table[bai];
        duan=0;
        delay(1);
        P0=0xff;
        wei=1;
        P0=0xef;
        wei=0;
        P0=0x00;
        duan=1;
        P0=table[shi];
        duan=0;
        delay(1);
       
        P0=0xff;
        wei=1;
        P0=0xdf;
        wei=0;
        P0=0x00;
        duan=1;
        P0=table[ge];
        duan=0;
        delay(1);
}
void fuwei()
{
        uchar i;
        ds18=0;
        delay(3);//760us
        for(i=0;i<8;i++);//28us
        ds18=1;//1us
        i=0;
        while((ds18==1)&&(i<18))i++;
        ds18=1;
        for(i=0;i<20;i++);//67us,20,13us,4,44us,13
        i=0;
}
void wr(uchar ml)
{
  uint i;
  uchar j;
  //bit testb;
  for(j=1;j<=8;j++)
  {
    ml=ml>>1;
    if(CY==1)     //write 1
    {
      ds18=0;
    for(i=0;i<1;i++);    /*  就是这、不是说写1的时候、时间、间隙是15us啊、我调到13us结果还是不行、写入混乱啊、    一点点往下调到现在这种、才可以进行 正常的操作了、、、为什么啊、不是说好的15us  啊*/
      ds18=1;
     for(i=0;i<13;i++);
                ;
    }
    else
    {
      ds18=0;       //write 0
      for(i=0;i<17;i++);
      ds18=1;
                ;        ;
                 //  for(i=0;i<4;i++);
    }
  }
}
bit tmpreadbit(void)      
{
   uint i;
   bit dat;
   ds18=0;i++;         
   ds18=1;i++;i++;
   dat=ds18;
   i=8;while(i>0)i--;
   return (dat);
}
uchar rd(void)   //read a byte date
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);  
  }
  return(dat);
}

请问你能给我保证你所写的15us就是15么。你能保证么。?一个for函数里面执行起来占了所说指令你算过没?还有是时序

、有调试、就是设置断点、查看、for(i=0;i<4;i++);
这句话算着是14us 的、然后将总线拉高、可是这样就不行、
改成 i<1  就可以运行了呢、
它这个时间是不是要算上、总线从低到高、有个延迟呢

我看到别人的程序是这样的
for(time=0;time<10;time++)       
                     ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
                  DQ=1;          //释放数据线                    
                  for(time=0;time<1;time++)
                          ;//延时3us,两个写时序间至少需要1us的恢复期
可参考下

嗯嗯、谢谢呢、感谢、

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top