蓝桥杯单片机之DS18B20温度传感器
蓝桥杯单片机之DS18B20温度传感器
- 简述:
- 根据提供的芯片数据手册可以获取的信息:
- ROM操作命令:
- 存储器操作命令
- 温度转换及温度获取
- 温度寄存器格式:
- 获取温度的具体操作
- 温度数据处理与数码管显示
- 完整项目代码示例:
简述:
蓝桥杯板子上的DS18B20温度传感器,通信方式是单总线通信(1一wire);同时在蓝桥杯比赛的资料包中,提供了一个关于DS18B20的库文件(onewire.h,onewire.c),里面有传感器复位 [bit init_ds18b20(void)
]、写字节 [void Write_DS18B20(unsigned char dat)
] 和读字节 [unsigned char Read_DS18B20(void)
] 三个函数。所以我们不一定需要将I2C的时序搞得很清楚,只需要将DS18B20的基本操作流程弄明白。
根据提供的芯片数据手册可以获取的信息:
DS18B20 采用单总线协议与主机进行通信。在单线端口条件下,必须先建立ROM 操作协议,才能进行存储器和控制操作。
配置寄存器允许用户将温度数字转换的分辨率设置为9、10、11或12位。DS18B20的核心功能是直接数字温度传感器。温度传感器的分辨率可由用户配置为9、10、11或12 位,分别对应0.5℃、0.25℃、0.125℃和0.0625℃的增量。上电时的默认分辨率为12位(即精度为0.0625℃)。
通过单线总线端口访问 DS18B20 的协议如下:
• 初始化
• ROM 操作命令
• 存储器操作命令
• 执行/数据
ROM操作命令:
名称(寄存器地址) | 作用 | 其他 |
---|---|---|
Search ROM(F0H) | 主机识别总线上所有从机的ROM代码 | |
Read ROM(33H) | 主机读取从机的64位ROM代码 | |
Match ROM(55H) | 匹配64位ROM命令 | |
Skip ROM(CCH) | 主机使用该命令同时寻址总线上的所有器件,无需发送器件的64位rom代码即可读取从机数据 | 适合像CT107D开发板的设计,总线上只有一个器件的情况 |
Alarm Search(ECH) | 主机确定最近一次温度转换期间是否有DS18B20出现报警情况 | 很少用到 |
主机可以使用 Skip ROM命令 同时寻址总线上的所有器件,而无需发送任何ROM代码信息。例如,主机可以通过发出Skip ROM命令,然后发出Convert T [44h]功能命令,使总线上的所有DS18B20同时执行温度转换。
请注意,Skip ROM命令适用于总线上有一个从机时。这种情况下,主机无需发送器件的64位ROM代码即可读取从机数据,从而节省了时间。
存储器操作命令
操作命令名称(寄存器地址) | 描述 |
---|---|
Convert Temperatures(44H) | 该命令启动一次温度转换。转换后,产生的热数据存储在暂存存储器的2 字节温度寄存器 |
Write Scratchpad (4EH) | 该命令允许主机向DS18B20的暂存器写入3个字节的数据。 |
Read Scratchpad (BEH) | 该命令允许主机读取寄存器的数据。数据传输从字节0的最低有效位开始(低八位开始),继续通过暂存器,直到读取完高八位字节。 |
温度转换及温度获取
温度寄存器格式:
当需要执行温度测量时,总线控制器必须发出温度转换命令。在那之后,产生的温度数据以两个字节的形式被存储到高速暂存器的温度寄存器中,DS18B20继续保持等待状态。单片机可通过单线接口可以读到该数据,读取时低位在前,高位在后。
下表中高5位S为扩展符号位。当S=0时表示测得的温度值为正值,可以直接将二进制位转换为十进制;当S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制值。
原文:After the DS18B20 performs a temperature conversion, the temperature value is compared to the user-defined two’s complement alarm trigger values stored in the 1-byte TH and TL registers (see Figure 3). The sign bit (S) indicates if the value is positive or negative: for positive numbers S = 0 and for negative numbers S = 1.
获取温度的具体操作
读取一次DS18B20温度的基本操作:
<1> 对DS18B20进行复位初始化。
<2> 向DS18B20写0xCC命令,跳过ROM。
<3> 向DS18B20写0x44命令,开始进行温度转换。
<4> 等待温度转换完成。
<5> 对DS18B20进行复位初始化。
<6> 向DS18B20写0xCC命令,跳过ROM。
<7> 向DS18B20写0xBE命令,开始读取寄存器中的温度数据
<8>将读取的高八位和高八位的温度数据存入对应的变量中
<9>将DS18B20复位初始化。
完整读取一次温度数据的代码示例:
Init_DS18B20(); //对DS18B20进行复位初始化。Write_DS18B20(0xCC); //跳过ROM,仅总线上只有一个从机时使用Write_DS18B20(0x44); //进行温度转换Init_DS18B20(); //对DS18B20进行复位初始化。Write_DS18B20(0xCC); //跳过ROM,仅总线上只有一个从机时使用Write_DS18B20(0xBE); //开始读取寄存器中的温度数据,需按照从低八位到高八位的顺序LSB = Read_DS18B20(); //将低八位存入LSB变量MSB = Read_DS18B20(); //将高八位存入MSB变量Init_DS18B20(); //对DS18B20进行复位初始化。
温度数据处理与数码管显示
根据储存温度数据的变量进行实际温度计算(正温度值):
unsigned int Digital_Output,Decimals,Integer;
Digital_Output = MSB << 8 | LSB //将高八位左移8位再加上低八位,形成一个16位的完整温度数据
if(Digital_Output & 0xF800 == 0X0000)
{Integer = (Digital_Output >>4)* 100; //提取整数部分并乘以100Decimals = (LSB & 0x0f) * 0.0625*100; //提取分数部分乘以精度再乘以100Digital_Output =Integer+Decimals;
}
需要保留小数时的数据处理(数码管显示):
例如:我们要显示15.34
步骤:
1>将15.34*100
2>利用1534进行每一位的提取
1534/1000 = 1;
1534/100%10 = 5;
1534/10%10 = 3;
1534%10 = 4;
3>将获取的每一位数显示在数码管上//记住数码管显示时,5是一个含有小数点的字形>
完整项目代码示例:
#include "reg52.h"
#include "onewire.h" //引用资料中的单总线驱动头文件unsigned int T_dat; //定义一个温度变量
/*数码管显示需要的字码*/
unsigned char SMG_NoDot[19] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x80, 0xc6, 0xc0, 0x86, 0x8e, 0xbf, 0x7f, 0xff}; //0-9、A-F、'-'、'.'
unsigned char code SMG_IsDot[10] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10};void Delay500us();
void Read_Temperature(); //从DS18B20读取一次温度的操作,并将温度进行处理函数
void Display_Temperature(unsigned int dat); //温度数据的数码管显示,保留两位小数
void Digital_Tube(unsigned char Position, unsigned char Typeface); //数码管单个字符显示函数void main()
{while (1){Read_Temperature();Display_Temperature(T_dat);}
}void Delay500us() //@12.000MHz
{unsigned char i, j;i = 6;j = 211;do{while (--j);}while (--i);
}void Digital_Tube(unsigned char Position, unsigned char Typeface) //Position是数码管第几位(从左到右,0开始),Typeface是显示的字样
{unsigned char Bit[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};P2 = P2 & 0x1f | 0xc0;P0 = Bit[Position];P2 = P2 & 0x1f | 0xe0;P0 = Typeface;Delay500us();P0 = 0XFF;P2 = P2 & 0x1f ; //数码管消影
}void Display_Temperature(unsigned int dat) //温度数据的数码管显示,保留两位小数
{Digital_Tube(7, SMG_NoDot[dat % 10]); Digital_Tube(6, SMG_NoDot[dat / 10 % 10]);Digital_Tube(5, SMG_IsDot[(dat / 100) % 10]);Digital_Tube(4, SMG_NoDot[(dat / 1000) % 10]);/*数码管全灭,消影作用*/P2 = P2 & 0x1f | 0xc0; P0 = 0XFF;P2 = P2 & 0x1f | 0xe0;P0 = 0XFF;
}void Read_Temperature() //从DS18B20读取一次温度的操作,并将温度进行处理函数
{unsigned char LSB, MSB;unsigned int Decimals,Integer; //定义局部变量,整数、小数Init_DS18B20(); //对DS18B20进行复位初始化。Write_DS18B20(0xCC); //跳过ROM,仅总线上只有一个从机时使用Write_DS18B20(0x44); //进行温度转换Init_DS18B20(); //对DS18B20进行复位初始化。Write_DS18B20(0xCC); //跳过ROM,仅总线上只有一个从机时使用Write_DS18B20(0xBE); //开始读取寄存器中的温度数据,需按照从低八位到高八位的顺序LSB = Read_DS18B20(); //将低八位存入LSB变量MSB = Read_DS18B20(); //将高八位存入MSB变量Init_DS18B20(); //对DS18B20进行复位初始化。T_dat = 0x0000; //数据初始化T_dat = MSB << 8 | LSB; //将低八位和高八位进行合并if ((T_dat & 0xf800) == 0x0000) //判断是不是正值{Integer = (T_dat >>4)* 100; //提取整数部分并乘以100Decimals = (LSB & 0x0f) * 0.0625*100; //提取分数部分乘以精度再乘以100T_dat=Integer+Decimals; //将100倍的整数部分加上100倍的小数部分}/*if ((MSB& 0xf8) == 0x0000) //判断是不是正值{T_dat=T_dat*0.0625*100; //将100倍的整数部分加上100倍的小数部分}*/
}
DS18B20的蓝桥杯文档及整个工程文件下载:
蓝桥杯单片机之DS18B20温度传感器相关推荐
- 蓝桥杯单片机(九)DS18B20温度测量(四位小数和负数显示)
上一次讲了DS18B20的整数温度显示 蓝桥杯单片机(八)DS18B20温度测量(整数显示) 但近几年有出题小数部分的温度显示,首先打开DS18B20的数据手册,如图 通过这张表,我就知道读取数据时, ...
- 【小蜜蜂蓝桥杯笔记】DS18B20温度传感器的使用
DS18B20 更新(需要注意的部分) 进行带小数点的高精度转换时,需要750ms的延时,建议将开始转换和读取数据的函数分开写,利用定时器保证750ms之后再去读取,不然会出现很奇怪的数字 数据处理的 ...
- 【蓝桥杯单片机11】单总线温度传感器DS18B20的基本操作
[蓝桥杯单片机11]单总线温度传感器DS18B20的基本操作 广东职业技术学院 欧浩源 单总线数字温度传感器DS18B20几乎成了各类单片机甚至ARM实验板的标配模块来,在蓝桥杯的往届省赛和国赛中,这 ...
- 蓝桥杯单片机DS18b20单总线测温模块常见问题解决
蓝桥杯单片机DS18b20单总线测温模块常见问题解决 有道是:"溪水声声留我住,梅花朵朵唤人回" DS18b20测温模块作为一个比较简单.稳定的蓝桥杯单片机外设模块, 使用时却经常 ...
- 蓝桥杯单片机DS18B20代码注释及部分时序图
蓝桥杯单片机蓝桥杯单片机DS18B20代码注释及部分时序图 #include<STC15F2K60S2.H> #include<intrins.h>#define uchar ...
- 【蓝桥杯单片机(24)】历届单片机客观题及答案解析
目录 考前冲刺,专栏完结篇 ## 推荐链接: 推荐视频–小蜜蜂老师讲解 赛点资源包下载,提取码:brno 三极管基本知识总结 运算放大电路的基础 第十三届蓝桥杯单片机官方直播课录屏 目录 一些刷题后的 ...
- 关于第八届蓝桥杯单片机初赛----电子钟设计的题目分析和编程思路分享
关于第八届蓝桥杯单片机初赛----电子钟设计的题目分析和编程思路分享 1.前言 蓝桥杯单片机比赛,对于初试者,比如那些没有接触51系列单片机,或者很少编程训练的人而言,确实很有挑战力.而即使对于有基础 ...
- 蓝桥杯单片机组——榨干选手资源包(芯片数据手册)
文章目录 前言 DS18B20 原理图 1-Wire协议简介 赛场技巧 DS1302 原理图 SPI协议简介 赛场技巧 AT24C02 原理图 IIC协议简介 赛场技巧 PCF8591 原理图 赛场技 ...
- 蓝桥杯单片机第十二届第一场省赛--张三填坑
Less interests.More interest. 蓝桥杯单片机第十二届第一场省赛--张三填坑 坑0 坑1 坑2 坑3 坑4 坑5 坑6 坑7 坑8 仅记录试题中可能存在的坑. 源码和PDF题 ...
最新文章
- python升级知识整理 第五节:文件整理
- 对抗神经网络GAN到底学到了什么
- C++ 常用函数总结
- Tensorflow模型加载与保存、Tensorboard简单使用
- Flash 与数学:圆的切线(2)
- 2017 上半年总结
- android内存卡测试,安卓sd卡真假检测工具_内存卡检测扩容卡软件_sd insight
- Linux桌面没有minidwep,ubuntu 12.04完整安装minidwep-gtk教程
- 清除Svchost.exe
- 如何实现只有一个路由器不同网段pc间的互通
- 【计算机系统基础4】程序的机器级表示
- 【计算机基础】03-Word知识
- 一线城市,一个人打拼更不易
- 计算机c盘那个是系统文件夹,C盘有哪些文件可以删除?可以手动删除的几个C盘中的文件夹...
- java网页设计_java设计的登录页面
- 未来机器人会有多“可怕”,这些技术已经有所体现
- 64位系统VBS调用32位COM组件
- 使用u盘PE安装原版xp系统
- Fluent的入门、边界条件设置、求解器(Solver)设置、湍流模型(Models)设置、UDF、物理模型等
- SMART Talk
热门文章
- 【dbux-cxx】简介及例程
- saklfjaslkdjflkasjdfklajslkdfjaklsjdfkjasljdfkasjdkfjaskdlfjklasjdgkljagkljgjaskdjflaskjdfalksjdflas
- 2022.10.17 英语背诵
- 多语言文本到音素转换工具phonemizer实践
- Android神技之 使用SVG以及自定义IconFont字体库
- 【计算机网络】数据链路层——局域网/广域网
- Shader Forge_1.26
- 使用 rman 方式测试增量传输xtts
- c语言矩阵键盘实验心得,DSP-矩阵键盘扫描实验.doc
- 中国惠普前CEO孙振耀:感悟工作与生活