求高手关于DS18B20的
也许你的18B20焊接位置离一些发热的原件比较近 然后温度就会受到影响,
贴你的程序上来看看
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^1; //数据总线接口定义
uchar i,TCL,TCH;
uint temp1,temperature;
/*****延时函数*********/
void delay_ds18b20(uchar z)
{
uchar i,j;
for(i=z;i--;i>0)
for(j=10;j>0;j--);
}
/*****初始化DS18B20*****/
bit init_18b20()
{
bit ack;
DQ=1; delay_ds18b20(1); //释放总线延时10us
DQ=0; delay_ds18b20(50); //拉低总线延时500us
DQ=1; delay_ds18b20(1); //释放总线稍作延时等待响应
ack=DQ;
delay_ds18b20(50); //延时500us
return ack;
}
/*****读一个字节*****/
uchar read_18b20()
{
uchar date=0;
for(i=0;i<8;i++)
{
DQ=0; //拉低总线
date>>=1; //左移数据给总线
DQ=1; //释放总线
if(DQ)
date|=0x80;
delay_ds18b20(1);
}
return date;
}
/*****写一个字节*****/
void write_18b20(uchar date)
{
for(i=0;i<8;i++)
{
DQ=0;
DQ=date&0x01;
delay_ds18b20(1); //注意延时时间
DQ=1;
date=date>>1;
}
}
uint get_18b20()
{
if(!init_18b20()) //如果初始化成功继续进行
{
write_18b20(0xcc); //跳过序列号命令
write_18b20(0x44); //发送温度转换命令
delay_ds18b20(2);
init_18b20(); //初始化
write_18b20(0xcc); //跳过序列号命令
write_18b20(0xbe); //发送读取数据命令
// delay_ds18b20(20) ;
TCL=read_18b20(); //低八位
TCH=read_18b20(); //高八位
temp1=TCH;
temp1<<=8; //高八位右移8位
temp1=temp1|TCL; //合并
temperature=temp1*0.625+0.5; //得到真实温度
}
return temperature; //返回转化后的温度
//注:返回温读必须为uint型
}
程序没问题的话你就把18B20换个位置。
数据处理有问题
'' TCL=read_18b20(); //低八位
TCH=read_18b20(); //高八位
temp1=TCH;
temp1<<=8; //高八位右移8位
temp1=temp1|TCL; //合并
temperature=temp1*0.625+0.5; //得到真实温度 ''
再看看吧
不明白
学习了
求赐教