DS18B20读取温度(带小数)
由于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读取温度(带小数)相关推荐
- 蓝桥杯单片机(九)DS18B20温度测量(四位小数和负数显示)
上一次讲了DS18B20的整数温度显示 蓝桥杯单片机(八)DS18B20温度测量(整数显示) 但近几年有出题小数部分的温度显示,首先打开DS18B20的数据手册,如图 通过这张表,我就知道读取数据时, ...
- python 把带小数的浮点型字符串转换为整数的解决方案
python 把带小数的浮点型字符串转换为整数的解决方案 参考文章: (1)python 把带小数的浮点型字符串转换为整数的解决方案 (2)https://www.cnblogs.com/mlgjb/ ...
- Java除法结果带小数、进一法的实现 Java问题通用解决代码
http://blog.csdn.net/windone0109/article/details/5355379进一法: 即省略的位上只要大于零都要进一位 : 四舍五入法: 即省略的位上小于五都要舍 ...
- python怎么创建列表_用Python将一个列表分割成小列表的实例讲解 Python 如何创建一个带小数的列表...
python里有一个列表,列表里有几个小列表,小列表#冒泡排序:scoreList = [['a',98],['c',45],['b',70],['d',85],['h',85],['f',92],[ ...
- C语言算小数加减,C语言带小数加减乘除.doc
C语言带小数加减乘除 /*Desgined by doBell-ConG*/ /*Function:simply add, subtract, multiply and divide*/ #inclu ...
- 利用栈实现四则运算,带负数,带括号,带小数
这利用栈实现四则运算,带负数,带括号,带小数,自己写的有问题大家纠正. #include <stdio.h> #include <stdlib.h> #include < ...
- Java除法结果带小数、进一法的实现(java)
Java除法结果带小数.进一法的实现(java) Java除法结果带小数.进一法的实现(java) 进一法: 即省略的位上只要大于零都要进一位 : 四舍五入法: 即省略的位上小于五都要舍去,但省略的位 ...
- Java除法结果带小数、进一法的实现
进一法: 即省略的位上只要大于零都要进一位 : 四舍五入法: 即省略的位上小于五都要舍去,但省略的位上满五都要进一位 : 还有一种 去尾法: 即省略的位上不管是否满五都要舍去 : 1.除法带小数 例如 ...
- MySQL最佳入门 - MySQL数据类型之存储带小数的类型
本篇文章MySQL版本: +-----------+ | version() | +-----------+ | 5.5.53 | +-----------+ 存储带小数的类型 浮点数和定点数类 ...
最新文章
- python编码问题无法复现_Python编码问题详解
- We PE U盘安装win7系统
- PostgreSQL数据库图像搜索插件imgsmlr部署
- juqery 获取radio选中的值
- Python学习笔记:函数
- DecimalFormat 类
- SAP CRM SPRO Customizing 里 Text Object 属性 continue 的含义
- mysql体系结构和存储引擎
- leetcode417. 太平洋大西洋水流问题(bfs)
- WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化
- rlwrap解决sqlplus上下键和backspace键找历史命令
- 解决Python中字典出现“TypeError: 'dict_keys' object does not support indexing”错误
- 【SQLServer】
- 内部收益率irr_爱心人寿心相随年金险,IRR内部收益率测算
- 软件测试常见的风险,软件测试中常见的风险分析
- python模拟12306购票_实现12306模拟登录--Python
- TypeError Class constructor ExampleService cannot be invoked withou ‘new‘ at
- 经典排序算法之:堆排序
- The Multiversity 的 “非常重要的生命体” NFT 推出
- ISP_DPC坏点矫正