程序设计流程:
复位 写入命令字 : 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();}}