stc89c52单片机ds18b20传感器,仿真能够获取温度,但是实物却是0,测试过传感器没有问题。
温度获取代码:
/*温度函数*/
void delay_18B20(unsigned int i) //延时1微秒
{
while(i--);
}
/*ds1820复位*/
void ds1820rst(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(40); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
/*读数据*/
uchar ds1820rd(void)
{
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;
}
}
/*读取温度值并转换*/
unsigned int get_temp(void)
{
unsigned int tvalue=0;
uchar a,b;
ds1820rst();
delay_18B20(1);
ds1820wr(0xcc); //跳过读序列号/
ds1820wr(0x44);
delay_18B20(1); //启动温度转换/
ds1820rst();
ds1820wr(0xcc); //跳过读序列号/
ds1820wr(0xbe); //读取温度/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff) ; // tflag=0;
else tvalue=0; // {tvalue=~tvalue+1;tflag=1;}
tvalue=tvalue*(0.625); //温度值扩大10倍,精确到1位小数
return(tvalue);
}
|