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;
}

但是这样虽然能维护好单总线的通信,但这样直接屏蔽中断却会影响定时器的计时准确度,从而对定时器控制的其他模块造成影响,这也就是单总线的一大缺点,不过在这个实例中,按键的定时器准度要求并不高,所以这样控制影响不大

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/81218.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM之类加载与字节码(一)

1.类文件结构 一个简单的HelloWorld.Java package cn.itcast.jvm.t5; // HelloWorld 示例 public class HelloWorld { public static void main(String[] args) { System.out.println("hello world"); } }编译为 HelloWorld.class 后的样子如下所示&#xff1a; […

ChatGPT发展到了什么程度?代码生成,程序员将被取代?

前言 ChatGPT 是一个基于人工智能的聊天机器人&#xff0c;由 OpenAI 开发。ChatGPT 的历史可以追溯到早期的语言模型&#xff0c;例如循环神经网络 (RNN) 和长短时记忆网络 (LSTM)。如今的 ChatGPT-3 则是最新的版本。 ChatGPT发展到了什么程度&#xff1f;代码生成&#xff0…

自动化处理,web自动化测试处理多窗口+切换iframe框架页总结(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 web 自动化之处理…

【高级程序设计语言C++】红黑树

1. 红黑树的概念2. 红黑树的插入2.1. 情况12.2. 情况22.3. 情况32.4. 插入情况小总结 3. 红黑树与AVL树的对比4. 红黑树在线生成网站 1. 红黑树的概念 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树&#xff0c;它在插入和删除操作时通过调整节点的颜…

Scrum是什么意思,Scrum敏捷项目管理工具有哪些?

一、什么是Scrum&#xff1f; Scrum是一种敏捷项目管理方法&#xff0c;旨在帮助团队高效地开展软件开发和项目管理工作。 Scrum强调迭代和增量开发&#xff0c;通过将项目分解为多个短期的开发周期&#xff08;称为Sprint&#xff09;&#xff0c;团队可以更好地应对需求变…

FFmpeg常见命令行(二):FFmpeg转封装

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个&#xff0c; 对应的要学习的内容是&#xff1a;如何使…

HttpRunner自动化测试之脚手架工具使用(一键搭建)

脚手架工具使用&#xff1a; 每一个成熟的系统工具&#xff0c;都会有对应的脚手架工具&#xff0c;它可以快速构建项目的必要目录&#xff0c;不必自己一个一个的配置与搭建&#xff0c;只需要执行一些命令即可。 httprunner也提供了脚手架工具&#xff0c;使用步骤如下&…

通过Idea部署Tomcat服务器(详细图文教学)

1.在idea中创建项目 有maven构建工具就创建maven&#xff0c;没有就正常创建一个普通的java程序 创建普通java项目 2.添加框架 3.配置 Tomcat 注意&#xff1a;创建web项目后我们需要配置tomcat才能运行&#xff0c;下面我们来进行配置。 4.添加部署 回到服务器 5.完善配置 6…

Excel表格(一)

1.单一栏的宽度和高度设置 2.大标题的跨栏居中 3.让单元格内的文字------自动适应 4.序号递增 5.货币符号 6.日期格式的选择 选到单元格&#xff0c;选中对应的日期格式 7.自动求和的计算 然后在按住回车键即可求出当前行的金额 点击自动求和 8.冻结表格栏 9.排序 1.单栏排序 …

【redis】SpringBoot集成redis

目录 1.添加redis依赖2.配置redis3.操作redis3.1 操作string 3.1 操作其它数据类型 4. Spring-Session基于Redis解决共享Session问题4.1 问题提出 4.1 添加依赖 4.2 修改配置4.3 存储和读取 1.添加redis依赖 方法①&#xff1a; <dependency><groupId>org.springf…

WordPress 子主题(child theme)介绍

经常开发WordPress主题的朋友往往会遇到一个困惑&#xff0c;虽然主题提供了默认设置&#xff0c;也自带了不少自定义功能&#xff0c;可以满足大部分的场景使用&#xff0c;但毕竟众口难调&#xff0c;一些个性化的需求难免无法满足&#xff0c;这时就必须得修改主题文件来实现…

【动态规划刷题 5】 最小路径和地下城游戏

最小路径和 链接: 64. 最小路径和 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 输入&#xff1a;grid [[1,3,1],[1,5,1],[4,2,1]] 输…

使用 PowerShell 将 Excel 中的每个工作表单独另存为独立的文件

导语&#xff1a;在日常工作中&#xff0c;我们经常需要处理 Excel 文件。本文介绍了如何使用 PowerShell 脚本将一个 Excel 文件中的每个工作表单独另存为独立的 Excel 文件&#xff0c;以提高工作效率。 1. 准备工作 在开始之前&#xff0c;请确保已经安装了 Microsoft Exc…

Cocos基本介绍

一、下载Dashboard Cocos Creator 3.8 手册 - 安装和启动 二、编辑器结构 1.资源管理器&#xff1a;显示了项目资源文件夹(assets)中的所有资源 2.场景编译器&#xff1a;用于展示和编辑场景中可是内容的工作区域 3.层级管理器&#xff1a;用树状列表的形式展示场景中的所有…

pytest测试框架之fixture测试夹具详解

fixture的优势 ​ pytest框架的fixture测试夹具就相当于unittest框架的setup、teardown&#xff0c;但相对之下它的功能更加强大和灵活。 命名方式灵活&#xff0c;不限于unittest的setup、teardown可以实现数据共享&#xff0c;多个模块跨文件共享前置后置可以实现多个模块跨…

【AutoLayout案例1-按钮居中显示 Objective-C语言】

一、按钮居中显示 1.接下来,我们就用这个autoLayout,自动布局,给大家写一个,实现几个案例,给大家看一下 那么,首先,第一个,大家注意, 当我们使用autoLayout,自动布局的时候,我们新建一个项目, 这个新建的项目,里面有一个控制器,这个控制器,是不是默认,是四四…

FreeRTOS通过消息队列实现串口命令解析(串口中断)

作者&#xff1a;Jack_G 时间&#xff1a;2023.08.08 版本&#xff1a;V1.0 上次修改时间&#xff1a; 环境&#xff1a; \quad \quad \quad \quad STM32Cube MX V6.8.1 \quad \quad \quad \quad STM32CubeH7 Firmware Package V1.11.0 / 04-Nov-2022 \quad \quad \quad \qu…

创意项目管理软件推荐:满足客户需求的完美解决方案

发现功能强大的工作管理软件&#xff0c;让创意大放异彩。将您团队的愿景变成引人注目的项目。 一、交付总是令人印象深刻的工作 Zoho Projects的创意项目管理软件可帮助您和您的团队在一个地方监督多个项目。使用我们的内置管理工具和模板&#xff0c;花更少的时间在管理上&a…

【福建事业单位-推理判断】02图形推理(数量-空间重构)

【福建事业单位-推理判断】02图形推理&#xff08;数量-空间重构&#xff09; 一、数量规律1.1点&#xff08;交点、切点&#xff09;点的细化考法总结 1.2线条&#xff08;线条的数量&#xff09;线的细化考点一笔画&#xff08;重点&#xff09;一笔画的判定 总结 1.3 面面的…

Ajax同源策略及跨域问题

Ajax同源策略及跨域问题 同源策略ajax跨域问题什么是跨域&#xff1f;为什么不允许跨域&#xff1f;跨域解决方案1、CORS2、express自带的中间件cors3、JSONP原生JSONPjQuery发送JSONP 4、使用vscode的Live Server插件 同源策略 同源策略&#xff08;Same-Origin Policy&#…