请教多个IO口接多个DS18B20的程序问题。
我开始用单片机的P1.0口接了一个DS18B20,用单片机读出然后用数码管显示出来,都很正常,部分程序代码如下。(部分省略没写出来)#include<intrins.h>
........
......
sbit DQ=P1^0;
......
void reset()
{do{
DQ=0;
time500();//延时500微妙程序
DQ=1;
time60();//延时60微妙程序
}
while(DQ!=DQ);
DQ=1;
}
..........
....
省略其他程序...
.....
ucharreadtemp(void)
{
reset();
time500();
writebyte(0xCC);
writebyte(0x44);
rest();
time500();
writebyte(0xCC);
writebyte(0xBE);
c=readbyte();
c=readbyte();
return (c);
}
实验完全正确,能准确读出温度并显示,但当我在做如下修改时就不行了
sbit temp1=P1^0;
sbit temp2=P1^1;
....
main()
{
DQ=temp;
readtemp();
......
}
这样修改后就不能读出温度了,请各位大虾指教指教如何修改。难道每多加一个DS18B20就要多重复写一遍代码?(不采用一个IO口挂多个DS18B20的方式) 是 main()
{
DQ=temp1;
readtemp();
} 请会的朋友指教一下! 没人会么? 是这个问题太难,目前没有人知道还是太简单大家都不屑一回啊? 再次请教各位大侠! 你 Reset函数里面有没有改DQ 没有就是不想改 想采用用调用函数的方法结果是不行看来只能老老实实的把每步都再写一遍了 回复【1楼】lmly
-----------------------------------------------------------------------
sbit temp1=P1^0;
sbit temp2=P1^1;
bit DQ;//这个应该是全局变量
void main(void)
{
DQ=temp1; //或者DQ=temp2;
readtemp();
} 程序修改了下,实验通过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=(a&1)|((a&1)<<1)|((a&1)<<2)|((a&1)<<3)|((b&1)<<4)|((b&1)<<5)|((b&1)<<6);
t=((a&2)>>1)|(a&2)|((a&2)<<1)|((a&2)<<2)|((b&2)<<3)|((b&2)<<4)|((b&2)<<5);
t=((a&4)>>2)|((a&4)>>1)|(a&4)|((a&4)<<1)|((b&4)<<2)|((b&4)<<3)|((b&4)<<4);
t=((a&8)>>3)|((a&8)>>2)|((a&8)>>1)|(a&8)|((b&8)<<1)|((b&8)<<2)|((b&8)<<3);
t=((a&16)>>4)|((a&16)>>3)|((a&16)>>2)|((a&16)>>1)|(b&16)|((b&16)<<1)|((b&16)<<5);
} sbit bust=P1^0 ;
sbit fdjt=P1^1 ;
sbit hrt=P1^2 ;
sbit fst=P1^3 ;
sbit lnt=P1^4 ; mark 谢谢,正好是我想要的 mark,多IO口接多个18b20
页:
[1]