而 HJ-2G 板子上,采用了外部供电的链接方式,而总线必须链接上拉电阻。这一目的告 诉我们,一线总线在空置状态时,都是一直处于高电平。
要求出正数的十进制值,必须将读取到的 LSB 字节,MSB 字节进行整合处理,然后乘 以 0.0625 即可。
Eg:假设从,字节 0 读取到 0xD0 赋值于 Temp1,而字节 1 读取到 0x07 赋值于 Temp2, 然后求出十进制值。
在这里我们遇见了一个问题,就是如何求出负数的值呢?很遗憾的,单片机不像人脑那 样会心算,我们必须判断 BIT11~15 是否是 1,然后人为置一负数标志。
Eg. 假设从,字节 0 读取到 0x90 赋值于 Temp1,而字节 1 读取到 0xFC 赋值于 Temp2, 然后求出该值是不是负数,和转换成十进制值。
继续继续,以上我们是求出没有小数点的正数。如果我要求出小数点的值的话,那么我 应该这样做。
Eg:假设从,字节 0 读取到 0xA2 赋值于 Temp1,而字节 1 读取到 0x00 赋值于 Temp2, 然后求出十进制值,要求连同小数点也求出。
如以上的例题,我们可以 先将 0.0625 乘以 10,然后再乘以整合后的 Temperature 变量 , 就可以求出后面 一个小数点的值(求出更多的小数 点,方法都是以此类推 )。得出的结 果是 101,然后再利用简单的算法,求出每一位的值。
求出负数的思路也一样,只不过多出人为置一负数标志,求反补一的动作而已。自己发 挥想象力吧。
BIT7 出厂的时候就已经设置为 0,用户不建议去更改。而 R1 与 R0 位组合了四个不同 的转换精度, 00 为 9 位转换精度而转换时间是 93.75ms,01 为 10 位转换精度而转换 时 间是 187.5ms,10 为 11 位转换精度而转换时间是 375ms,11 为 12 位转换精度而转换时 间是 750ms(默认)。该寄存器还是留默认的好,毕竟转换精度表示了转换的质量。
补充一下 。一般上我们都 是使用单点,也就 是说单线总线上 仅有一个 DS18B20 存在而 已。所以 我们无需刻意读 取 ROM里边的序 列号来,然后匹 配 那个 DS18B20?而是更 直接的,跳过 ROM 指令,然后直接执行 DS18B20 功能指令。
ROM 指令,也就是访问,搜索,匹配,DS18B20 个别的 64 位序列号的动作。在单点情 况下,可以直接跳过 ROM 指令。而跳过 ROM 指令的字节是 0xCC。
DS18B20 功能指令有很多种,我就不一一的介绍了 ,数据手册里有更详细的介绍。这里 仅列出比较常用的几个 DS18B20功能指令。
DDRA|=BIT(DQ); //DQ 为输 出状态 PORTA&=~BIT(DQ); //输出 低电平Delay_1us (500); //延迟 500 微妙 PORTA|=BIT(DQ); //示范 总线 Delay_1us(60); //延迟 60 微妙 DDRA&=~BIT(DQ); //DQ 位输 出状态
14.10简单归纳 实验开始之前,简单的归纳一些重点。单线总线高电平为闲置状态。单片机访问 DS18B20 必须遵守, DS18B20 复位-->执行 ROM 指令-->执行 DS18B20 功能指令。而在单点上, 可以直接跳过 ROM 指令。DS18B20 的转换精度默认为 12 位,而分辨率是 0.0625。
实验的要求是以 DS18B20 默认的配置,亦即 12 位的转换精度。然而输出的结果为两个 小数点 xx.xx。HJ-2G 板子上设计得DS18B20 的接口和典型,没有什么特别需要注意的。 而 DS18B20 DQ 引脚对应的链接是 PA5。
以上的程式只有一个注意点就是 :DS18B20 的转启动换频率不要超过 750ms。其他的没 有什么需要特别注意了。
50 KB, 下载次数: 61, 下载积分: 黑币 -5
z
340.54 KB, 下载次数: 124, 下载积分: 黑币 -5
z
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |