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

2019-07-15 23:26发布

#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);
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
冰葑世纪
2019-07-16 10:43
我看到别人的程序是这样的
for(time=0;time<10;time++)       
                     ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
                  DQ=1;          //释放数据线                    
                  for(time=0;time<1;time++)
                          ;//延时3us,两个写时序间至少需要1us的恢复期

可参考下

一周热门 更多>