高手们帮帮忙。我对单个18B20操作的指令顺序是怎么样的·自己编的指令顺序是:1初始化,2跳过ROM(写0xcc),3存储器操作命令(写温度变换0x44),4再初始化,5再跳过ROM(写0xcc),6存储器操作命令(写存储器0xbe)。对其初始化后,18B20返回了个存在信号。
#include"intrins.h"
#include"ABSACC.H"
#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit TM=P1^1;
/*延时*/
void delyms(unsigned int n)
{unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<164;j++);
}
void NOP(uchar n)
{uchar i;
for(i=0;i<n;i++)
{
_nop_();
}
}
uchar start(void)
{uchar r;
TM=0;
NOP(60);
TM=1;
NOP(2);
r=TM;
return(r);
}
void w_byte(uchar byte)
{uchar i;
for(i=0;i<8;i++)
{
TM=1;
_nop_();
_nop_();
TM=0;
if(byte&0x01){TM=1;}
NOP(6);
byte=byte>>1;
}
TM=0;
}
uint r_byte(void)
{uchar byte=0,i;
for(i=0;i<16;i++)
{
TM=1;
_nop_();
_nop_();
TM=0;
_nop_();
_nop_();
_nop_();
_nop_();
TM=1;
if(TM==1){byte=byte|0x80;}
byte=byte>>1;
NOP(6);
}
return(byte);
TM=0;
}
void main(void)
{uint temp1;
restart:if(start()){goto restart;}
w_byte(0xcc);
w_byte(0x44);
delyms(500);
if(start()){goto restart;}
w_byte(0xcc);
w_byte(0xbe);
temp1=r_byte();
} |