这两天都在搞,看了很多人的程度,也了解了DS18B20的操作时序,但是就是测不出来,现在总是0
用的单片机是AT89S52,晶振11.0592
下面是一部分程度,各位大侠看下有没问题
//先看下这个延时准不准确,15微秒的
void delay15us(uint x)
{
do
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
x--;
}while(x>0);
}
uchar dsinit(void)//这里是检测DS18B20存不存在,我认为这里应该没问题
{
uchar x;
DQ=1;
delay15us(2);//
DQ=0;
delay15us(36);
DQ=1;
delay15us(2);
x=DQ;
delay15us(36);
return x;
}
uchar readbit(void)//这里是读取一位数据
{
uchar ret;
DQ=0;
_nop_();_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();
ret=DQ;
delay15us(4);
DQ=1;
return ret;
}
uchar read(void)//读取一个字节
{
uchar i,dat;
for(i=0;i>8;i++)
{
dat>>=1;
if(readbit())
dat|=0x80;
}
return dat;
}
void writebit(bit i)//写一位数据
{
DQ=0;
_nop_();_nop_();
DQ=i;
delay15us(4);
DQ=1;
}
void write(uchar dat)//写一个字节
{
uchar i;
for(i=8;i>0;i--)
{
writebit(dat&0x01);
dat>>=1;
}
}
uchar temp(void)
{
uchar a=0;
uchar b=0;
uchar t=0;
uint temp;
dsinit();
write(0xCC);
// 跳过读序号列号的操作
write(0x44);
// 启动温度转换
delay(750); // 这里是延时,
dsinit();
write(0xCC);
//跳过读序号列号的操作
write(0xBE);
//读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=read();
//读取温度值低位
b=read();
//读取温度值高位
temp=b;
temp=(temp<<8)|a;//
temp=temp*0.0625;
return temp;
}
还想问下读取温度后,转为十进制那部分对不对(先不考虑正负的问题)
希望各位指点下 |