|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2010-4-20 11:34:29
|
显示全部楼层
程序修改了下,实验通过 P1口前5位分别接5个DS18B20
/******************延时20us********************/
void time20(void)
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=16;a>0;a--);
}
/******************延时60us********************/
void time60(void)
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=48;a>0;a--);
}
/****************延时500us********************/
void time500(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
/*****************复位和等待应答************/
void reset(void)
{
do
{
xsf=0;
P1=(P1|0x1F)&0xE0; //前五位写0
time500();
P1=P1|0x1F; //前五位写1
time60();
// time20();
// time20();
// time20();
_nop_();
_nop_();
_nop_();
_nop_();
}while(bust&fdjt&hrt&fst&lnt);
gx=(P1&0x1F)|(gx&0xE0); //gx=0正常,否则有故障
P1=P1|0x1F; //前五位写1
xsf=1;
}
/********************读一字节数据********************/
void readbyte(void)
{
uchar i;
if(p==0)
{
for(i=0;i<8;i++)
{
P1=P1|0x1F;
_nop_();
P1=(P1|0x1F)&0xE0;
_nop_();
_nop_();
_nop_();
_nop_();
P1=P1|0x1F;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
a=P1;
time60();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
else
for(i=0;i<8;i++)
{
P1=P1|0x1F;
_nop_();
P1=(P1|0x1F)&0xE0;
_nop_();
_nop_();
_nop_();
_nop_();
P1=P1|0x1F;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
b=P1;
time60();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/**************************写一位******************/
void write(uchar tt )
{
if(tt==1) //***写1*/
{
P1=(P1|0x1F)&0xE0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
P1=P1|0x1F;
time60();
time20();
P1=P1|0x1F;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
else //***写0****//
{
P1=(P1|0x1F)&0xE0;
time60();
time20();
P1=P1|0x1F;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/*****************写一字节数据***********************/
void writebyte(uchar comd)
{
uchar temp1;
char i;
for(i=0;i<8;i++)
{
temp1=comd&0x01;
write(temp1);
comd>>=1;
}
}
/***************读温度********************/
void readtemp(void)
{ // EA=0;
p=0;
reset();
time500();
writebyte(0xCC); //跳过读DS18B20序列号
writebyte(0x44); //启动温度转换
reset();
time500();
writebyte(0xCC);
writebyte(0xBE); //读取温度寄存器
readbyte(); //读温度低字节
p=1;
readbyte(); //读温度高字节
t[0]=(a[4]&1)|((a[5]&1)<<1)|((a[6]&1)<<2)|((a[7]&1)<<3)|((b[0]&1)<<4)|((b[1]&1)<<5)|((b[2]&1)<<6);
t[1]=((a[4]&2)>>1)|(a[5]&2)|((a[6]&2)<<1)|((a[7]&2)<<2)|((b[0]&2)<<3)|((b[1]&2)<<4)|((b[2]&2)<<5);
t[2]=((a[4]&4)>>2)|((a[5]&4)>>1)|(a[6]&4)|((a[7]&4)<<1)|((b[0]&4)<<2)|((b[1]&4)<<3)|((b[2]&4)<<4);
t[3]=((a[4]&8)>>3)|((a[5]&8)>>2)|((a[6]&8)>>1)|(a[7]&8)|((b[0]&8)<<1)|((b[1]&8)<<2)|((b[2]&8)<<3);
t[4]=((a[4]&16)>>4)|((a[5]&16)>>3)|((a[6]&16)>>2)|((a[7]&16)>>1)|(b[0]&16)|((b[1]&16)<<1)|((b[2]&16)<<5);
} |
|