上一次讲了DS18B20的整数温度显示
蓝桥杯单片机(八)DS18B20温度测量(整数显示)
但近几年有出题小数部分的温度显示,首先打开DS18B20的数据手册,如图

通过这张表,我就知道读取数据时,低八位和高八位,其中低八位的高四位,和高八位的低四位组成整数部分,低八位的低四位是显示小数的,高八位的高四位是显示正负数的。
通过图发现具体表示方式为
当十六位数据高四位为0000时为正数,当十六位数据高四位为1111为负数。
所以当为正数时

温度=整数部分+低四位第一位×0.5+整数部分+低四位第二位×0.25+整数部分+低四位第三位×0.125+整数部分+低四位第四位×0.0625+

当温度为负数时

先将16位全部取反再+1
温度=整数部分+低四位第一位×0.5+整数部分+低四位第二位×0.25+整数部分+低四位第三位×0.125+整数部分+低四位第四位×0.0625+

所以代码读取温度代码为:

//小数和负数显示温度
signed long rd_temperature(void)
{uchar low,high;float point;signed long integer;init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0x44);init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);  low=Read_DS18B20();high=Read_DS18B20();//(high>>4)&0x0f)!=0x0f判断高四位的值if(((high>>4)&0x0f)!=0x0f){//整数部分integer=((low >>4)|(high<<4));//小数部分point=(((low&0x08)>>3)*0.5)+(((low&0x04)>>2)*0.25)+\(((low&0x02)>>1)*0.125)+((low&0x01)*0.0625);//相加再变为整数//如25.0625  250625integer=(integer+point)*10000;}else{//整数部分integer=((~(low >>4))|(~(high<<4)));//小数部分point=((((~low+1)&0x08)>>3)*0.5)+((((~low+1)&0x04)>>2)*0.25)+\((((~low+1)&0x02)>>1)*0.125)+(((~low+1)&0x01)*0.0625);integer=(integer+point)*10000;//变为负数integer=-integer;}return integer;
}

最后DS18B20温度测量四位小数和负数显示的完整代码为:

#include <stc15f2k60s2.h>
#include "intrins.h"sbit DQ = P1^4;#define uchar unsigned char
#define uint unsigned intvoid SMG_output(void);
void init(void);
void Delay1ms(void);bit init_ds18b20(void);
signed long rd_temperature(void);
void Delay_OneWire(unsigned int t);
unsigned char Read_DS18B20(void);
void Write_DS18B20(unsigned char dat);signed long temp=0;uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,\
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff,0xbf};
uchar SMG[8]={20,20,20,20,20,20,20,20};//初始显示10,全息数码管void main(void)
{init();while(1){temp=rd_temperature();//25 0625if(temp>0){SMG[0]=20;SMG[1]=temp/100000;SMG[2]=temp%100000/10000+10;SMG[3]=temp%10000/1000;SMG[4]=temp%1000/100;SMG[5]=temp%100/10;SMG[6]=temp%10;SMG_output();}else{SMG[0]=21;SMG[1]=temp/100000;SMG[2]=temp%100000/10000+10;SMG[3]=temp%10000/1000;SMG[4]=temp%1000/100;SMG[5]=temp%100/10;SMG[6]=temp%10;SMG_output();           }}
}void SMG_output(void)
{uchar i;for(i=0;i<8;i++){P2=(P2&0X1F)|0Xc0;P0=(1<<i);P2=(P2&0X1F)|0Xe0;P0=tab[SMG[i]];Delay1ms();}P2=(P2&0X1F)|0Xc0;P0=0Xff;P2=(P2&0X1F)|0Xe0;P0=0Xff;
}void init(void)
{P2=(P2&0X1F)|0XA0;P0=0X00;P2=(P2&0X1F)|0X80;P0=0Xff;P2=(P2&0X1F)|0Xc0;P0=0Xff;P2=(P2&0X1F)|0Xe0;P0=0Xff;
}//小数和负数显示温度
signed long rd_temperature(void)
{uchar low,high;float point;signed long integer;init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0x44);init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);  low=Read_DS18B20();high=Read_DS18B20();if(((high>>4)&0x0f)!=0x0f){integer=((low >>4)|(high<<4));point=(((low&0x08)>>3)*0.5)+(((low&0x04)>>2)*0.25)+\(((low&0x02)>>1)*0.125)+((low&0x01)*0.0625);integer=(integer+point)*10000;}else{integer=((~(low >>4))|(~(high<<4)));point=((((~low+1)&0x08)>>3)*0.5)+((((~low+1)&0x04)>>2)*0.25)+\((((~low+1)&0x02)>>1)*0.125)+(((~low+1)&0x01)*0.0625);integer=(integer+point)*10000;integer=-integer;}return integer;
}//整数显示温度
//unsigned char rd_temperature(void)
//{//  uchar low,high;
//  init_ds18b20();
//  Write_DS18B20(0xcc);
//  Write_DS18B20(0x44);
//
//  init_ds18b20();
//  Write_DS18B20(0xcc);
//  Write_DS18B20(0xbe);
//
//  low=Read_DS18B20();
//  high=Read_DS18B20();
//
//  return((low >>4)|(high<<4));
//}//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{t=t*8;while(t--);
}//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(5);DQ = 1;dat >>= 1;}Delay_OneWire(5);
}//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;if(DQ){dat |= 0x80;}        Delay_OneWire(5);}return dat;
}//DS18B20设备初始化
bit init_ds18b20(void)
{bit initflag = 0;DQ = 1;Delay_OneWire(12);DQ = 0;Delay_OneWire(80);DQ = 1;Delay_OneWire(10); initflag = DQ;     Delay_OneWire(5);return initflag;
}void Delay1ms(void)        //@11.0592MHz
{unsigned char i, j;_nop_();_nop_();_nop_();i = 11;j = 190;do{while (--j);} while (--i);
}

效果如下:

有问题可以评论和私信

蓝桥杯单片机(九)DS18B20温度测量(四位小数和负数显示)相关推荐

  1. 蓝桥杯单片机之DS18B20温度传感器

    蓝桥杯单片机之DS18B20温度传感器 简述: 根据提供的芯片数据手册可以获取的信息: ROM操作命令: 存储器操作命令 温度转换及温度获取 温度寄存器格式: 获取温度的具体操作 温度数据处理与数码管 ...

  2. 【蓝桥杯单片机(7)】数码管定时器显示任意字符串

    目录 1.数码管的电路连接 1.1段选 2.位选 2.动态数码管的显示原理 2.1.点亮一个数码管需要那些操作?? 2.2.我怎么做到极短时间内,给不同位输送数据呢.也就是如何产生位选?? 2.3.我 ...

  3. 【蓝桥杯单片机11】单总线温度传感器DS18B20的基本操作

    [蓝桥杯单片机11]单总线温度传感器DS18B20的基本操作 广东职业技术学院 欧浩源 单总线数字温度传感器DS18B20几乎成了各类单片机甚至ARM实验板的标配模块来,在蓝桥杯的往届省赛和国赛中,这 ...

  4. 蓝桥杯单片机DS18B20代码注释及部分时序图

    蓝桥杯单片机蓝桥杯单片机DS18B20代码注释及部分时序图 #include<STC15F2K60S2.H> #include<intrins.h>#define uchar ...

  5. 蓝桥杯单片机学习过程记录(二十九)第八届国赛超声波测距机

    蓝桥杯单片机学习过程记录(二十九)第八届国赛超声波测距机 题目如下: 已完成 应用的内容: EEPROM. 定时器.数码管 led灯,独立按键 DA电压输出 超声波测距 /* ------------ ...

  6. 蓝桥杯单片机DS18b20单总线测温模块常见问题解决

    蓝桥杯单片机DS18b20单总线测温模块常见问题解决 有道是:"溪水声声留我住,梅花朵朵唤人回" DS18b20测温模块作为一个比较简单.稳定的蓝桥杯单片机外设模块, 使用时却经常 ...

  7. 十三届蓝桥杯单片机组省赛真题程序解析

    第一次参加蓝桥杯,线上比赛,记录一下 比赛刚开始了十分钟才做上客观题,做上了之后才发现看一次题警告一次,当时就蚌埠住了,随便做了做就交了,手册也没怎么查(查一下直接给了3次黄牌,就没敢查了)其实老师1 ...

  8. 蓝桥杯单片机组——榨干选手资源包(芯片数据手册)

    文章目录 前言 DS18B20 原理图 1-Wire协议简介 赛场技巧 DS1302 原理图 SPI协议简介 赛场技巧 AT24C02 原理图 IIC协议简介 赛场技巧 PCF8591 原理图 赛场技 ...

  9. 蓝桥杯单片机学习必备资源

    目录 一.你不知道蓝桥杯单片机底层驱动改了?? 二.小蜜蜂教程--自撸代码 三.个人心得 1.NE555 2.DS1302 3.DS18B20 4.AT24C02 5.PCF8951 6.串口指令读取 ...

最新文章

  1. UISearchBar和 UISearchDisplayController的使用
  2. 韩磊老师与C#编程风格
  3. 服务器安全配置之注册表设置
  4. 【活动】HoloLens 黑科技等你来探秘
  5. 【20171025早】alert(1) to win 练习
  6. 如何通过序列化在网络间传递对象,网络协议:轻松定义自己的网络通讯协议
  7. 485串口测试工具软件_(案例)电脑和仪表之间485通讯的奇怪现象及解决方案
  8. Spring : Spring Aop CGLIB动态代理调用过程
  9. maven错误解决:编码GBK的不可映射字符
  10. java的一些小知识总结
  11. Linux meson + ninja编译安装源码(八)
  12. Kafka从上手到实践 - 实践真知:搭建Zookeeper集群 | 凌云时刻
  13. Studio One5新版一键下载安装教程
  14. 不完全遍历Csrss进程中的句柄表
  15. nmake编译dll
  16. 卸载IE8 恢复IE6 的两种方法
  17. 这可能是最简单易懂的机器学习入门(小白必读)
  18. C:警告:assignment to ‘char’ from ‘int *‘ makes integer from pointer without a cast -Wint-conversion
  19. 如何去掉word文档右侧的竖线
  20. 区块链会员积分系统如何构建及应用逻辑

热门文章

  1. HEVC学习(三十四) —— 去方块滤波之五
  2. 关于ADS的二次谐波和高次谐波牵引
  3. 关于驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server的解决方案
  4. 【机器学习】Adaboost
  5. 一个实际电路的原理图是怎样设计出来的?
  6. 基于蝴蝶结结构的硅偏振分离器和旋转器的演示
  7. 全国计算机等级考试二级教程与资料
  8. 我的机器学习支线「模型复杂度」
  9. Java编程精选题(1)
  10. 彻底解决python关于各种文件(音乐、视屏等)读写的操作