51单片机18B20程序

  • 学习5539次

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

发表评论