51单片机学习--DS18B20温度读取温度报警器

需要先编写OneWire模块,再在DS18B20模块中调用OneWire模块的函数

先根据原理图做好端口的声明:
sbit OneWire_DQ = P3^7;
接下来像之前一样把时序结构用代码模拟出来:

unsigned char OneWire_Init(void)
{unsigned char i;unsigned char AckBit;OneWire_DQ = 1;OneWire_DQ = 0; //总线拉低//延时500usi = 227; while (--i);OneWire_DQ = 1; //释放总线//延时70usi = 29; while (--i);AckBit = OneWire_DQ;//延时500usi = 227; while (--i);return AckBit;
}

void OneWire_SendBit(unsigned char Bit)
{unsigned char i;OneWire_DQ = 0; //总线拉低//延时10us后直接读电平i = 4; while(--i);OneWire_DQ = Bit;//延时50us凑满时间片i = 22; while(--i);OneWire_DQ = 1;
}

unsigned char OneWire_ReceiveBit(void)
{unsigned char i;unsigned char Bit;OneWire_DQ = 0;//延时5usi = 2; while(--i);OneWire_DQ = 1;//延时5usi = 2; while(--i);Bit = OneWire_DQ;//延时50usi = 22; while(--i);return Bit;
}

void OneWire_SendByte(unsigned char Byte)
{unsigned char i;for(i = 0; i < 8; i ++) {OneWire_SendBit(Byte & (0x01<<i));}
}unsigned char OneWire_ReceiveByte(void)
{unsigned char i;unsigned char Byte = 0x00;for(i = 0; i < 8; i ++) {if(OneWire_ReceiveBit()) {Byte |= (0x01<<i);}}return Byte;
}
至此,OneWire模块就写好了,接下来在DS18B20模块中模拟数据帧:


#include <REGX52.H>
#include "OneWire.h"#define DS18B20_SKIP_ROM 0xCC
#define DS18B20_CONVERT_T 0x44
#define DS18B20_READ_SCRATCHPAD 0xBEvoid DS18B20_ConvertT(void)
{OneWire_Init();OneWire_SendByte(DS18B20_SKIP_ROM);OneWire_SendByte(DS18B20_CONVERT_T);
}float DS18B20_ReadT(void)
{unsigned char TLSB, TMSB;int temp;float T;OneWire_Init();OneWire_SendByte(DS18B20_SKIP_ROM);OneWire_SendByte(DS18B20_READ_SCRATCHPAD);TLSB = OneWire_ReceiveByte();TMSB = OneWire_ReceiveByte();temp = (TMSB<<8) | TLSB;T = temp / 16.0;return T;
}
之后只需要在main中调用即可
#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"float T;void main()
{LCD_Init();LCD_ShowString(1, 1, "Temperature!");while(1){DS18B20_ConvertT();T = DS18B20_ReadT();if(T < 0){LCD_ShowChar(2, 1, '-');T = -T;}else{LCD_ShowChar(2, 1, '+');}LCD_ShowNum(2, 2, T, 3);//整数部分LCD_ShowChar(2, 5, '.');LCD_ShowNum(2, 6, (unsigned long)(T *10000) % 10000, 4); //小数部分}
}

接下来进行一些综合的应用:温度报警器,按键可调整报警温度的上下限,且能用AT24C02记录上下限,掉电不丢失(这里默认所有温度不会超过DS18B20的芯片范围)
#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"
#include "Delay.h"
#include "AT24C02.h"
#include "Key.h"
#include "Timer0.h"float T, TShow;
char THigh, TLow;
unsigned char KeyNum;void main()
{THigh = AT24C02_ReadByte(0);TLow = AT24C02_ReadByte(1);//第一次读可能是非法值,所以要特判一下if(THigh > 125 || TLow < - 55 || THigh <= TLow){THigh = 20;TLow = 15;}Timer0_Init();LCD_Init();LCD_ShowString(1, 1, "T:");LCD_ShowString(2, 1, "TH:");LCD_ShowString(2, 9, "TL:");LCD_ShowSignedNum(2, 4, THigh, 3);LCD_ShowSignedNum(2, 12, TLow, 3);while(1){KeyNum = Key();/*温度读取及显示*/DS18B20_ConvertT();T = DS18B20_ReadT();if(T < 0){LCD_ShowChar(1, 3, '-');TShow = -T;}else{LCD_ShowChar(1, 3, '+');TShow = T;}LCD_ShowNum(1, 4, TShow, 3);LCD_ShowChar(1, 7, '.');LCD_ShowNum(1, 8, (unsigned long)(TShow * 100)%100, 2);/*阈值判断及显示*/if(KeyNum){if(KeyNum == 1) THigh ++;if(KeyNum == 2) THigh --;if(KeyNum == 3) TLow ++;if(KeyNum == 4) TLow --;LCD_ShowSignedNum(2, 4, THigh, 3);LCD_ShowSignedNum(2, 12, TLow, 3);AT24C02_WriteByte(0, THigh);Delay(5);AT24C02_WriteByte(1, TLow);Delay(5);}if(T > THigh) LCD_ShowString(1, 13, "OV:H");else if(T < TLow) LCD_ShowString(1, 13, "OV:L");else LCD_ShowString(1, 13, " ");}
}void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 = 0x66; //设置定时初值TH0 = 0xFC; //设置定时初值T0Count ++;if(T0Count >= 20) //20ms执行一次{T0Count = 0;Key_Loop();}
}

这还没完,在与定时器的结合中,定时器的中断会影响OneWire的延时,从而影响其中的时序结构进而影响温度实时获取,所以在时序结构编写的代码中需要加上屏蔽定时器中断的代码:开始时加上EA = 0,最后加上EA = 1,改版后的OneWire模块如下:
#include <REGX52.H>sbit OneWire_DQ = P3^7;unsigned char OneWire_Init(void)
{unsigned char i;unsigned char AckBit;EA = 0; //屏蔽中断OneWire_DQ = 1;OneWire_DQ = 0; //总线拉低//延时500usi = 227; while (--i);OneWire_DQ = 1; //释放总线//延时70usi = 29; while (--i);AckBit = OneWire_DQ;//延时500usi = 227; while (--i);EA = 1;return AckBit;
}void OneWire_SendBit(unsigned char Bit)
{unsigned char i;EA = 0; //屏蔽中断OneWire_DQ = 0; //总线拉低//延时10us后直接读电平i = 4; while(--i);OneWire_DQ = Bit;//延时50us凑满时间片i = 22; while(--i);OneWire_DQ = 1;EA = 1;
}unsigned char OneWire_ReceiveBit(void)
{unsigned char i;unsigned char Bit;EA = 0; //屏蔽中断OneWire_DQ = 0;//延时5usi = 2; while(--i);OneWire_DQ = 1;//延时5usi = 2; while(--i);Bit = OneWire_DQ;//延时50usi = 22; while(--i);EA = 1;return Bit;
}void OneWire_SendByte(unsigned char Byte)
{unsigned char i;for(i = 0; i < 8; i ++) {OneWire_SendBit(Byte & (0x01<<i));}
}unsigned char OneWire_ReceiveByte(void)
{unsigned char i;unsigned char Byte = 0x00;for(i = 0; i < 8; i ++) {if(OneWire_ReceiveBit()) {Byte |= (0x01<<i);}}return Byte;
}
但是这样虽然能维护好单总线的通信,但这样直接屏蔽中断却会影响定时器的计时准确度,从而对定时器控制的其他模块造成影响,这也就是单总线的一大缺点,不过在这个实例中,按键的定时器准度要求并不高,所以这样控制影响不大
相关文章:
51单片机学习--DS18B20温度读取温度报警器
需要先编写OneWire模块,再在DS18B20模块中调用OneWire模块的函数 先根据原理图做好端口的声明: sbit OneWire_DQ P3^7;接下来像之前一样把时序结构用代码模拟出来: unsigned char OneWire_Init(void) {unsigned char i;unsigned char Ac…...
PYTHON专栏
PYTHON专栏 python基础教程 python基础教程 Python练手算法 Python练手算法 Python设计模式 Python设计模式 MySQL教程 MySQL教程 ORM框架SQLAlchemy Python ORM框架SQLAlchemy Python Web框架Django Python Web框架Django Web框架FastAPI Web框架FastAPI http库request…...
从初学者到专家:Java运算符的完整指南
目录 1.算数运算符 2.增量运算符 2.1自增/自减运算符 4. 逻辑运算符 5.位运算符 6.移位运算符 7. 条件运算符 导言: Java作为一门广泛使用的编程语言,其运算符是编写代码时必不可少的一部分。本篇博客将为你详细介绍Java中的各种运算符…...
Linux:shell脚本:基础使用(3)
for循环语句 语句格式 for for变量 in 取值列表(可以是变量或者自己定义) do 循环内容 done 工作方式就是通过取值列表去判断循环的次数,每次循环的同时把列表一行的值赋予到for变量。取值方式如果是数字,那就通过数字去…...
opencv基础46-图像金字塔02-拉普拉斯金字塔
前面我们介绍了高斯金字塔,高斯金字塔是通过对一幅图像一系列的向下采样所产生的。有时,我们希望通过对金字塔中的小图像进行向上采样以获取完整的大尺寸高分辨率图像,这时就需要用到拉普拉斯金字塔 前面我们已经介绍过,一幅图像在…...
到 2030 年API 攻击预计将激增近 1000%
导读云原生应用程序编程接口管理公司 Kong 联合外部经济学家的最新研究预计,截至 2030 年 API 攻击将激增 996%,意味着与 API 相关的网络威胁的频率和强度都显着升级。 这项研究由 Kong 分析师和布朗大学副教授 Christopher Whaley 博士合作进行&#x…...
环形队列+DMA空闲中断+接收串口数据
环形队列DMA空闲中断接收串口数据 一.序言二.实验原理三.实战是检验真理的唯一标准3.1 usart1.c3.2 串口中断 三.队列代码4.1 fifo.c4.2 fifo.h 五.结语 一.序言 本次实验利用环形队列DMA空闲中断串口。。通过这个实验可以非常深入的理解队列,DMA,串口的知识。如果…...
LeetCode 31题:下一个排列
目录 题目 思路 代码 题目 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如,arr [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序…...
CMake:检测python模块和包
CMake:检测python模块和包 导言项目结构CMakeLists.txt相关源码 导言 上一篇,我们基本了解了如何去检测python的解释器和python库。通常,代码是依赖于特定的python模块,无论是python工具、嵌入python的程序,还是扩展python的库。…...
02Mysql之多表查询--例题讲解
一、题目详情,以及表的建立 新增员工表emp和部门表deptcreate table dept (dept1 int ,dept_name varchar(11));create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int);insert into dept values(101,财务),(102,销售)…...
虹科方案 | 汽车总线协议转换解决方案
汽车总线: 汽车总线是一种用于在车辆电子系统中传输数据和控制信息的通信系统。它允许不同的电子控制单元(ECU)在车辆中相互通信,协调各个系统的操作,以实现功能的集成和协同工作。 在现代汽车中,综合通信…...
Mr. Cappuccino的第59杯咖啡——简单手写SpringIOC框架
简单手写SpringIOC框架 环境搭建基于XML方式项目结构项目代码运行结果 基于注解方式项目结构项目代码运行结果 简单手写SpringIOC框架核心原理基于XML方式原理项目结构项目代码运行结果 基于注解方式原理项目结构项目代码运行结果 环境搭建 基于XML方式 项目结构 项目代码 p…...
爬虫 学习HTML标签和元素的基本概念,了解网页的结构和内容
HTML(Hypertext Markup Language)是一种用于创建网页的标记语言,由一系列的标签组成。标签使用尖括号(< 和 >)包围,并且通常成对出现,一个是开始标签,一个是结束标签。 HTML文…...
mysql将id重新修改为递增
文章目录 场景解决,排序的话可以先按照一定大小改一下,然后将id字段删掉,再重新生成即可清空表数据,并将自增id改为1开始 场景 好比我有个配置表: CREATE TABLE config (id int NOT NULL AUTO_INCREMENT,config_key varchar(20) NOT NULL,config_value varchar(500) NOT NU…...
http、https笔记
目录 HTTP 基本概念状态码:get和post的区别:http 常⻅字段:http的缺点: HTTP/1.1HTTP/3HTTPSHTTPS和HTTP区别对称加密和⾮对称加密⾮对称加密 HTTP 基本概念 状态码: 1xx 中间状态,比如post的continue 20…...
飞凌嵌入式「国产」嵌入式核心板大盘点(三)——龙芯中科、赛昉科技
为了帮助各位工程师朋友详细了解飞凌嵌入式推出的“国产化”产品,小编专门开设了「国产平台大盘点专题」。上周,已经带大家盘点了飞凌嵌入式联合瑞芯微电子和全志科技两个国产处理器品牌打造的平台,今天,将继续为大家介绍龙芯和赛…...
以vue2为例,用npm开发环境在后端部署vue2项目(更推荐使用nginx部署)
因为之前一致出现的跨域问题,从而想到了这个办法,属于偏方。推荐使用nginx部署,再去解决跨域问题。 接下来聊一聊本文所使用的方法。 首先将你的前端vue项目拷贝一份到服务器,准备一个dockerfile文件,用这个进行部署首…...
docker容器监控:Cadvisor +Prometheus+Grafana的安装部署
目录 Cadvisor PrometheusGrafana的安装部署 一、安装docker: 1、安装docker-ce 2、阿里云镜像加速器 3、下载组件镜像 4、创建自定义网络 二、部署Cadvisor 1、被监控主机上部署Cadvisor容器 2、访问cAdvisor页面 三、安装prometheus 1、部署Prometheus…...
前端食堂技术周刊第 93 期:7 月登陆 Web 平台的新功能、Node.js 工具箱、Nuxt3 开发技巧、MF 重构方案
美味值:🌟🌟🌟🌟🌟 口味:橙橙冰萃美式 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 大家好,我是童欧巴。欢迎来到前端食堂技术周刊,我们先来…...
获取 Android 的 SHA1 值
1、调试版,可以直接在 Android studio 中的 gradle 中查看。也可以用下面方法进行 前提要先确定签名文件所在的路径:调试版默认使用的签名文件是debug.keystore,文件处于 C 盘用户目录下的.android文件夹下。打开命令行工具, 1、…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
