初始化时序步骤:
1. 主机将端口设为输出,先发送一个高电平,然后再拉低,维持480-960US;(推荐500-600US)
2. 主机将端口设为输入,上拉电阻此时将电平拉高,主机等待60US-200US;(推荐100-150US)
3. 主机读取端口数据,低电平则初始化成功;高电平表示初始化失败;
4.读取数据完毕后,主机等待至少400US; (推荐450-500US)
注:
l 第四步很重要,读取初始化状态后,仍然延时400US才可以初始化完毕,否则传感器不能正常使用;
l 在这里注意端口需要不停地改变方向;在主机发送时,设为输出,主机接收时,设为输出;
/*****************18B20的初始化程序***************************/
byte INIT_18B20() {
byte DQ_RETURN=2;
DQ_OUT=1; //引脚设置为输出
DQ=1;
DELAY1(); //稍微延时,即可
DQ=0; //将电平拉低至少480uS,最大为960US
DELAY9(70);
DQ_OUT=0;
//设置为输入,设为输入15到60US
DELAY9(6); //等待18B20响应,如果为低电平表示初始化成功,维持60到240 //微秒
DQ_RETURN=DQ;
DELAY9(70); //读完数据后,仍然延时,至少480US
return(DQ_RETURN); //返回值为1,表示失败,返回值为0表示成功
}
端口写数据时序
1. 主机将电平拉高,稍微延时(推荐值:2US),然后拉低电平,产生一个下降沿,表示写数据开始;低电平维持至少1US;(此时推荐2US)
2. 此时,将要写的1或0放在数据线上;(从写数据第一步开始到现在,整个过程在15US之内完成;
3. 然后主机延时等待至少50US;(推荐60US)
4. 主机最后将电平拉高;
5. 每写两位数据之间的间隔要大于1US;
注:
l 在写步骤中,整个过程端口方向均为输出;
这里对时序要求高,最好用示波器调整出精确的时序;
/*****************向18B20写数据********************************/
void WRITE_18B20(unsigned char ch){
byte i;
for(i=0;i《8;i++) {
DQ_OUT=1; //端口设为输出,并给个拉低电平的下降沿
DQ=1;
DELAY1();
DQ=0; //拉低电平,并维持一微秒以上,表示要发送数据
DELAY1();
DELAY1();
//在15US内将要写的电平写在线上
if((ch&0x01)==1) //将数据按位取出,从LSB到MSB依次送出
DQ=1;
else
DQ=0;
ch=ch》》1;
DELAY9(8); //电平维持40US以上,18B20将在此时将数取出
DQ=1;
}
DQ=1; //最后将电平重新拉高
}