标题: 想请问大家关于这个函数返回值的问题 [打印本页]

作者: gaoky    时间: 2020-5-9 16:05
标题: 想请问大家关于这个函数返回值的问题
如题,这是一个DS18B20温度检测程序中读取温度子程序,不知道为什么最后返回值要对ACK取反,取反了也没有使命意义啊,ack值是取决于IO口,好像和返回值没有多大的关系,求教各位
bit Get18B20Temp(int *temp)
{
    bit ack;
        uchar LSB, MSB;   //16bit温度值的低字节和高字节
        ack = Get18B20Ack();      //执行总线复位,并获取18B20应答
        if(ack == 0)              //如18B20正确应答,则读取温度值
        {
        Write18B20(0xCC);       //跳过ROM操作
                Write18B20(0xBE);       //发送读命令
                LSB = Read18B20();      //读温度值的低字节
                MSB = Read18B20();      //读温度值的高字节
                *temp = ((int)MSB << 8) + LSB;    //合成为16bit整型数
        }
        return ~ack;              //ack==0表示操作应答,所以返回值为其取反值
}



作者: wulin    时间: 2020-5-9 17:42
注释已经清楚表明ack是应答位变量,当执行ack = Get18B20Ack(); 只会有0或1两种结果,如果ack是0,则读取温度值并把16位数据保存在*temp指针地址,取反返回ack值就是反映此函数的执行状态。这个程序的好处是CPU不要在启动温度转换后傻等10ms。
作者: gaoky    时间: 2020-5-9 19:42
wulin 发表于 2020-5-9 17:42
注释已经清楚表明ack是应答位变量,当执行ack = Get18B20Ack(); 只会有0或1两种结果,如果ack是0,则读取温 ...

谢谢大佬
作者: hantu    时间: 2020-5-9 20:45
ack=Get18B20Temp(&temp);
if(ack){ ...}  //如果有应答

这样的代码阅读起来就比那各不取反了返回的要直观更易于理解了。

不然你返回原样的ack
就得
if(ack==0) 或者是 if(!ack) ,明显没有上面那种方式那么好。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1