没有合适的资源?快使用搜索试试~ 我知道了~
首页ds18B20中文资料级程序示范
资源详情
资源评论
资源推荐

AVR 单片机学习笔记 -- 基于慧净 HJ-2G AVR 开发板
第 14 章 DS18B20
14.1
14.1
14.1
14.1 概念 .
.
.
.
这一章是关于 DS18B20 实时温度传感器。相信有学过 c51 单片机的朋友都对他不陌生
吧 。 我恰恰也学习过 , 不过当初并没有掌握好 。 学习板搭配的 DS18B20 , 一般上给人的
感觉有点像三极管,其实
DS18B20
的内部结构与原理也挺猥琐的,但是我们使用也是
为了实现温度传感的功能而已,基本上不会介绍过度深入。
14.2
14.2
14.2
14.2 DS18B20
DS18B20
DS18B20
DS18B20 介绍
DS18B20 有三只引脚, VCC , DQ ,和 VDD 。
而
HJ-2G
板子上 , 采用了外部供电的链接方式 , 而总线必须链接上拉电阻 。 这一目的告
诉我们,一线总线在空置状态时,都是一直处于高电平。
DS18B20 的内部有 64 位 的
ROM
单元 , 和
9
字节的暂存器
单元。 64 位 ROM 包含了,
DS18B20 唯一的序列号(唯一
的名字 ) 。

AVR 单片机学习笔记 -- 基于慧净 HJ-2G AVR 开发板
以上是内部 9 个字节的暂存单元(包括 EEPROM ) 。
字节 0~1 是转换好的温度。
字节
2~3
是用户用来设置最高报警和最低报警值。这个可以用软件来实现。
字节 4 是用来配置转换精度, 9~12 位。
字节 5~8 就不用看了。
14.3
14.3
14.3
14.3
字节
0~1
0~1
0~1
0~1
:
:
:
:
转换好的温度
DS18B20 的温度操作是使用 16 位 , 也就是说分辨率是 0.0625 。 BIT15~BIT11 是符号位
,
为了就是表示转换的值是正数还是负数。看看数据手册给出的例子吧。

AVR 单片机学习笔记 -- 基于慧净 HJ-2G AVR 开发板
要求出 正数的十进制值,必须将读取到的
LSB
字节,
MSB
字节进行整合处理,然后乘
以 0.0625 即可。
Eg : 假设从 , 字节 0 读取到 0xD0 赋值于 Temp1 , 而字节 1 读取到 0x07 赋值于 Temp2
,
然后求出十进制值。
unsigned
int
Temp1,Temp2,Temperature;
Temp1=0xD0;
//
低八位
Temp2=0x07;
//
高八位
Temperature = ((Temp2<<8
) |
Temp1
)
* 0.0625;
//
又或者
Temperature = (Temp1 + Temp2 *256) * 0.0625; //Temperature=125
在这里我们遇见了一个问题 , 就是如何求出负数的值呢?很遗憾的 , 单片机不像人脑那
样会心算,我们必须 判断 BIT11~15 是否是 1 ,然后人为置一负数标志。
Eg. 假设从,字节 0 读取到 0x90 赋值于 Temp1 ,而字节 1 读取到 0xFC 赋值于 Temp2
,
然后求出该值是不是负数,和转换成十进制值。
unsigned
int
Temp1,Temp2,Temperature;
unsigned char Minus_Flag=0;
Temp1=0x90;
//
低八位
Temp2=0xFC;
//
高八位
//Temperature = (Temp1 + Temp2 *256) * 0.0625; //Temperature=64656
//
很明显不是我们想要的答案
if(Temp2&0xFC)
//
判断符号位是否为 1
{
Minus_Flag=1;
//
负数标志置一
Temperature = ((Temp2<<8
) |
Temp1
)
//
高八位第八位进行整合
Temperature= ((~Temperature)+1);
//
求反,补一
Temperature*= 0.0625;
//
求出十进制
} //Temperature=55;
else
{
Minus_Flag=0;
Temperature = ((Temp2<<8
) |
Temp1
)
* 0.0625;
}
那个人为的负数标志 , 是真的很有用处的 。 这个要看你你自己的想象力了 , 如何去利用它 。
剩余13页未读,继续阅读

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0