由于DS18B20对时间精度要求很高,所以在写读取温度之前一定要改时序

1. 单总线延时函数

//单总线延时函数
void Delay_OneWire(unsigned int t)
{t*=12;          //t改成t*12while(t--);
}

2. 读取温度(整数)

unsigned char read_temperature1()
{unsigned char temp1;unsigned char low,high;Init_DS18B20();Write_DS18B20(0xcc);Write_DS18B20(0x44);Delay_OneWire(200);Init_DS18B20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);Delay_OneWire(200);low = Read_DS18B20();            //先读低,再读高high = Read_DS18B20();temp1=high<<4;       temp1|=(low&0xf0)>>4;return temp1;
}

3. 读取温度(带小数)

float read_temperature2()
{float temp2;                    //**注意带小数,使用float型**unsigned int temp;          //16位unsigned char low,high;Init_DS18B20();Write_DS18B20(0xcc);Write_DS18B20(0x44);Delay_OneWire(200);Init_DS18B20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);Delay_OneWire(200);low = Read_DS18B20();high = Read_DS18B20();temp = high&0x0f;temp = temp<<8|low;temp2 = temp*0.0625;   //最小精度0.0625return temp2;
}

4. 主函数里的变换

uchar temp1;
uint temp2;
float temp_value;
bit temp_flag;
void main()
{CloseFucker();Timer0Init();while(1){if(temp_flag){temp1 = read_temperature1();              //读取整数温度值temp_value = 10*read_temperature2();  //float型读取带小数温度值,乘10把小数提取temp2 = (uint)temp_value;            //化为整型可以取余temp_flag=0;}                ShowTemp();}
}

代码

main.c

******************************************************************************
* 文件名:读取温度(带整数和小数)
* 描  述:
* 作  者:思索与猫
* 日  期:  19/3/8
* 备  注:左边:整数      右边:带小数
*
******************************************************************************
#include<stc15f2k60s2.h>
#include<onewire.h>
#define uchar unsigned char
#define uint unsigned intuchar code duan[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40,0x039,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};  //带小数0~9
uchar dispbuff[8];
uchar temp1;     //注意数据类型
uint temp2;
float temp_value;
bit temp_flag;
//function
void CloseFucker();
void Timer0Init();
void Display();
void ShowTemp();void main()
{CloseFucker();Timer0Init();while(1){if(temp_flag){temp1 = read_temperature1();temp_value = 10*read_temperature2();temp2 = (uint)temp_value;temp_flag=0;}               ShowTemp();}
}
void ShowTemp()
{dispbuff[0] = temp1/10;dispbuff[1] = temp1%10;dispbuff[2] = 12;dispbuff[3] = 10;dispbuff[4] = temp2/100;dispbuff[5] = temp2/10%10+13;dispbuff[6] = temp2%10;dispbuff[7] = 12;
}
void Display()
{static uchar index = 0;P2 = (P2&0x1f)|0xe0;P0 = 0xff;P2 = P2&0x1f;P2 = (P2&0x1f)|0xc0;P0 = 1<<index;P2 = P2&0x1f;P2 = (P2&0x1f)|0xe0;P0 = ~duan[dispbuff[index]];P2 = P2&0x1f;index++;index &= 0x07;
}
void T0_time() interrupt 1
{static uint temp_count = 0;TL0 = 0x40;       TH0 = 0xA2;    Display();if(++temp_count == 500){temp_count=0;temp_flag=1;}
}
void Timer0Init()       //12Mhz 2ms
{AUXR |= 0x80;     TMOD &= 0xF0;      TL0 = 0x40;        TH0 = 0xA2;        TF0 = 0;       TR0 = 1;   ET0=1;EA=1;
}
void CloseFucker()
{P2 = (P2&0x1f)|0xa0;P0 = 0xa0;P2 = P2&0x1f;
}

onewire.h

#ifndef _ONEWIRE_H
#define _ONEWIRE_H#include "stc15f2k60s2.h"#define OW_SKIP_ROM 0xcc
#define DS18B20_CONVERT 0x44
#define DS18B20_READ 0xbe//pin
sbit DQ = P1^4;//function
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
bit Init_DS18B20(void);
unsigned char Read_DS18B20(void);unsigned char read_temperature1();
float read_temperature2();
#endif

onewire.c

#include "onewire.h"void Delay_OneWire(unsigned int t)
{t*=12;while(t--);
}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 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);
}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;
}unsigned char read_temperature1()  //读取温度(整数)
{unsigned char temp1;unsigned char low,high;Init_DS18B20();Write_DS18B20(0xcc);Write_DS18B20(0x44);Delay_OneWire(200);Init_DS18B20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);Delay_OneWire(200);low = Read_DS18B20();high = Read_DS18B20();temp1=high<<4;temp1|=(low&0xf0)>>4;return temp1;
}float read_temperature2()   //读取温度(小数)
{float temp2;unsigned int temp;unsigned char low,high;Init_DS18B20();Write_DS18B20(0xcc);Write_DS18B20(0x44);Delay_OneWire(200);Init_DS18B20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);Delay_OneWire(200);low = Read_DS18B20();high = Read_DS18B20();temp = high&0x0f;temp = temp<<8|low;temp2 = temp*0.0625;return temp2;
}

DS18B20读取温度(带小数)相关推荐

  1. 蓝桥杯单片机(九)DS18B20温度测量(四位小数和负数显示)

    上一次讲了DS18B20的整数温度显示 蓝桥杯单片机(八)DS18B20温度测量(整数显示) 但近几年有出题小数部分的温度显示,首先打开DS18B20的数据手册,如图 通过这张表,我就知道读取数据时, ...

  2. python 把带小数的浮点型字符串转换为整数的解决方案

    python 把带小数的浮点型字符串转换为整数的解决方案 参考文章: (1)python 把带小数的浮点型字符串转换为整数的解决方案 (2)https://www.cnblogs.com/mlgjb/ ...

  3. Java除法结果带小数、进一法的实现 Java问题通用解决代码

    http://blog.csdn.net/windone0109/article/details/5355379进一法: 即省略的位上只要大于零都要进一位 :  四舍五入法: 即省略的位上小于五都要舍 ...

  4. python怎么创建列表_用Python将一个列表分割成小列表的实例讲解 Python 如何创建一个带小数的列表...

    python里有一个列表,列表里有几个小列表,小列表#冒泡排序:scoreList = [['a',98],['c',45],['b',70],['d',85],['h',85],['f',92],[ ...

  5. C语言算小数加减,C语言带小数加减乘除.doc

    C语言带小数加减乘除 /*Desgined by doBell-ConG*/ /*Function:simply add, subtract, multiply and divide*/ #inclu ...

  6. 利用栈实现四则运算,带负数,带括号,带小数

    这利用栈实现四则运算,带负数,带括号,带小数,自己写的有问题大家纠正. #include <stdio.h> #include <stdlib.h> #include < ...

  7. Java除法结果带小数、进一法的实现(java)

    Java除法结果带小数.进一法的实现(java) Java除法结果带小数.进一法的实现(java) 进一法: 即省略的位上只要大于零都要进一位 : 四舍五入法: 即省略的位上小于五都要舍去,但省略的位 ...

  8. Java除法结果带小数、进一法的实现

    进一法: 即省略的位上只要大于零都要进一位 : 四舍五入法: 即省略的位上小于五都要舍去,但省略的位上满五都要进一位 : 还有一种 去尾法: 即省略的位上不管是否满五都要舍去 : 1.除法带小数 例如 ...

  9. MySQL最佳入门 - MySQL数据类型之存储带小数的类型

    本篇文章MySQL版本: +-----------+ | version() | +-----------+ | 5.5.53    | +-----------+ 存储带小数的类型 浮点数和定点数类 ...

最新文章

  1. python编码问题无法复现_Python编码问题详解
  2. We PE U盘安装win7系统
  3. PostgreSQL数据库图像搜索插件imgsmlr部署
  4. juqery 获取radio选中的值
  5. Python学习笔记:函数
  6. DecimalFormat 类
  7. SAP CRM SPRO Customizing 里 Text Object 属性 continue 的含义
  8. mysql体系结构和存储引擎
  9. leetcode417. 太平洋大西洋水流问题(bfs)
  10. WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化
  11. rlwrap解决sqlplus上下键和backspace键找历史命令
  12. 解决Python中字典出现“TypeError: 'dict_keys' object does not support indexing”错误
  13. 【SQLServer】
  14. 内部收益率irr_爱心人寿心相随年金险,IRR内部收益率测算
  15. 软件测试常见的风险,软件测试中常见的风险分析
  16. python模拟12306购票_实现12306模拟登录--Python
  17. TypeError Class constructor ExampleService cannot be invoked withou ‘new‘ at
  18. 经典排序算法之:堆排序
  19. The Multiversity 的 “非常重要的生命体” NFT 推出
  20. ISP_DPC坏点矫正

热门文章

  1. 广东省工业互联网产业联盟发布广东省工业互联网产业生态供给资源池报道
  2. 国家级文件发布:2020年推进电信基础设施共建共享,支持5G智慧杆塔建设
  3. linux基本功系列之more命令实战
  4. 通达信l2接口如何用?
  5. 谈谈PDF如何快速转成Word文档
  6. 网创客:网络上三个门槛低、白手起家的赚钱项目,会一个就行
  7. 【BAT面试】JDK8 JVM内存模型
  8. 网站运营方案SEO【运营】
  9. 部分高校网络教育资源将免费开放
  10. Pr 入门教程:了解时间轴面板