为什么在读DS18B20的温度前要 初始化18B20两次,跳过序号两次,不初始后再跳过序号就开始读温度呢?求解啊

2025-01-03 08:29:50
推荐回答(3个)
回答1:

include

#define uint unsigned int
#define uchar unsigned char

uchar led[]=;//数码管段选(共阴)
uchar ledbit[2]=;//数码管位选(共阴)

sbit DQ = P3^7; //温度传送数据IO口

uchar temp_value,tem; //温度值

/***********ds18b20子程序*************************/

/***********ds18b20延迟子函数(晶振12MHz )*******/

void delay_18B20(unsigned int i)
{
while(i--);
}

/**********ds18b20初始化函数**********************/

void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1;
delay_18B20(8);
DQ = 0;
delay_18B20(80);
DQ = 1;
delay_18B20(14);
x=DQ;
delay_18B20(20);
}

/***********ds18b20读一个字节**************/

unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}

/*************ds18b20写一个字节****************/

void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}

/**************读取ds18b20当前温度************/

void ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;

Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);

delay_18B20(100);

Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
delay_18B20(100);

a=ReadOneChar();
b=ReadOneChar();
temp_value=b<<4;
temp_value+=(a&0xf0)>>4;
}

/*延时子程序*/
void mdelay(uint delay)
{ uint i;
for(;delay>0;delay--)
{for(i=0;i<62;i++) //1ms延时.

}
}
/*************温度显示********************/
void show_temp()
{
uchar tem1,tem2;
ReadTemp();

tem1=temp_value/10;/*数码管个位*/
P0=led[tem1];
P1=0xfd;//P1.0位为选的数码管
mdelay(5);
tem2=temp_value%10;/*数码管十位*/
P0=led[tem2];
P1=0xfe;//i位为选的数码管
mdelay(5);
}
/****************************************/
/* 主函数 */
/****************************************/
void main()
{
P1=0x00;
P0=0xff;

mdelay(100);
Init_DS18B20( ) ;
P0=0xff;
P1=0x00;
while(1)
{
show_temp();

}
}
这是我以前用过的一个,不知道对你有帮助吗

回答2:

第一次是启动温度转换,第二次是读暂存。

回答3:

程序写的有问题呗,好好检查修改一下!