弄了一天的DS18B20,最后才发现是官方给的单总线驱动有问题
//单总线延时函数 void Delay_OneWire(unsigned int t) { while(t--); }就是这个驱动里的延时函数,延时不够,所以一直没有成功。
这里应该要加一点延时,这样子就可以了,不知道官方是要干嘛,,,,,,,,
void Delay_OneWire(unsigned int t) { char z; while(t--) for(z=0;z<12;z++); }//有了驱动,我们直接写一个读温度函数就ok了
//DS18B20温度采集程序:整数 unsigned char read_wendu(void) { unsigned char low,high; char temp; init_ds18b20(); Write_DS18B20(0xCC);//跳过ROM指令 Write_DS18B20(0x44); //启动温度转换 Delay_OneWire(200); init_ds18b20(); Write_DS18B20(0xCC); Write_DS18B20(0xBE); //读取寄存器 low = Read_DS18B20(); //低字节 high = Read_DS18B20(); //高字节 temp = high<<4; temp |= (low>>4); return temp; }这个函数是读出2位正温度,下面这个是保留小数点后2位。
int read_wendu() { unsigned char low,high; int temp; float t; init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0x44); Delay_OneWire(200); init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0xbe); low=Read_DS18B20(); high=Read_DS18B20(); temp=(high<<8)|low; if(temp<0){ temp=~(temp-1); } t=temp*0.0625; temp=t*100+0.5; return temp; }下面附上单总线代码
sbit DQ = P1^4; //单总线延时函数 void Delay_OneWire(unsigned int t) { char z; while(t--) for(z=0;z<12;z++); } //DS18B20芯片初始化 bit Init_DS18B20(void) { bit initflag = 0; DQ = 1; Delay_OneWire(12); DQ = 0; Delay_OneWire(80); DQ = 1; Delay_OneWire(10); initflag = DQ; Delay_OneWire(5); return initflag; } //通过单总线向DS18B20写一个字节 void Write_DS18B20(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { DQ = 0; DQ = dat&0x01; Delay_OneWire(5); DQ = 1; dat >>= 1; } Delay_OneWire(5); } //从DS18B20读取一个字节 unsigned char Read_DS18B20(void) { unsigned char i; unsigned char dat; for(i=0;i<8;i++) { DQ = 0; dat >>= 1; DQ = 1; if(DQ) { dat |= 0x80; } Delay_OneWire(5); } return dat; }