最近做课设用到这个传感器 调了好久还是不对求大佬帮着 看看 延时的时间我基本都用keil测试过了没啥问题。。但就是不知道为啥不对 我试着直接输出初始化函数的结果 结果返回值是0也就是说初始化没成功?但是数可以显示 只是显示的数是不正确的。。。 在另外一个文件的数码管函数也测试过了 没问题。。。。
#include<reg52.h>
#include<intrins.h>
#include"ELEMENT.H"
void delay_us(uchar t) //每t延时约17微妙
{
while(t--);
}
uchar RESET_DS18B20() //初始化函数
{
uint i=0;
DQ=1;
delay_us(1);
DQ=0;
delay_us(80); //延时491us 要求延时480到960us
DQ=1 ;
while(DQ) //等待DS18B20拉低总线
{
delay_us(100);
i++;
if(i>8)//等待5ms
{
return 0;
}
}
return 1;
}
void WB(uchar dat) //写入一字节函数
{
uchar i=0;
for(i=0;i<8;i++)
{
DQ=0; //拉低电量
_nop_(); //没写一个位延时1us
DQ=dat&0x01; //取写入数低位
delay_us(10);//延时71us 60到120us
DQ=1; //还原总线
dat=dat>>1; //写入数据右移一位
_nop_();_nop_();
}
delay_us(10);
}
uchar RB() ///读取一字节函数
{
uchar dat=0,i=0;
for(i=0;i<8;i++)
{
DQ=0; //拉低总线延迟1us释放总线 读位
_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//延时至稳定
if(DQ)dat=dat|0x80;//由低到高读 赋值到高位后右移
dat=dat>>1;
delay_us(10);//读下一位间隔大于48us
}
return dat;
}uint R_temper() //读温度值
{
uchar a,b;
uint t=0;
RESET_DS18B20();
delay_us(1);
WB(0xcc);//跳过读ROM
WB(0x44); //转换温度命令 delay_us(10);
RESET_DS18B20();
delay_us(1);
WB(0xcc);
WB(0xbe); //读温度寄存器 a=RB();
b=RB();
t=b;
t=t<<8;
t=t|a; return t;
}uint temper_c()
{
uint temper;
float t;
temper=R_temper();
if(temper<0) //考虑负温度的情况
{
temper=temper-1;
temper=~temper;
t=temper*0.0625; //16位温度转换成10进制的温度
temper=t*100+0.5; //留两个小数点,并四舍五入
}
else
{
t=temper*0.0625; //16位温度转换成10进制的温度
temper=t*100+0.5; //留两个小数点,并四舍五入
}
return temper;
}
#include<reg52.h>
#include<intrins.h>
#include"ELEMENT.H"
void delay_us(uchar t) //每t延时约17微妙
{
while(t--);
}
uchar RESET_DS18B20() //初始化函数
{
uint i=0;
DQ=1;
delay_us(1);
DQ=0;
delay_us(80); //延时491us 要求延时480到960us
DQ=1 ;
while(DQ) //等待DS18B20拉低总线
{
delay_us(100);
i++;
if(i>8)//等待5ms
{
return 0;
}
}
return 1;
}
void WB(uchar dat) //写入一字节函数
{
uchar i=0;
for(i=0;i<8;i++)
{
DQ=0; //拉低电量
_nop_(); //没写一个位延时1us
DQ=dat&0x01; //取写入数低位
delay_us(10);//延时71us 60到120us
DQ=1; //还原总线
dat=dat>>1; //写入数据右移一位
_nop_();_nop_();
}
delay_us(10);
}
uchar RB() ///读取一字节函数
{
uchar dat=0,i=0;
for(i=0;i<8;i++)
{
DQ=0; //拉低总线延迟1us释放总线 读位
_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//延时至稳定
if(DQ)dat=dat|0x80;//由低到高读 赋值到高位后右移
dat=dat>>1;
delay_us(10);//读下一位间隔大于48us
}
return dat;
}uint R_temper() //读温度值
{
uchar a,b;
uint t=0;
RESET_DS18B20();
delay_us(1);
WB(0xcc);//跳过读ROM
WB(0x44); //转换温度命令 delay_us(10);
RESET_DS18B20();
delay_us(1);
WB(0xcc);
WB(0xbe); //读温度寄存器 a=RB();
b=RB();
t=b;
t=t<<8;
t=t|a; return t;
}uint temper_c()
{
uint temper;
float t;
temper=R_temper();
if(temper<0) //考虑负温度的情况
{
temper=temper-1;
temper=~temper;
t=temper*0.0625; //16位温度转换成10进制的温度
temper=t*100+0.5; //留两个小数点,并四舍五入
}
else
{
t=temper*0.0625; //16位温度转换成10进制的温度
temper=t*100+0.5; //留两个小数点,并四舍五入
}
return temper;
}



