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); } }
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』