基於ds18b20的程序dat詳解

dat=(j<<7)|(dat>>1)詳解:

//讀一位數據(讀位程序)
1unsigned char tmpreadbit(void)       //read a bit
2{
3   unsigned char dat; 
4   DS_OUT();      //端口設置爲輸出
5   DS_L();        //DS=0
6   //Delayn(1);     //2uS
7   DS_IN();       //input
8   //Delayn(1);
9  if(DS_R()!=0)
10     dat=1;
11   else 
12      dat=0;
13   DelaynUs(50);    
14   return (dat);
15}

//讀一個字節數據 (讀字節程序)

16unsigned char tmpread(void)   //read a byte date
17{
18  unsigned char i,j,dat;  
19  dat=0;                    //令dat初始值爲0,代碼23處將會用到
20  for(i=1;i<=8;i++)
21  {
22    j=tmpreadbit();
23    dat=(j<<7)|(dat>>1);   //讀出的數據最低位在最前面,這樣剛好一個字節在DAT裏
24  }
25  return(dat);

26}

任意取一個字節,本文以1011 1010爲例

首先由讀位程序讀取第7位1,執行22得j=1,執行23得dat=1xxx xxxx,  詳解如下:

j<<7得到1xxx xxxx 

dat>>1得到0xxx xxxx(注意:dat初始值爲0,即代碼19)

然後執行|(位或)運算,得到dat=1xxx xxxx

然後由讀位程序讀取第6位0,執行22得j=0,執行23得dat=01xx xxxx  詳解如下:

j<<7得到0xxx xxxx

dat>>1得到01xx xxxx(此時,dat的值不再是0,而是上一步得到的1xxx xxxx)

然後執行|(位或)運算,得到dat=01xx xxxx

剩餘位的計算方法同上,故略去......................

最終主機讀到的字節數據是0101 1101 ,最低位在最前面

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章