51单片机18B20程序
扫描二维码
随时随地手机看文章
18b20复位函数:
bitds18b20_reset(void){bitbitbuf;ds18b20=1;//10usTH0=0xff;TL0=0xf6;TF0=0;while(!TF0);ds18b20=0;//设置1-wire总线为低电平(占领总线)//延迟480us-960us,尽可能选小值(480us)//这里我们选490usTH0=0xfe;TL0=0x3c;TF0=0;while(!TF0);ds18b20=1;//设置1-wire总线为高电平(释放总线)//最佳时间:60us+7.5us//这里我们选68usTH0=0xff;TL0=0xc1;TF0=0;while(!TF0);ds18b20=1;//探测总线上是否有器件if(ds18b20==1)bitbuf=1;//没有器件在线elsebitbuf=0;//有器件在线//保证DS18B20释放总线的时间//490-68=422usTH0=0xfe;TL0=0x7b;TF0=0;while(!TF0);return(bitbuf);}
18b20写字节函数:
voidds18b20_write(unsignedcharval){unsignedchari;for(i=0;i<8;i++)//{ds18b20=0;//设置1-wire总线为低电平//2usTH0=0xff;TL0=0xfe;TF0=0;while(!TF0);ds18b20=val&0x01;//最低位移出val=val>>1;//右移一位//60us~120us(实际不能到120us,因为其它语句也用时间了!)//这里我们选62usTH0=0xff;TL0=0xc6;TF0=0;while(!TF0);ds18b20=1;}}
18b20读字节函数:
unsignedchards18b20_read(void){unsignedchari;unsignedcharvalue=0;for(i=0;i<8;i++){//从总线拉低到读总线状态,不能大于15us!ds18b20=0;//2usTH0=0xff;TL0=0xfe;TF0=0;while(!TF0);ds18b20=1;//4usTH0=0xff;TL0=0xfc;TF0=0;while(!TF0);value>>=1;if(ds18b20)value|=0x80;//62us,必须大于60usTH0=0xff;TL0=0xc6;TF0=0;while(!TF0);}ds18b20=1;return(value);}
启动18b20温度转换:
voidconvert_T(void){if(ds18b20_reset()==0)//如果复位成功{ds18b20_write(0xcc);//跳过多器件识别ds18b20_write(0x44);//启动温度转换}}
读18b20温度函数:
voidread_T(void){unsignedcharLsb,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);}}