为什么结果都是85 啊 ????我急死了

[复制链接]
查看11 | 回复1 | 2011-7-21 10:44:51 | 显示全部楼层 |阅读模式
#include
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^3;//ds18b20与单片机连接口
/******************************ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1;
//DQ复位
delay_18B20(4); //延时
DQ = 0;
//DQ拉低
delay_18B20(700); //精确延时大于480us
DQ = 1;
//拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{ DQ = 0; //给脉冲信号

dat>>=1;

DQ = 1; //给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;

for (i=8; i>0; i--)
{ DQ = 0;

DQ = wdata&0x01;

delay_18B20(10);

DQ = 1;

wdata>>=1;
}
}
read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst();

ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
delay1ms(2);
ds1820rst();

ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;

if(tvalue<0x0fff)
tflag=0;

else
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
void ds1820disp()//温度值显示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位数

disdata[1]=tvalue%1000/100+0x30;//十位数

disdata[2]=tvalue%100/10+0x30;//个位数

disdata[3]=tvalue%10+0x30;//小数位
if(tflag==0)

flagdat=0x20;//正温度不显示符号

else

flagdat=0x2d;//负温度显示负号:-

if(disdata[0]==0x30)

{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)

{disdata[1]=0x20;//如果百位为0,十位为0也不显示

}
}

wr_com(0xc0);
wr_dat(flagdat);//显示符号位

wr_com(0xc1);

wr_dat(disdata[0]);//显示百位

wr_com(0xc2);

wr_dat(disdata[1]);//显示十位

wr_com(0xc3);

wr_dat(disdata[2]);//显示个位

wr_com(0xc4);

wr_dat(0x2e);//显示小数点

wr_com(0xc5);

wr_dat(disdata[3]);//显示小数位
}
/********************主程序***********************************/
void main()
{ init_play();//初始化显示
while(1)
{
delay1ms(2);
read_temp();//读取温度

ds1820disp();//显示
}
}

回复

使用道具 举报

千问 | 2011-7-21 10:44:51 | 显示全部楼层
你的复位方法,不正确。复位有两个过程:(1)主机控制总线(2)DS18B20控制总线进行回应,这过程需要持续240us你只做了(1),没有等(2)的完毕,没复位成功就进行了后续操作,读的数都是不对的,85度是初始默认温度...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行