请教多个IO口接多个DS18B20的程序问题。

2020-01-30 13:45发布

我开始用单片机的P1.0口接了一个DS18B20,用单片机读出然后用数码管显示出来,都很正常,部分程序代码如下。(部分省略没写出来)
#include<intrins.h>
........
......
sbit DQ=P1^0;
......

void reset()
{  do{
       DQ=0;
       time500();//  延时500微妙程序
       DQ=1;
       time60();//延时60微妙程序
      }
     while(DQ!=DQ);
     DQ=1;


}
..........
....
  省略其他程序...
.....
uchar  readtemp(void)
{
   reset();
   time500();
   writebyte(0xCC);
   writebyte(0x44);
   rest();
  time500();
  writebyte(0xCC);
  writebyte(0xBE);
  c[1]=readbyte();
  c[0]=readbyte();
return (c[2]);
}
实验完全正确,能准确读出温度并显示,但当我在做如下修改时就不行了
sbit temp1=P1^0;
sbit temp2=P1^1;
....
main()
{
   DQ=temp;
  readtemp();
  ......

}

这样修改后就不能读出温度了,请各位大虾指教指教如何修改。难道每多加一个DS18B20就要多重复写一遍代码?(不采用一个IO口挂多个DS18B20的方式)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
14条回答
lmly
2020-01-31 23:26
程序修改了下,实验通过  P1口前5位分别接5个DS18B20

  /******************延时20us********************/
void time20(void)
{      
        unsigned char a,b;
        for(b=1;b>0;b--)
        for(a=16;a>0;a--);
}
  /******************延时60us********************/
void time60(void)
{      
        unsigned char a,b;
        for(b=1;b>0;b--)
        for(a=48;a>0;a--);
}

/****************延时500us********************/
void time500(void)
{
        unsigned char a,b,c;
        for(c=1;c>0;c--)
        for(b=142;b>0;b--)
        for(a=2;a>0;a--);
}


/*****************复位和等待应答************/
void reset(void)
{                 
        
        do
             {     
                                    xsf=0;
                         P1=(P1|0x1F)&0xE0;                  //前五位写0
                             time500();
                             P1=P1|0x1F;                         //前五位写1
                             time60();
                            // time20();
                            // time20();
                                // time20();
                                 _nop_();
                                 _nop_();
                                 _nop_();
                                 _nop_();
                               
             }while(bust&fdjt&hrt&fst&lnt);
              gx=(P1&0x1F)|(gx&0xE0);  //gx=0正常,否则有故障
                   P1=P1|0x1F;                                                 //前五位写1
                        xsf=1;
                 
                  

}
/********************读一字节数据********************/
void readbyte(void)
{
         uchar i;
         if(p==0)
         {
              for(i=0;i<8;i++)
              {                 
                        
                                  P1=P1|0x1F;
                          
                                  _nop_();
                                  P1=(P1|0x1F)&0xE0;
                           _nop_();
                   _nop_();
                   _nop_();
                   _nop_();
                           
                                   P1=P1|0x1F;
                   _nop_();
                   _nop_();
                                   _nop_();
                                   _nop_();
                   _nop_();
                   _nop_();
                                  
                                   a=P1;
                           time60();
                        
                   _nop_();
                   _nop_();
                                   _nop_();
                                   _nop_();
                   _nop_();
                   _nop_();
                   _nop_();
                   _nop_();
              }
                        }
                        else
                        for(i=0;i<8;i++)
              {                 
                        
                                  P1=P1|0x1F;
                          
                                  _nop_();
                                  P1=(P1|0x1F)&0xE0;
                           _nop_();
                   _nop_();
                   _nop_();
                   _nop_();
                           
                                   P1=P1|0x1F;
                   _nop_();
                   _nop_();
                                   _nop_();
                                   _nop_();
                   _nop_();
                   _nop_();
                                  
                                   b=P1;
                           time60();
                        
                   _nop_();
                   _nop_();
                                   _nop_();
                                   _nop_();
                   _nop_();
                   _nop_();
                   _nop_();
                   _nop_();
              }
             
}

/**************************写一位******************/
void write(uchar tt )
{
    if(tt==1)     //***写1*/
         {          
                  
                  P1=(P1|0x1F)&0xE0;
          _nop_();
          _nop_();
          _nop_();
          _nop_();
                  _nop_();
          _nop_();
          _nop_();
          _nop_();
                  _nop_();
          _nop_();
          _nop_();
          _nop_();
             
                  P1=P1|0x1F;
                  time60();
                 
              time20();
               
                  P1=P1|0x1F;
          _nop_();
                  _nop_();
          _nop_();
          _nop_();
                  _nop_();
                  _nop_();
          _nop_();
          _nop_();
         }
         else                                        //***写0****//
         {       
                  
                        P1=(P1|0x1F)&0xE0;
                    time60();
                    
                        time20();
                  
                        P1=P1|0x1F;
            _nop_();
                        _nop_();
            _nop_();
            _nop_();
                    _nop_();
                        _nop_();
            _nop_();
            _nop_();
     }

}


/*****************写一字节数据***********************/
void writebyte(uchar comd)
{
        uchar temp1;
             char i;
             for(i=0;i<8;i++)
             {       
                        temp1=comd&0x01;
                        write(temp1);
                    comd>>=1;

             }

}


/***************读温度********************/
void readtemp(void)
{     //  EA=0;
     
          
                        p=0;
        
                 reset();
                 time500();
                 writebyte(0xCC); //跳过读DS18B20序列号
             writebyte(0x44); //启动温度转换
             reset();                  
             time500();
             writebyte(0xCC);
             writebyte(0xBE);  //读取温度寄存器
       
                 readbyte();  //读温度低字节
                 p=1;
            readbyte();  //读温度高字节
               
        t[0]=(a[4]&1)|((a[5]&1)<<1)|((a[6]&1)<<2)|((a[7]&1)<<3)|((b[0]&1)<<4)|((b[1]&1)<<5)|((b[2]&1)<<6);
   t[1]=((a[4]&2)>>1)|(a[5]&2)|((a[6]&2)<<1)|((a[7]&2)<<2)|((b[0]&2)<<3)|((b[1]&2)<<4)|((b[2]&2)<<5);
        t[2]=((a[4]&4)>>2)|((a[5]&4)>>1)|(a[6]&4)|((a[7]&4)<<1)|((b[0]&4)<<2)|((b[1]&4)<<3)|((b[2]&4)<<4);
   t[3]=((a[4]&8)>>3)|((a[5]&8)>>2)|((a[6]&8)>>1)|(a[7]&8)|((b[0]&8)<<1)|((b[1]&8)<<2)|((b[2]&8)<<3);
   t[4]=((a[4]&16)>>4)|((a[5]&16)>>3)|((a[6]&16)>>2)|((a[7]&16)>>1)|(b[0]&16)|((b[1]&16)<<1)|((b[2]&16)<<5);
}

一周热门 更多>