本帖最后由 不好不坏 于 2019-4-5 11:10 编辑
void init_ds18b20()
{
u8 i;
bit flag;
do
{
dq=1;
_nop_();
dq=0;
i=103;
while(i>0)i--;//延时
dq=1;
flag=dq;
i=4;
while(i>0)i--;
}while(flag);
}
bit read_onebit()
{
u8 i;
u8 onebit;
dq=0;
i++;
dq=1;
i++;
onebit=dq;
i=8;while(i>0)i--;//延时
return onebit;
}
u8 read_onebyte()
{
u8 dat=0,a,k;
for(a=0;a<8;a++)
{
k=read_onebit();
dat=(k<<7)|(dat>>1);//循环把读到的低位放在低位
}
return dat;
}
void write_onebyte(u8 dat)
{
u8 d=0,i;
bit testbit;
for(d=8;d>0;d--)
{
dq=dat&0x01; //从dat最低位开始传送
dat>>=1; //移除已经传送的最低位
if(testbit==1) //写1
{
dq=0;
_nop_();
_nop_();
dq=1;
i=8;while(i>0)i--;//延时
}
else //写0
{
dq=1;
i=8;while(i>0)i--;
dq=0;
i++;i++;
}
}
}
float get_temp()
{
u8 a,b;
u16 temp;float tmp;
init_ds18b20(); //初始化
write_onebyte(0xcc); //忽略ROM指令
write_onebyte(0x64);
delay_ms(10);
init_ds18b20(); //再度初始化
write_onebyte(0xcc); //忽略ROM指令
write_onebyte(0x00);
delay_ms(10);
init_ds18b20(); //初始化
write_onebyte(0xcc); //忽略ROM指令
write_onebyte(0x44); //温度转换指令+
delay_ms(800);
init_ds18b20(); //初始化
write_onebyte(0xcc); //忽略ROM指令
write_onebyte(0xbe); //读暂存器指令
a=read_onebyte(); //第一个字节是LSB,低八位
b=read_onebyte(); //第二个字节是MSB,高八位
temp=b; //先把高八位b装进temp,一定是进入到temp低八位
temp<<=8; //左移8次;让B回到原位
temp|=a; //再和A相加,
tmp=(float)(temp*0.0625);
return tmp;
}
|