我开始用单片机的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;
}
..........
....
省略其他程序...
.....
uchar readtemp(void)
{
reset();
time500();
writebyte(0xCC);
writebyte(0x44);
rest();
time500();
writebyte(0xCC);
writebyte(0xBE);
c[1]=readbyte();
c[0]=readbyte();
return (c[2]);
}
实验完全正确,能准确读出温度并显示,但当我在做如下修改时就不行了
sbit temp1=P1^0;
sbit temp2=P1^1;
....
main()
{
DQ=temp;
readtemp();
......
}
这样修改后就不能读出温度了,请各位大虾指教指教如何修改。难道每多加一个DS18B20就要多重复写一遍代码?(不采用一个IO口挂多个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);
}
一周热门 更多>