知方号

知方号

DS18B20温度转化

DS18B20温度转化

程序设计流程:

复位 写入命令字 : 0xcc (跳过ROM指令), 0x44(开始温度转换)

跳过命令字:因为DS18b20是单总线设备,而单总线可以挂载很多的设备,ROM是用来存放设备的id号。

延时700~900ms 等待温度转换完成

复位 写入命令字: 0xcc(跳过ROM指令),0xbe(读取高速暂存器,一共有9个字节)

读取高速暂存器的0字节和1字节(即LSB和MSB)获得温度数据

复位,读取操作结束。

整合数据: 将LSB和MSB整合为1个16位的数据

判断数据符号 为正还是为负 :数据为带符号的16位补码形式

16位 高5位符号位,低中间7位整数部分,低4位小数部分

高5位为0 正数 高5位为1 负数 DS18B20分辨率0.0625

正数直接乘以0.0625 负数取反+1乘以0.0625

注意上电复位的时候为0x50,+85摄氏度

注意的问题; 底层驱动函数的延时时间和单片机的时钟是否一致,直接影响能否产生应答

数据接收定义的数据类型:例如温度产生的是16位的数据,就不能定义为char 型数据

再等待读取温度的时候,数码管也要显示,

具体步骤:

创建工程,首先要将底层驱动函数放入到创建的文件夹目录下

设置位选函数,设置数码管一位显示函数,设置数码管扫描函数(扫描函数的延时为int类型500),为了消隐,除了打开要显示的函数外,还要将其他的数码管关闭

然后是 读取DS18B20函数(初始化有三次,第一次打开温度读取,第二次打开缓存器,第三次关闭)缓存器中读取数据是先读取的低位数据(数据读取类型是char8位),然后定义全局变量(int型16位),

接收数据: 首先先接收高位的数据,然后右移8位接收低位的数据(或上低位数据) 数据一共有16位,

只要整数 向右移动4位, 如果要小数,右移4位后*10,然后低位数据与上 0x0f 再*0.625(分辨率为0.0625,为的是避免浮点数的操作) 然后再将又移的数据和低位数据相加  

右移后乘以10,因为整型变量,乘以10后相加便不用操作浮点数了。方便快捷 直接相加后第四位最前面的一位用带小数点的数显示

#include #include "onewire.h"unsigned char code SMG_NoDot[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e, 0xbf,0x7f};unsigned char code SMG_IsDot[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};unsigned int dat=0;void smgdelay(unsigned int i){while(i--);}void select138(unsigned char n){switch(n){case 4:P2=(0x1f&P2)|0x80;break;case 5:P2=(0x1f&P2)|0xa0;break;case 6:P2=(0x1f&P2)|0xc0;break;case 7:P2=(0x1f&P2)|0xe0;break;case 0:P2=(0x1f&P2)|0x00;break;}}void smgshow_bite(unsigned char date,unsigned char pos){ select138(6);P0=0x01=4;//dat=dat*10;//dat=dat+(LSB&0x0f)*0.625;////}}void main(){while(1){temputer();smgshow();}}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。

上一篇 没有了

下一篇没有了