| 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的哥们有帮助!
 |