【单片机毕业设计】【hj-001】温度控制 | 恒温箱 | 保温箱 | 恒温孵化器 | 环境检测 | 温度检测

news2024/11/24 23:44:58

一、基本介绍

项目名:
基于单片机的温度控制系统设计
基于单片机的恒温箱系统设计
基于单片机的保温箱系统设计
基于单片机的恒温孵化器系统设计
基于单片机的环境检测系统设计
基于单片机的温度检测系统设计

项目编号:mcuclub-hj-001
单片机类型:STC89C52、STM32F103C8T6
具体功能:
1、通过DS18B20测量环境温度,当温度不在设定的上下限值之内时,进行相应的加热制冷,并进行声光报警
2、通过按键设置温度上下限值,可以手动控制加热制冷、切换模式
3、通过显示屏显示数据(STC89C52使用LCD1602,STM32F103C8T6使用OLED)
扩展功能:通过蓝牙模块将测量数据发送到手机端,手机端可以设置温度上下限,并可以远程控制加热制冷、切换模式

二、资料总览

实物资料

请添加图片描述

仿真资料

请添加图片描述

三、51单片机部分资料展示

1、实物图展示

单片机型号:STC89C52
供电接口:TYPE-C
板子类型:PCB集成板,厚度1.2,两层板(上下层覆铜接地)
器件类型:元器件基本上为插针式,个别降压芯片会使用贴片式。
请添加图片描述

2、仿真图展示

仿真软件版本:proteus8.9
电路连线方式:网络标号连线方式
注意:部分实物元器件仿真中没有,仿真中会用其他工作原理相似的元件代替,这样可能导致实物程序和仿真程序不一样
请添加图片描述

3、原理图展示

软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构图
请添加图片描述

4、PCB图展示

由原理图导出,中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。
两层板,上下覆铜接地。
请添加图片描述

四、32单片机部分资料展示

1、实物图展示

单片机型号:STM32F103C8T6
供电接口:TYPE-C
板子类型:PCB集成板,厚度1.2,两层板(上下层覆铜接地)
器件类型:元器件基本上为插针式,个别降压芯片会使用贴片式。
请添加图片描述

2、原理图展示

软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图
请添加图片描述

3、PCB图展示

由原理图导出,中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。
两层板,上下覆铜接地。
请添加图片描述

五、系统框图

绘制软件:VISIO
本设计以单片机为核心控制器,加上其他模块一起组成此次设计的整个系统,其中包括中控部分、输入部分和输出部分。中控部分采用了单片机控制器,其主要作用是获取输入部分的数据,经过内部处理,逻辑判断,最终控制输出部分。输入由三部分组成,第一部分是温度检测模块,通过该模块检测当前环境的温度;第二部分是按键模块,通过该模块可以切换界面、设置阈值、切换模式等;第三部分是供电模块,通过该模块可给整个系统进行供电。输出由三部分组成,第一部分是显示模块,通过该模块可以显示监测的数据以及设置的阈值;第二部分是继电器模块,通过两个继电器分别控制加热和制冷;第三部分是声光报警模块,当监测值不在设置的阈值内时进行声光报警。除此之外,蓝牙模块既作为输入又作为输出,蓝牙模块和手机进行连接,可以将监测的数据传输到用户手机端,用户也可以通过手机端发送指令控制继电器的工作及其模式的切换。具体系统框图如图所示。
请添加图片描述

六、部分程序展示

软件版本:keil5
注意:逻辑程序和驱动程序分开,分布于main.c和其他.c文件

/**********************************
包含头文件
**********************************/
#include "main.h"
#include "lcd1602.h"
#include "key.h"
#include "ds18b20.h"
#include "uart.h"
/**********************************
变量定义
**********************************/
uchar key_num = 0;											//按键扫描标志位			
uchar flag_display = 0;										//显示界面标志位
uint time_num = 0;											//10ms计时变量
uint temp_value = 0;										//温度值
uint temp_max = 30;											//温度最大值
uint temp_min = 20;											//温度最小值
bit flag_mode = 0;											//模式标志位
uchar temp_buf[8];											//温度保存数值
uchar flag_ctrl = 0;										//继电器标志位
uchar fasong_buf[32];										//发送专用数组
bit flag_alarm = 0;									        //报警标志位
 
 
/**********************************
函数声明
**********************************/
void Delay_function(uint x);						//延时函数(ms)
void Key_function(void);							//按键函数
void Monitor_function(void);						//监测函数
void Display_function(void);						//显示函数
void Manage_function(void);							//处理函数
 
 
/****
*******	主函数 
*****/
void main()
{
	Lcd1602_Init();		 										//LCD1602初始化
	Delay_function(50);											//延时50ms
	lcd1602_clean();											//清屏
	Delay_function(50);											//延时50ms
	Ds18b20_Init();												//DS18B20初始化
	Delay_function(50);											//延时50ms	
	Uart_Init();												//串口初始化
	
	while(1)
	{
		Key_function();											//按键函数
		Monitor_function();										//监测函数
		Display_function();										//显示函数
		Manage_function();										//处理函数
 
		Delay_function(10);										//延时10ms
		time_num++;												//计时变量+1
		if(time_num == 5000)
		{
			time_num = 0;
		}
	}
}
 
/****
*******	延时 x ms函数
*****/
void Delay_function(uint x)
{
	uint m,n;
	for(m=x;m>0;m--)
	for(n=110;n>0;n--);
}
 
/****
*******按键函数
*****/
void Key_function(void)
{
	key_num = Chiclet_Keyboard_Scan(0);							//按键扫描
	if(key_num != 0)											//有按键按下
	{
		switch(key_num)
		{
			case 1:												//按键1,切换设置界面
				flag_display++;
				if(flag_display >= 3)
					flag_display = 0;
				lcd1602_clean();								//清屏
			break;
 
			case 2:												//按键2
				switch(flag_display)
				{
					case 0:										//界面0:手动控制加热制冷
						flag_mode = 1;
						flag_alarm = 0;
						flag_ctrl++;
					break;
					
					case 1:										//界面1:温度最大值+1
						if(temp_max < 99)
							temp_max++;
					break;
 
					case 2:										//界面2:温度最小值+1
						if(temp_min < temp_max-1)
							temp_min++;
					break;
 
					default:
					break;
				}
			break;
 
			case 3:												//按键3
				switch(flag_display)
				{
					case 0:										//界面0:切换模式	
						flag_mode = 0;
						flag_ctrl = 0;
					break;
					
					case 1:										//界面1:温度最大值-1
						if(temp_max > temp_min+1)
							temp_max--;
					break;
					
					case 2:										//界面2:温度最小值-1
						if(temp_min > 0)
							temp_min--;
					break;
					
					default:
					break;
				}
			break;
 
			default:
			break;
		}
	}
}
 
/****
*******监测函数
*****/
void Monitor_function(void)
{
	if(time_num % 10 == 0)						//100ms检测一次
	{
		temp_value = Ds18b20_Read_Temp();		//获取温度值
	}
	if(time_num % 300 == 0)						//3000ms发送一次
	{
		sprintf(fasong_buf,"Temp:%d.%dC\r\n",temp_value/10,temp_value%10);
		Uart_Sent_Str(fasong_buf);				//发送温度
	}
}
 
/****
*******显示函数
*****/
void Display_function(void)
{
	switch(flag_display)						//根据不同的显示模式标志位,显示不同的界面
	{
		case 0:									//界面0:	
      lcd1602_display_str(1,0,"Max:");	//显示温度最大值
			sprintf(temp_buf,"%dC ",temp_max);
			lcd1602_display_str(1,4,temp_buf);
 
      lcd1602_display_str(1,8,"Min:");	//显示温度最小值
			sprintf(temp_buf,"%dC ",temp_min);
			lcd1602_display_str(1,12,temp_buf);
 
			lcd1602_display_str(2,0,"Temp:");	//显示温度测量值
			lcd1602_display_temp(2,5,temp_value);	
 
			if(flag_mode == 0)					      //显示模式
				lcd1602_display_str(2,12,"Auto");
			else
				lcd1602_display_str(2,12,"Manu");
		break;
 
		case 1:									//界面1,显示设置最大温度
			lcd1602_display_str(1,2,"Set Temp Max");
			if(time_num % 20 == 0)
			{
				sprintf(temp_buf,"%d",temp_max);
				lcd1602_display_str(2,7,temp_buf);
			}
			if(time_num % 40 == 0)
			{
				lcd1602_display_str(2,7,"    ");
			}
		break;
		
		case 2:									//界面2,显示设置最小温度
			lcd1602_display_str(1,2,"Set Temp Min");
			if(time_num % 20 == 0)
			{
				sprintf(temp_buf,"%d",temp_min);
				lcd1602_display_str(2,7,temp_buf);
			}
			if(time_num % 40 == 0)
			{
				lcd1602_display_str(2,7,"    ");
			}
		break;
 
		default:
		break;
	}
}
 
/****
*******处理函数
*****/
void Manage_function(void)
{
	if(flag_display == 0)										//测量界面
	{
		if(flag_mode == 0)										//自动模式下
		{
			if(temp_value > temp_max*10)						//温度大于设置最大值,制冷继电器闭合
			{
				RELAY_ZL = 0;
				RELAY_JR = 1;
				flag_alarm = 1;
			}
			else if(temp_value < temp_min*10)				//温度小于设置最小值,加热继电器闭合
			{
				RELAY_ZL = 1;
				RELAY_JR = 0;
				flag_alarm = 1;
			}
			else												//温度处于设置的上下限值之间,两个继电器断开
			{
				RELAY_ZL = 1;
				RELAY_JR = 1;
				flag_alarm = 0;
			}
		}
		else													//手动模式根据按键按下控制继电器
		{
      flag_alarm = 0;
			if(flag_ctrl == 1)
			{
				RELAY_JR = 0;
				RELAY_ZL = 1;
			}
			else if(flag_ctrl == 2)
			{
				RELAY_JR = 1;
				RELAY_ZL = 0;
			}
			else
			{
				flag_ctrl = 0;
				RELAY_JR = 1;
				RELAY_ZL = 1;
			}
		}
    if(flag_alarm == 1 && time_num %10 == 0)  	//如果温度有异常,声光报警
		{
			LED = ~LED;
			BEEP = ~BEEP;
		}
    else if(flag_alarm == 0)
    {
      LED = 1;
      BEEP = 1;
    }
	}
	else														//设置界面
	{
		LED = 1;
		BEEP = 1;
		RELAY_ZL = 1;
		RELAY_JR = 1;		
	}
}

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

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

相关文章

Apache Paimon 在同程旅行的实践进展

摘要&#xff1a;本文整理自同程旅行大数据计算组负责人吴祥平&#xff0c;在 Apache Paimon Meetup 的分享。本篇内容主要分为四个部分&#xff1a; 1. Apache Paimon 引入 2. Apache Paimon 应用建设 3. Apache Paimon 优化实践 4. 未来规划和期待 Tips&#xff1a;点击「阅读…

VR虚拟现实素材大全助力开发者实现更加丰富的交互效果

VR虚拟现实素材大全由广州华锐互动开发&#xff0c;在VR虚拟现实项目制作中发挥着至关重要的作用。这些素材库提供了各种类型的3D模型、纹理、材质、灯光和特效&#xff0c;涵盖食品、建筑、汽车、运动、人物、科技等各个领域&#xff0c;使得开发者可以更加方便地构建逼真的虚…

数据库锁表 Lock wait timeout exceeded; try restarting transaction

锁等待超时 Lock wait timeout exceeded; try restarting transaction&#xff0c;是当前事务在等待其它事务释放锁资源造成的 解决办法 1、数据库中执行如下sql&#xff0c;查看当前数据库的线程情况&#xff1a; show full PROCESSLIST2、再到 INNODB_TRX 事务表中查看&…

一文教你如何创建 Python 虚拟环境

目录 前言一、配置虚拟环境1.1 Windows1.2 Linux 二、常用管理命令三、FAQ 前言 其实这都是 Python 基础该掌握的&#xff0c;今天博客记录一下&#xff0c;方便自己或其他人阅读。虚拟环境的好处在于达到环境上的隔离&#xff0c;如&#xff1a;不同的项目有自己独特的环境&a…

Spring Boot 统一功能处理(拦截器实现用户登录权限的统一校验、统一异常返回、统一数据格式返回)

目录 1. 用户登录权限校验 1.1 最初用户登录权限效验 1.2 Spring AOP 用户统⼀登录验证 1.3 Spring 拦截器 &#xff08;1&#xff09;创建自定义拦截器 &#xff08;2&#xff09;将自定义拦截器添加到系统配置中&#xff0c;并设置拦截的规则 1.4 练习&#xff1a;登录…

app测试和web测试的区别是什么?【软件测试经典面试题】

单纯从功能测试的层面上来讲的话&#xff1a; APP 测试、web 测试 在流程和功能测试上是没有区别的。 1.系统架构方面&#xff1a; web项目&#xff0c;一般都是b/s架构&#xff0c;基于浏览器的 app项目&#xff0c;则是c/s的&#xff0c;必须要有客户端&#xff0c;用户需…

AI绘画(1)stable diffusion安装教程

1、引言 stable diffusion 是一款免费开源的AI绘画工具&#xff0c;它能够帮助任何人轻松地进行绘画创作。不论你是有绘画基础还是完全没有经验&#xff0c;stable diffusion 都能让你在数字画布上释放创造力。 stable diffusion 提供了丰富多样的绘画工具和选项&#xff0c;…

公会在tiktok发展,有哪些国家,怎么入驻呢?

在秀场直播领域&#xff0c;众多公会都将目光聚焦在TikTok上。TikTok已成为一个新的金矿&#xff0c;许多公会已在这个平台上赚得盆满钵满。 这些公会在TikTok上月流水达到数百万美元&#xff0c;甚至在一场PK中流水达到40万美元&#xff0c;分成比例高达80%。TikTok的秀场直播…

PostGIS 矢量瓦片

title: PostGIS 矢量瓦片 date: 2023-08-07 author: ac tags: vector tile categories:Database Martin - 基于PostGIS的矢量瓦片服务器 1. 简介 目前流行的矢量瓦片的切图方案&#xff1a; mapbox gl tippecanoe &#xff1a;v2收费&#xff0c;tippecanoe是mapbox官方推…

【C语言】结构体详解

现实生活中一个事物&#xff0c;会有许多属性连接起来。而C语言引入一种构造数据类型——结构体 将属于一个事物的多个数据组织起来以体现其内部联系。 一、结构体类型的定义 结构体类型 是一种 构造类型&#xff0c;它是由若干成员组成的&#xff0c;每个成员可以是一个基本…

python:使用geopandas和rasterio将矢量范围内的栅格值赋为0并重新输出

需求&#xff1a;有一个点shp文件和一个栅格&#xff0c;想要构建shp中每个点的缓冲区&#xff0c;并且缓冲区范围内的栅格值重新赋为0并输出新的tif文件 解决方法&#xff1a;使用python中的geopandas和rasterio中的掩膜操作实现 代码如下&#xff1a; import numpy as np …

数据结构(一):顺序表详解

在正式介绍顺序表之前&#xff0c;我们有必要先了解一个名词&#xff1a;线性表。 线性表&#xff1a; 线性表是&#xff0c;具有n个相同特性的数据元素的有限序列。常见的线性表&#xff1a;顺序表、链表、栈、队列、数组、字符串... 线性表在逻辑上是线性结构&#xff0c;但…

【验证码逆向专栏】最新某度旋转验证码 v2 逆向分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…

使用requests如何实现自动登录

不知道大家有没有注意到&#xff0c;好多网站我们登录过后&#xff0c;在之后的某段时间内访问该网页时&#xff0c;不会给出请登录的提示&#xff0c;时间到期后就会提示请登录&#xff01;这样在使用爬虫访问网页时还要登录&#xff0c;打乱我们的节奏&#xff0c;那么如何使…

ISC 2023 大会成功举办,向量数据库公司 Zilliz 成大模型论坛焦点

近日,第十一届互联网安全大会(ISC 2023)在北京盛大开幕。大会由 ISC 互联网安全大会组委会、中国互联网协会、中国网络空间安全协会、全国工商联大数据运维(网络安全)委员会、中国人工智能学会、中国软件行业协会、中国企业联合会、360 互联网安全中心主办;中国通信企业协…

使用阿里云服务器部署和使用GitLab

本文阿里云百科分享使用阿里云服务器部署和使用GitLab&#xff0c;GitLab是Ruby开发的自托管的Git项目仓库&#xff0c;可通过Web界面访问公开的或者私人的项目。本教程介绍如何部署和使用GitLab。 目录 准备工作 部署GitLab环境 使用GitLab 登录GitLab 生成密钥对文件并…

HoloLens 2设备MR 应用交互设计

AR 眼镜实现了虚拟世界与现实世界的融合&#xff0c;完成屏幕的“跨越”&#xff0c;人机交互设计也从二维平面迈向三维世界。目前&#xff0c;MR 应用的人机交互界面仍然处于早期发展阶段&#xff0c;各种理念和方法仍处于逐步形成与应用阶段&#xff0c;低成本地完成使用者从…

记录一下Java实体转json字段顺序问题

特殊需求&#xff0c;和C交互他们那边要求字段顺序要和他们定义的一致(批框架) 如下&#xff1a; Data public class UserDto {private String name;private Integer age;private String addr; }未转换前打印&#xff1a; 转换后打印&#xff1a; 可以看到转换为json顺序打印…

第9届Python编程挑战赛北京赛区复赛真题剖析-2023年全国青少年信息素养大赛

[导读]&#xff1a;超平老师计划推出《全国青少年信息素养大赛Python编程真题解析》50讲&#xff0c;这是超平老师解读Python编程挑战赛系列的第16讲。 全国青少年信息素养大赛&#xff08;原全国青少年电子信息智能创新大赛&#xff09;是“世界机器人大会青少年机器人设计与…

Spring与Spring Bean

Spring 原理 它是一个全面的、企业应用开发一站式的解决方案&#xff0c;贯穿表现层、业务层、持久层。但是 Spring 仍然可 以和其他的框架无缝整合。 Spring 特点 轻量级 控制反转 面向切面 容器 框架集合 Spring 核心组件 Spring 总共有十几个组件核心容器(Spring core) S…