~~~~ 經(jīng)過單線接口訪問 DS1820 的協(xié)議 如下~~
1. 初始化
2. ROM 操作命令
3. 存貯器操作命令
4. 處理/數(shù)據(jù)
首先,,我們對18B20進(jìn)行操作,我們要對其初始化,
初始化:單線總線上的所有處理均從初始化序列開始 初始化序列包括總線主機(jī)發(fā)出一復(fù)位脈沖 接著
由從屬器件送出存在脈沖
初始化子程序:
Init_DS18B20(void)
{
unsigned char x=0;定義一個變量判斷是否初始化程序
DQ=1; //DQ先置高
delay(8); //稍延時
DQ=0; //發(fā)送復(fù)位脈沖
delay(80); //延時(>480us)
DQ=1; //拉高數(shù)據(jù)線
delay(5); //等待(15~60us)
x=DQ; //用X的值來判斷初始化有沒有成功,,18B20存在的話X=0,,否則X=1
delay(20);
}
ROM操作命令:
寫操作:
當(dāng)主機(jī)總線 t o 時刻從高拉至低電平時 就產(chǎn)生寫時間隙 見圖
從 to 時刻開始 15us 之內(nèi)應(yīng)將所需寫的位送到總線上 DSl820 在 t 后15-60us間對總線
采樣 若低電平 寫入的位是 0 見圖 2 25 3 若高電平 寫入的位是 1 見圖 2 25 4
連續(xù)寫 2 位間的間隙應(yīng)大于 1us 即必須有1us以上的高電平恢復(fù)期。
寫數(shù)據(jù)子程序
WriteOneChar(unsigned char dat) //unsigned char dat 定義存控制命令,;以下對命令操作
{
unsigned char i=0;
for(i=8;i>0;i--) //因為寫一個字節(jié) ,,所以要循環(huán)八次
{
DQ=1; //置高電平
_nop_(); //在開始另一個寫周期前必須有1us以上的高電平恢復(fù)期。
DQ=0; //進(jìn)入寫開始
_nop_();
DQ=dat&0x01; //在15~60us之間對數(shù)據(jù)線進(jìn)行采樣,,如果是高電平就寫1,,低寫0。
delay(5); //向1-Wire總線寫1bit至少需要60μs
dat>>=1; //因為寫數(shù)據(jù)是從低位到高位,,高位逐位的往右移
}
}
讀操作
見圖2 25 5 主機(jī)總線 to 時刻從高拉至低電平時 總線只須保持低電平 l 7ts 之后
在 t1 時刻將總線拉高 產(chǎn)生讀時間隙 讀時間隙在 t1 時刻后 t 2 時刻前有效 t z 距 to 為15
捍 s 也就是說 t z 時刻前主機(jī)必須完成讀位 并在 t o 后的60尸 s 一 120 fzs 內(nèi)釋放總線
讀位子程序(讀得的位到 C 中)
void ReadOneChar() //主機(jī)數(shù)據(jù)線先從高拉至低電平1us以上,,再使數(shù)據(jù)線升為高電平,從而產(chǎn)生讀信號
{
unsigned char i=0; //每個讀周期最短的持續(xù)時間為60us,,各個讀周期之間必須有1us以上的高電平恢復(fù)期
unsigned char dat=0; //首先初始化dat
for (i=8;i>0;i--) //一個字節(jié)有8位 ,,所以循環(huán)八次
{
DQ=1;
delay(1);
DQ=0; //從高拉至低電平時 總線只須保持低電平 l 7ts
dat>>=1; // 讀出來的數(shù)據(jù)要一位一位的移進(jìn)去
DQ=1; //將總線拉高 產(chǎn)生讀時間隙
_nop_();
if(DQ) //判斷DQ是1還是0
dat|=0x80; //是1的話dat就高位1或,因為讀數(shù)據(jù)是從低位讀取 delay(4);
}
return(dat); //返回讀出來的一個字節(jié)數(shù)據(jù)
}
只要根據(jù)時序來辦事,,就簡單多了,,然后在根據(jù)讀出溫度的過程來,就可以達(dá)到你想要的結(jié)果了,,做的不太好,,多多指教,謝謝~,!