谁能告诉我单片机从ds18b20中读取温度的原理,是怎样将ds18b20中输出的一位信号变为多位的。
展开全部
首先,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别人的程序很有可能因为延时不对跑不起来。
读取温度伪代码(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数据手册
展开全部
DS18B20的读操作 时序
(1)将数据线拉高“1”。
(2)延时2微秒。
(3)将数据线拉低“0”。
(4)延时15微秒。
(5)将数据线拉高“1”。
(6)延时15微秒。
(7)读数据线的状态得到1个状态位,并进行数据处理。
(8)延时30微秒。
它通过一位一位的读取,如传感器待送给MCU的数据时0x055(0b001010101)(9bits)先一位一位的送给MCU然后再按位来拼凑为0x055
(1)将数据线拉高“1”。
(2)延时2微秒。
(3)将数据线拉低“0”。
(4)延时15微秒。
(5)将数据线拉高“1”。
(6)延时15微秒。
(7)读数据线的状态得到1个状态位,并进行数据处理。
(8)延时30微秒。
它通过一位一位的读取,如传感器待送给MCU的数据时0x055(0b001010101)(9bits)先一位一位的送给MCU然后再按位来拼凑为0x055
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你先把一位一位都读出来,低八位放一个字节里,高八位放一个字节里,然后加下就行了,网上程序多的是
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
继续忽悠
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询