打印

温度传感器ds18b20代码上的一些问题

[复制链接]
1385|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
弹弓|  楼主 | 2014-2-28 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
DelayMs(10);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();   //低位
b=ReadOneChar();   //高位

b<<=8;
t=a+b;

return(t);
}
不理解1.为什么在这个函数里面要初始化两次DS18B20
2.a=ReadOneChar();   //低位
b=ReadOneChar();   //高位
这里赋值不太明白,这样不是ab所赋值的数是一样吗?
3.
b<<=8;
t=a+b;这两句语句也不太了解。

相关帖子

沙发
ayb_ice| | 2014-2-28 13:30 | 只看该作者
16位结果由高低字节组成

使用特权

评论回复
板凳
52414133| | 2014-2-28 13:39 | 只看该作者
1、第一次开启,第二次读取,前面都初始化。
2、ReadOneChar()中应该是更迭送低高位,送给a低八位,送给b高八位。
3、b是16位,b向左移八位,送给他的高位也就左移八位,a+b就是高八位和低八位相加,赋值给t=a+b,t也是16位。

使用特权

评论回复
地板
弹弓|  楼主 | 2014-2-28 15:44 | 只看该作者
52414133 发表于 2014-2-28 13:39
1、第一次开启,第二次读取,前面都初始化。
2、ReadOneChar()中应该是更迭送低高位,送给a低八位,送给b高 ...

我能理解成这样吗,关于1.第一次初始化时用于写指令,第二次初始化使用与读取数据。
2.单片机每次只能读取一个字节。在这里先读取低位,然后赋值给a。再读下一字节高位赋值给b.
3.这里就不太了解了,因为上面赋值给b是高8位,为什么您这里说b是16位呢?

使用特权

评论回复
5
弹弓|  楼主 | 2014-2-28 15:47 | 只看该作者
ayb_ice 发表于 2014-2-28 13:30
16位结果由高低字节组成

您的意思是指a=ReadOneChar();   //低位
的时候ReadOneChar()这个函数得出的值为低8位。
b=ReadOneChar();   //高位
ReadOneChar()这个函数得出的值为其高8位。谢谢了

使用特权

评论回复
6
52414133| | 2014-2-28 17:01 | 只看该作者
弹弓 发表于 2014-2-28 15:44
我能理解成这样吗,关于1.第一次初始化时用于写指令,第二次初始化使用与读取数据。
2.单片机每次只能读 ...

定义int是16位的,b是16位,所以需要左移到高8位。

使用特权

评论回复
7
弹弓|  楼主 | 2014-2-28 17:51 | 只看该作者
52414133 发表于 2014-2-28 17:01 定义int是16位的,b是16位,所以需要左移到高8位。

明白了。那我关于1和2两点有理解错吗?谢谢你。

使用特权

评论回复
8
52414133| | 2014-2-28 19:12 | 只看该作者
弹弓 发表于 2014-2-28 17:51
明白了。那我关于1和2两点有理解错吗?谢谢你。

对,多看C语言基础,定义类型

使用特权

评论回复
9
弹弓|  楼主 | 2014-2-28 21:03 | 只看该作者
嗯,谢谢你

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

62

帖子

0

粉丝