首先,DS18B20输出的一位(1 bit)信号是不能被单片机变为多位的,一位就是一位,单片机需要连续多次读取DS18B20输出的一位信号,来合成它需要的信息。比如DS18B20的温度输出是16位数据,那么单片机就要读16次1 bit数据。
读取温度伪代码(temperature为保存温度数值的整型变量):
for ( i=1; i<=16; i++)
{
onebit=读取1位数据的函数();
temperature=temperature|onebit;
if(i!=16)
temperature=temperature<<1;
}
然后,单片机是如何读取DS18B20输出的某1bit信息的呢?在具体回答前先明确一点,这一过程必须在单片机拉低数据线,发起读数据过程之后的15微秒(us)内完成,否则读不到正确数据(注意:发起通信时总是由单片机将数据总线先拉低,没有通信时数据总线保持高电平状态)。下面说说具体过程:
1、单片机将数据总线拉低;
2、延时2us;(这一时间必须大于1us,否则DS18B20无法识别拉低信号;也不能过大,超过15us无法正确读数。)
3、将单片机与DS18B20相连的IO口输入输出方向设为输入;(这一步也有可能是单片机直接将数据线拉高,因芯片的不同而不同)
4、延时2us;(给DS18B20一定的时间输出信号)
5、读取数据总线上的电平值;
6、拉高数据总线,延时一段时间后进入下1bit的读取。
注意:这里能否正确读取的关键是延时的量是否足够精确,因此在用C语言写DS18B20程序之前,需要先根据单片机型号和晶振频率找出一个自己对延时的精度有足够把握的延时函数,随便在网上DOWN别人的程序很有可能因为延时不对跑不起来。
参考资料:DS18B20数据手册