×
单片机 > 单片机程序设计 > 详情

51单片机18B20程序

发布时间:2020-07-08 发布时间:
|

18b20复位函数:

bit ds18b20_reset(void)
{
    bit bitbuf;
    ds18b20=1;                   
    //10us
    TH0=0xff;
    TL0=0xf6;
      TF0=0;        
    while(!TF0);    
    ds18b20=0;
    //设置1-wire总线为低电平(占领总线)
    //延迟480us-960us,尽可能选小值(480us)                   
    //这里我们选490us    
    TH0=0xfe;
    TL0=0x3c;
      TF0=0;        
    while(!TF0);        
      ds18b20=1;    
    //设置1-wire总线为高电平(释放总线) 
    //最佳时间: 60us+7.5us              
    //这里我们选68us 
      TH0=0xff;
    TL0=0xc1;
      TF0=0;          
    while(!TF0);        
    ds18b20=1;
    // 探测总线上是否有器件 
    if(ds18b20==1) bitbuf=1;     //没有器件在线 
    else bitbuf=0;         //有器件在线 
    //保证DS18B20释放总线的时间
    //490-68=422us            
      TH0=0xfe;
    TL0=0x7b;
      TF0=0;           
    while(!TF0);  
    return(bitbuf);
}

18b20写字节函数:

void ds18b20_write(unsigned char val)
{
    unsigned char i;
    for (i=0;i<8;i++) //
    {              
        ds18b20=0;          // 设置1-wire总线为低电平 
        //2us          
        TH0=0xff;
        TL0=0xfe;
          TF0=0;        
        while(!TF0);
        ds18b20=val&0x01;      //最低位移出              
        val=val>>1;          //右移一位
        //60us~120us(实际不能到120us, 因为其它语句也用时间了!)
        //这里我们选62us
        TH0=0xff;
        TL0=0xc6;
          TF0=0;        
        while(!TF0);
        ds18b20=1;
    }     
}

18b20读字节函数:

unsigned char ds18b20_read(void)
{
    unsigned char i;
    unsigned char value = 0;
    for (i=0;i<8;i++)
    {
        //从总线拉低到读总线状态,不能大于15us!
        ds18b20=0;
        //2us          
        TH0=0xff;
        TL0=0xfe;
          TF0=0;        
        while(!TF0);
        ds18b20=1;
        //4us          
        TH0=0xff;
        TL0=0xfc;
          TF0=0;        
        while(!TF0);
        value>>=1;             
        if(ds18b20) value|=0x80;
        //62us,必须大于60us          
        TH0=0xff;
        TL0=0xc6;
          TF0=0;    
        while(!TF0);        
    }
    ds18b20=1;
    return(value);
}

启动18b20温度转换:

void convert_T(void) 
{ 
    if(ds18b20_reset()==0)          // 如果复位成功
    {   
        ds18b20_write(0xcc);     // 跳过多器件识别 
        ds18b20_write(0x44);     // 启动温度转换 
    } 
}

读18b20温度函数:

void read_T(void) 
{ 
    unsigned char Lsb,Msb;            
    if(ds18b20_reset()==0)           // 如果复位成功 
    {  
        ds18b20_write(0xcc);      // 跳过多器件识别 
        ds18b20_write(0xbe);      // 读暂存器 
        Lsb=ds18b20_read();       // 低字节 
        Msb=ds18b20_read();        // 高字节 
        temp2=Lsb&0x0f;
        temp1=(Lsb>>4)|(Msb<<4);
    }     
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多