单片机基础模块学习——DS18B20温度传感器芯片

devtools/2025/2/2 5:03:41/

不知道该往哪走的时候,就往前走。 

一、DS18B20芯片原理图

该芯片共有三个引脚,分别为

  1. GND——接地引脚
  2. DQ——数据通信引脚
  3. VDD——正电源

数据通信用到的是1-Wier协议

  • 优点:占用端口少,电路设计方便
  •  同时该协议要求通过上拉电阻上拉到正电源
  • 该协议是总线协议,可以挂载一个以上的元件

总线协议每一个元件都有一个地址,根据地址就可以获得对应传感器的内部信息


DS18B20温度传感器在开发板上的位置如下图

 二、访问DS18B20步骤

  1. 初始化
  2. 发送地址(当总线上只有一个元件,就可以直接面向所有的传感器进行通信就可以了例如:局域网的广播)
  3. 功能性命令(触发温度采集,读取相关命令等)

    功能性命令表格

  • 第一行触发温度转换,地址是0x44
  • 第二行读取温度,地址是0xBE
  • 下面的功能是进行更深入的开发会用到,这里暂不解释

DS18B20温度存储格式

 

共有16位数据结构,S=SIGN 代表一个符号

  • 如果温度是正的,11~15位都是0;
  • 如果温度是负的,11~15位都是1;

0~3是小数位,4~10是整数位,最高到。温度传感器的精度是12bit

读取的话由于是16位的数据,可以用unsigned int类型变量存储


但真正的unsigned int类型和这个是有差别的

由上图可以发现,对应的两个数之间相差倍,因此在读取之后,想要获得真正的值就要除以16

三、模块代码

由于占用两个字节,所以用两个变量存储高八位和低八位的数,最后并在一起返回一个数

#include "onewire.h"
//
void Delay_OneWire(unsigned int t)  
{unsigned char i;while(t--){for(i=0;i<12;i++);}
}//
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;
}//
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;
}unsigned int read_temperature(void)
{unsigned char 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 (high<<8|low);
}

四、主函数代码

这里别忘记要将数据除以16才是真实数据,由于传回的是整数类型,所以要除以16.0,最后的结果才可以保留两位小数


想让数码管的后四位不显示,不要忘记敲四个空格

#include "seg.h"
#include "tim.h"
#include "led.h"
#include "init.h"
#include "onewire.h"
//Seg
unsigned char pucSeg_Buf[12],pucSeg_Code[9],pucSeg_Pos=0;//字符数组以/0结尾,所以要有9位
void Seg_Proc(void);//Timer
unsigned long ulms =0;
unsigned int uiSeg_Dly=0;
//Temperature
unsigned int uiTemp=0;
void main(void)
{Cls_Peripheral();Timer0Init();EA=1;while(1){Seg_Proc();}}void Seg_Proc(void)
{if(uiSeg_Dly<200)return;uiSeg_Dly =0;uiTemp = read_temperature();sprintf(pucSeg_Buf,"%.2f    ",uiTemp/16.0);//将指定的内容打印到字符数组里Seg_Tran(pucSeg_Buf,pucSeg_Code);
}void Time_0(void) interrupt 1
{ulms++;uiSeg_Dly++;if(ulms % 2==0){pucSeg_Pos=(pucSeg_Pos+1)%8;//实现pucSeg_Pos从0-7循环的操作Seg_Disp(pucSeg_Code,pucSeg_Pos);}
}

 

 


http://www.ppmy.cn/devtools/155344.html

相关文章

六. Redis当中的“发布” 和 “订阅” 的详细讲解说明(图文并茂)

六. Redis当中的“发布” 和 “订阅” 的详细讲解说明(图文并茂) 文章目录 六. Redis当中的“发布” 和 “订阅” 的详细讲解说明(图文并茂)1. 发布 和 订阅的概念 2. 发布订阅模式分类2.1 一个发布者&#xff0c;多个订阅者2.2 多个发布者&#xff0c;一个订阅者2.3 多个发布者…

DeepSeek能下围棋吗?(续)

休息了一下&#xff0c;接着琢磨围棋&#xff0c;其实前面一篇里的规则有个漏洞的&#xff0c;就是邻居关系定义有问题&#xff0c;先回顾一下游戏规则&#xff1a; 游戏规则 定义&#xff1a; 1.数字对&#xff0c;是指两个1到9之间的整数组成的有序集合。可与记为(m,n)&…

webview_flutter_wkwebview 3.17.0使用指南

文档一 lib\inserted_web_seven\tell_to_ai\my_summary\webview_flutter_wkwebview_3.17.0_guide.txt webview_flutter_wkwebview3.17.0 使用指南 日期&#xff1a;2025年1月26日 一、核心作用 iOS/macOS平台的Flutter WebView实现组件&#xff0c;基于WKWebView提供&#x…

2025美赛B题-问题B:管理可持续旅游

美国阿拉斯加州朱诺市人口约 30,000人&#xff0c;2023 年创下160万邮轮乘客的纪录&#xff0c;在最繁忙的日子里&#xff0c;邮轮乘客多达7艘&#xff0c;游客人数超过 20,000人。1虽然这些游客为该市带来了约 3.75 亿美元的可观收入&#xff0c;!但也带来了与过度拥挤相关的问…

Privacy Eraser,电脑隐私的终极清除者

Privacy Eraser 是一款专为保护用户隐私而设计的全能型软件&#xff0c;它不仅能够深度清理计算机中的各类隐私数据&#xff0c;还提供了多种系统优化工具&#xff0c;帮助用户提升设备的整体性能。通过这款软件&#xff0c;用户可以轻松清除浏览器历史记录、缓存文件、Cookie、…

Python3 【装饰器】避坑指南:常见错误解析

Python3 【装饰器】避坑指南&#xff1a;常见错误解析 在编写或使用 Python 装饰器时&#xff0c;可能会遇到一些典型的错误。以下是 15 种常见错误&#xff0c;分析出错原因并提供纠正方法&#xff0c;同时通过代码示例进行演示和说明。 1. 忘记调用被装饰的函数 错误原因&a…

React Router v6配置路由守卫

首先准备好以下页面 登录页&#xff1a;用户可以在此页面登录。 受保护页&#xff1a;只有登录的用户可以访问&#xff0c;否则会重定向到登录页。 公共页面&#xff1a;不需要鉴权&#xff0c;任何人都可以访问。 1. 安装依赖 首先&#xff0c;我们需要安装 react-router-do…

Java算法——排序

目录 引言1. 插入排序1.1 基本思想1.2 直接插入排序1.3 希尔排序 2. 选择排序2.1 基本思想2.2 直接选择排序2.3 直接选择排序变种2.4 堆排序 3. 交换排序3.1 基本思想3.2 冒泡排序3.3 快速排序3.3.1 快速排序的基本结构3.3.2 Hoare法3.3.3 挖坑法3.3.4 双指针法 3.4 快速排序非…