【51单片机系列】DS18B20温度传感器扩展实验之设计一个智能温控系统

news2024/11/28 20:33:42

本文是关于DS18B20温度传感器的一个扩展实验。

文章目录

  • 一、相关元件介绍
  • 二、实验分析
  • 三、proteus原理图设计
  • 四、软件设计

本扩展实验实现的功能:利用DS18B20设计一个智能温度控制系统,具有温度上下限值设定。当温度高于上限值时,电机开启,同时蜂鸣器报警;当温度低于下限值时继电器工作加热,同时蜂鸣器报警,当温度处于上下限间正常工作。

首先系统运行后,可以通过按键设置温度上下限,当按下开始运行按键后温控系统开始工作。默认温度上下限为23~25°C。温控系统开始运行后会在数码管中显示当前温度。

使用到的硬件资源有:

  • 独立按键;
  • 蜂鸣器+ULN2003;
  • 直流电机;
  • 继电器;
  • 共阴极数码管+74HC128+74HC245;
  • DS18B20温度传感器;

一、相关元件介绍

当按键按下时,按键两端管脚电平一致,按键处理时需要延时消抖+二次确认。

要驱动蜂鸣器发声,分为有源蜂鸣器和无源蜂鸣器。对于有源蜂鸣器控制其中一端管脚为高电平或低电平即可发声;对于无源蜂鸣器,需要一定频率的脉冲才可发声。驱动蜂鸣器需要比较大的电流,使用ULN2003芯片实现放大电流的功能。本实验使用有源蜂鸣器。

要驱动直流电机转动,在其一端管脚输入高电平,另一端管脚输入低电平,使直流电机有电流通过即可转动,高低电平在不同位置,仅控制转动的方向。要驱动直流电机也需要比较大的电流,使用ULN2003芯片实现放大电流的功能。

使用一个PNP三极管驱动继电器,添加一个二极管用于保护继电器。

使用74HC138芯片控制数码管的位选,74HC245控制数码管的段选。

DS1302温度传感器是单总线通信,不需要外围元件。具有可编程的分辨率,内含64位的ROM(64位的序列号,识别当前使用的芯片)、一个包含9字节的高速暂存器RAM和一个非易失性可电擦除EEPROM。

不考虑64位ROM序列号,DS1302读取温度过程:初始化→发送CCH命令跳过ROM→发送温度转换命令44H→延时→初始化→发送CCH命令跳过ROM→发送读RAM命令BEH→连续读出数据。

设置温度上下限过程:初始化→发送CCH命令跳过ROM→发送48H命令将RAM2、3字节的内容复制到EEPROM中→延时→初始化→发送CCH命令跳过ROM→发送4EH命令将温度限值写入RAM→发送连个字节的数据。

二、实验分析

本实验实现的是一个温度控制系统,当温度超过设定范围时触发一定操作。温度超过上限时,电机开启同时蜂鸣器报警;温度低于下限时,继电器工作同时蜂鸣器报警;温度处于上下限之间时,系统正常工作。系统通过按键调节上限、下限和工作开始或停止。

本系统的需求包括:

  • 按键控制系统的开始和停止;
  • 按键调节上限和下限;
  • 温度超过范围报警,温度在范围内正常工作;
  • 调节温度上下限时对应的上下限温度会显示在数码管中;
  • 系统工作时的温度实时显示在数码管中;

三、proteus原理图设计

proteus仿真原理图如下。P3.0~P3.3口控制独立按键K1 ~ K4,P3.0 ~ 03.3口为低电平时表示按键按下。K1向上调温度上限,K2向下调温度下限,按K3确定温度的上下限,按K4 温度控制系统开始工作。P3.7口作为温度传感器DS18B20的输入/输出。

通过ULN2003芯片起到放大电流的作用,用来控制蜂鸣器、继电器和直流电机。P1.0控制直流电机,P1.0为高电平时直流电机工作,为低电平时直流电机不工作。P1.5控制蜂鸣器,P1.5为低电平是蜂鸣器不发声,为高电平时蜂鸣器发声。P1.1口控制继电器,P1.1为低电平时继电器工作,为高电平时继电器不工作。

独立按键-温度传感器-蜂鸣器-直流电机-继电器模块

P0口通过74HC245控制数码管的段选,P2.2~P2.4通过74HC138控制数码管的位选。P0口为高电平时,对应数码管的段亮。

共阴极数码管模块

四、软件设计

按键函数处理如下:

void DataPros()
{
	int temp=curTmp*100;
	if(temp<0)
	{
		display[0]=0x40;  // -
	} 
	else
	{
		display[0]=0x00;
	}
	display[1]=smg[temp%10000/1000];
	display[2]=smg[temp%1000/100]|0x80;  // |0x80显示小数点
	display[3]=smg[temp%100/10];
	display[4]=smg[temp%10/1];
	display[5]=0x39;
	
}

// 按键处理函数
void KeyPros()
{
	u8 i;
	// K1上调温度上限
	if(0==K1)
	{
		delay1ms(10);
		if(0 == K1)
		{
			tmpH=tmpH+1;
			if(tmpH>125)
				tmpH=125;
			curTmp=tmpH;
			DataPros();
		}
		while(!K1);
	}
	
	// K2下调温度下限
	if(0==K2)
	{
		delay1ms(10);
		if(0 == K2)
		{
			tmpL=tmpL-1;
			if(tmpL<-55)
				tmpL=-55;
			curTmp=tmpL;
			DataPros();
		}
		while(!K2);
	}
	
	// 按K4,系统开始运行,读取当前温度,判断是否超过温度范围
	if(0==K4)
	{
		delay1ms(10);
		if(0==K4)
		{
			enRead=~enRead;
			if(0==enRead)
			{
				for(i=0;i<8;i++)
				{
					display[i]=0;
				}
			}
		}
		while(!K4);
	}
}

温度处理函数如下:

// 温度处理函数
void TempPros(int temp)
{
	float tp;
	if(temp<0)
	{
		display[0]=0x40;  // -
		temp=temp-1;
		temp=~temp;
		tp=temp;
		temp=tp*0.0625*100+0.5;
	}
	else
	{
		display[0]=0x00;
		tp=temp;
		temp=tp*0.0625*100+0.5;
	}
	
	// 如果温度超过上限,蜂鸣器发声,电机转动
	if((tp*0.0625)>tmpH)
	{
		BEEP=1;
		MOTOR=1;
		RELAY=1;
		
	}
	else if((tp*0.0625)<tmpL)  // 如果温度低于下限,蜂鸣器发声,继电器工作
	{
		BEEP=1;
		MOTOR=0;
		RELAY=0;
	}
	else
	{
		BEEP=0;
		MOTOR=0;
		RELAY=1;
	}
	
	display[1]=smg[temp%10000/1000];
	display[2]=smg[temp%1000/100]|0x80;  // |0x80显示小数点
	display[3]=smg[temp%100/10];
	display[4]=smg[temp%10/1];
	display[5]=0x39;
}

主函数:

void main()
{
	enRead=0;
	BEEP=0;
	MOTOR=0;
	RELAY=1;

	while(1)
	{
		if(0!=enRead)
			TempPros(DS18B20ReadTemp());  // 系统运行时默认数码管不显示,当按了K4时显示实时温度
		KeyPros();
		DigDisplay();
	}
}

仿真结果:

温度控制系统仿真结果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flask之文件管理系统-项目 JRP上线啦!!! ----Bug版

既然单人应用那么就不需要注册、登录了&#xff0c;太麻烦&#xff0c;直接上功能项&#xff0c;而初版太不好看了&#xff0c;略微修改归纳了一下&#xff0c;出了第一版 很有精神&#xff0c;为了纪念&#xff0c;这个网页项目我命名为JRP 主要就是&#xff1a; 1、定义一个类…

Kubernetes之Ingress详解

目录 IngressIngress配置配置写法转发到单个后端服务不同的URL路径被转发到不同的服务上不同的域名转发到不同的服务上不使用域名的转发规则 Ingress Ingress 是 Kubernetes 中的一种 API 对象&#xff0c;用于管理和配置集群中的 HTTP 和 HTTPS 服务路由。 Ingress 可以在 K…

目标检测-One Stage-YOLOv1

文章目录 前言一、YOLOv1的网络结构和流程二、YOLOv1的损失函数三、YOLOv1的创新点总结 前言 前文目标检测-Two Stage-Mask RCNN提到了Two Stage算法的局限性&#xff1a; 速度上并不能满足实时的要求 因此出现了新的One Stage算法簇&#xff0c;YOLOv1是目标检测中One Stag…

如何批量提取pdf文件名到excel?

如何批量提取pdf文件名到excel&#xff1f;在大家整理PDF文档的时候会不会遇到下面这些问题&#xff0c;首先PDF过多&#xff0c;每个PDF文件都有自己的名字&#xff0c;我们想要分类排放的话非常麻烦&#xff0c;不仅耗费时间而且带来的收益非常低&#xff0c;然后即使我们整理…

docker +gitee+ jenkins +maven项目 (一)

jenkins环境和插件配置 文章目录 jenkins环境和插件配置前言一、环境版本二、jenkins插件三、环境安装总结 前言 现在基本都是走自动化运维&#xff0c;想到用docker 来部署jenkins &#xff0c;然后jenkins来部署java代码&#xff0c;做到了开箱即用&#xff0c;自动发布代码…

eBay自养号测评:提升销量与排名的安全可控之道

近年来&#xff0c;eBay平台吸引了大量商家入驻&#xff0c;许多原本在其他平台的卖家也纷纷转型至eBay。然而&#xff0c;许多商家在运营一段时间后发现&#xff0c;新账号的流量扶持期结束后&#xff0c;店铺流量开始下滑。面对这种情况&#xff0c;卖家应该采取哪些措施呢&a…

elasticsearch系列五:集群的备份与恢复

概述 前几篇咱们讲了es的语法、存储的优化、常规运维等等&#xff0c;今天咱们看下如何备份数据和恢复数据。 在传统的关系型数据库中我们有多种备份方式&#xff0c;常见有热备、冷备、全量定时增量备份、通过开发程序备份等等&#xff0c;其实在es中是一样的。 官方建议采用s…

YOLOv5改进 | 2023主干篇 | 华为最新VanillaNet主干替换Backbone实现大幅度长点

一、本文介绍 本文给大家来的改进机制是华为最新VanillaNet网络&#xff0c;其是今年最新推出的主干网络&#xff0c;VanillaNet是一种注重极简主义和效率的神经网络架构。它的设计简单&#xff0c;层数较少&#xff0c;避免了像深度架构和自注意力这样的复杂操作(需要注意的是…

用html,js和layui写一个简单的点击打怪小游戏

介绍&#xff1a; 一个简单的打怪小游戏&#xff0c;点击开始游戏后&#xff0c;出现攻击按钮&#xff0c;击败怪物后可以选择继续下一关和结束游戏。 继续下一个怪兽的血量会增加5点&#xff0c;攻击按钮会随机变色。 效果图&#xff1a; html代码&#xff1a; <!DOCTYPE…

2702 高级打字机

因为Undo操作只能撤销Type操作&#xff0c;所以Undo x 实际上就是删除文章末尾x个字母。用一个栈即可解决&#xff08;每个字母最多进出一次&#xff09;。 这种情况下只需要设计一个合理的数据结构依次执行操作即可。 版本树&#xff1a;Undo x撤销最近的x次修改操作&#xf…

HCIA-Datacom题库(自己整理分类的)——OSPF协议多选

ospf的hello报文功能是 邻居发现 同步路由器的LSDB 更新LSA信息 维持邻居关系 下列关于OSPF区域描述正确的是 在配置OSPF区域正确必须给路由器的loopback接配置IP地址 所有的网络都应在区域0中宣告 骨干区域的编号不能为2 区域的编号范围是从0.0.0.0到255.255.255.255…

《深入理解Java虚拟机(第三版)》读书笔记:Java内存区域与内存溢出异常、垃圾收集器与内存分配策略

下文是阅读《深入理解Java虚拟机&#xff08;第3版&#xff09;》这本书的读书笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 第2章 Java内存区域与内存溢出异常2.2 运行时数据区域2.3 HotSpot虚拟机对象探秘 第3章 垃圾收集器与内存分配策略3.2 对象已死&…

应用在网络摄像机领域中的国产音频ADC芯片

IPC&#xff1a;其实叫“网络摄像机”&#xff0c;是IP Camera的简称。它是在前一代模拟摄像机的基础上&#xff0c;集成了编码模块后的摄像机。它和模拟摄像机的区别&#xff0c;就是在新增的“编码模块”上。模拟摄像机&#xff0c;顾名思义&#xff0c;输出的是模拟视频信号…

Adobe Premier及PrElements各版本安装指南

下载链接 https://pan.baidu.com/s/1FI_Zk4OsyRtx8AiMzgU57w?pwd0531 #2024版 1.鼠标右击【Pr2024(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Pr2024(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Setup】选择【以…

单片机数据发送程序

#include<reg51.h> //包含单片机寄存器的头文件 /***************************************************** 函数功能&#xff1a;向PC发送一个字节数据 ***************************************************/ void Send(unsigned char dat) { SBUFdat; whil…

MFC随对话框大小改变同时改变控件大小

先看一下效果; 初始; 窗口变大,控件也变大; 二个也可以; 窗口变大,控件变大; 默认生成的对话框没有WM_SIZE消息的处理程序;打开类向导,选中WM_SIZE消息,对CxxxDlg类添加该消息的处理程序;默认生成的函数名是OnSize; 添加了以后代码中会有三处变化; 在对话框类的…

使用rsync构建镜像网站

实验环境 某公司在深圳、北京两地各放置了一台网站服务器&#xff0c;分别应对南北大区内不断增长的客户访问需求&#xff0c;两台服务器的网站文档必须保持一致&#xff0c;如图12.3所示&#xff0c;同步链路已通过VPN专用线路实现。 需求描述 > 服务器 A&#xff08;北京…

每日一题:LeetCode-LCR 179. 查找总价格为目标值的两个商品

每日一题系列&#xff08;day 16&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前实时帧率(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的帧率的技术背景Baumer工业相机的帧率获取方式CameraExplorer如何查看相机帧率信息在NEOAPI SDK里通过函数获取相机帧率 Baume…

连接GaussDB(DWS)报错:Invalid or unsupported by client SCRAM mechanisms

用postgres方式连接GaussDB(DWS)报错&#xff1a;Invalid or unsupported by client SCRAM mechanisms 报错内容 [2023-12-27 21:43:35] Invalid or unsupported by client SCRAM mechanisms org.postgresql.util.PSQLException: Invalid or unsupported by client SCRAM mec…