1. 读一个字节 uchar tmpread(void) //read a byte date 读一个字节 { uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=tmpreadbit(); //调用的读一位函数 dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里 } return(dat); //将一个字节数据返回 }
其实理解这个程序不难,只要看资料时注意:单片机通过单线接口读取18B20数据时,地位在前,高位在后! 掌握了这一点,这个程序就很好解释了! 假设读到的每位数据依次为 J1 J2 J3 J4 J5 J6 J7 J8(由低到高排列) 按照上面程序的写法一步一步的分析,如下: (1) i=1时,dat=0; dat=(j<<7)|(dat>>1); (J1<<7)|(dat>>1) ,所以 J1 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 = J1 0 0 0 0 0 0 0 (2) i=2时,dat=J1 0 0 0 0 0 0 0; dat=(j<<7)|(dat>>1); (J2<<7)|(dat>>1) ,所以 J2 0 0 0 0 0 0 0 | 0 J1 0 0 0 0 0 0 = J2 J1 0 0 0 0 0 0 …………………… 依次类推,最后得到一个字节的数据 J8 J7 J6 J5 J4 J3 J2 J1(由高到低排列) 读取一个字节的数据就是这样来实现的!
2.写一个字节 void tmpwritebyte(uchar dat) //write a byte to ds18b20 { //写一个字节到DS18B20里 uint i; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) //write 1 写1部分 { DS=0; i++;i++; DS=1; i=8;while(i>0)i--; } else { DS=0; //write 0 写0部分 i=8;while(i>0)i--; DS=1; i++;i++; } } }
注意:往18B20里写数据时,也是先从低位写起!
假设要写的一个字节的数据为 dat=J8 J7 J6 J5 J4 J3 J2 J1 (1) j=1; testb=J1; dat=0 J8 J7 J6 J5 J4 J3 J2 (2) j=2; testb=J2; dat=0 0 J8 J7 J6 J5 J4 J3 ……………… 依次类推,就可以把一个字节的数据从低到高写入18B20
我的理解就是这样的,希望对刚学习18b20的哥们有帮助!
|