初始化時(shí)序步驟:
1. 主機(jī)將端口設(shè)為輸出,先發(fā)送一個(gè)高電平,然后再拉低,維持480-960US;(推薦500-600US)
2. 主機(jī)將端口設(shè)為輸入,上拉電阻此時(shí)將電平拉高,主機(jī)等待60US-200US;(推薦100-150US)
3. 主機(jī)讀取端口數(shù)據(jù),低電平則初始化成功;高電平表示初始化失??;
4.讀取數(shù)據(jù)完畢后,主機(jī)等待至少400US; (推薦450-500US)
注:
l 第四步很重要,讀取初始化狀態(tài)后,仍然延時(shí)400US才可以初始化完畢,否則傳感器不能正常使用;
l 在這里注意端口需要不停地改變方向;在主機(jī)發(fā)送時(shí),設(shè)為輸出,主機(jī)接收時(shí),設(shè)為輸出;
/*****************18B20的初始化程序***************************/
byte INIT_18B20() {
byte DQ_RETURN=2;
DQ_OUT=1; //引腳設(shè)置為輸出
DQ=1;
DELAY1(); //稍微延時(shí),即可
DQ=0; //將電平拉低至少480uS,最大為960US
DELAY9(70);
DQ_OUT=0;
//設(shè)置為輸入,設(shè)為輸入15到60US
DELAY9(6); //等待18B20響應(yīng),如果為低電平表示初始化成功,維持60到240 //微秒
DQ_RETURN=DQ;
DELAY9(70); //讀完數(shù)據(jù)后,仍然延時(shí),至少480US
return(DQ_RETURN); //返回值為1,表示失敗,返回值為0表示成功
}
端口寫數(shù)據(jù)時(shí)序
1. 主機(jī)將電平拉高,稍微延時(shí)(推薦值:2US),然后拉低電平,產(chǎn)生一個(gè)下降沿,表示寫數(shù)據(jù)開(kāi)始;低電平維持至少1US;(此時(shí)推薦2US)
2. 此時(shí),將要寫的1或0放在數(shù)據(jù)線上;(從寫數(shù)據(jù)第一步開(kāi)始到現(xiàn)在,整個(gè)過(guò)程在15US之內(nèi)完成;
3. 然后主機(jī)延時(shí)等待至少50US;(推薦60US)
4. 主機(jī)最后將電平拉高;
5. 每寫兩位數(shù)據(jù)之間的間隔要大于1US;
注:
l 在寫步驟中,整個(gè)過(guò)程端口方向均為輸出;
這里對(duì)時(shí)序要求高,最好用示波器調(diào)整出精確的時(shí)序;
/*****************向18B20寫數(shù)據(jù)********************************/
void WRITE_18B20(unsigned char ch){
byte i;
for(i=0;i《8;i++) {
DQ_OUT=1; //端口設(shè)為輸出,并給個(gè)拉低電平的下降沿
DQ=1;
DELAY1();
DQ=0; //拉低電平,并維持一微秒以上,表示要發(fā)送數(shù)據(jù)
DELAY1();
DELAY1();
//在15US內(nèi)將要寫的電平寫在線上
if((ch&0x01)==1) //將數(shù)據(jù)按位取出,從LSB到MSB依次送出
DQ=1;
else
DQ=0;
ch=ch》》1;
DELAY9(8); //電平維持40US以上,18B20將在此時(shí)將數(shù)取出
DQ=1;
}
DQ=1; //最后將電平重新拉高
}