/*读一个字节*/
char read()
{
unsigned char i,val=0;
temp_LL=0;
temp_h=0;
DATA=1; //释放数据总线
for(i=0x80;i>0;i/=2) //位移8位
{
SCK=1; //上升沿读入
if(DATA)
val=(val | i); //确定值
SCK=0;
}
DATA=0; //读应答信号,有应答为1,为应答为0 通过CPU下拉为应答
SCK=1; //第9个脉冲
_nop_(); _nop_(); _nop_(); //pulswith approx. 5 us
SCK=0;
DATA=1; //释放数据总线
temp_h=val;
val=0;
////低8位/////////////////////////////
DATA=1; //释放数据总线
for(i=0x80;i>0;i/=2) //位移8位
{ SCK=1; //上升沿读入
if(DATA)
val=(val | i); //确定值
SCK=0;
}
DATA=1;//0; //不需要应答 通过CPU下拉为应答
SCK=1; //第9个脉冲
_nop_(); _nop_(); _nop_(); //pulswith approx. 5 us
SCK=0;
DATA=1; //释放数据总线
temp_LL=val;
return 0;
}
如上所示是从sht11读取一个字节的代码,求大侠好好解释解释我只知道一些很浅的东西。如果能带入具体数据说明一下(比如从开始到后面算出val的具体值)就好理解了,麻烦了,解释好了绝对大大的给加分。
非常非常感谢,我再问一下不是从sht11读取一个字节的数据吗?怎么有高八位第八位,这不是两个字节了吗?还有,你这举的例子中每次更新得到的val值是多少?我只有结合具体值才能看明白,因为基础参差不齐。麻烦你了,一会儿马上给分
追答SH11的分辨率可达14bit,但是一个字节只有8位,所以需要读两次才能获得一个完整的数据
两个字节是16bit ,所以有2bit是富余的,多了可以,少了是没法正确表征测得数据的
再说更新之后得到的val
val 初值为0,假设串行口将要输出的数据位0x58即依次输出 0101 1000,
i=0x80,第1次 更新最高位 0000 0000
i=0x40,第2次 更新次高位 0100 0000
i=0x20,第3次 更新第3 位 0100 0000
i=0x10,第4次 更新第4 位 0101 0000
i=0x08,第5次 更新第5 位 0101 1000
i=0x04,第6次 更新第6 位 0101 1000
i=0x02,第7次 更新第7 位 0101 1000
i=0x01,第8次 更新第8 位 0101 1000
最终,i=0,退出循环
val=0x58(即 0101 1000)