基于STM32的风量控制器的Proteus仿真

news2024/11/28 8:33:24

文章目录

  • 一、风量控制器
    • 1.题目要求
    • 2.思路
    • 3.仿真图
    • 4.仿真程序
      • 4.1 程序说明
      • 4.2 主函数
      • 4.2 OLED显示函数
      • 4.3 按键函数
  • 三、总结


一、风量控制器

1.题目要求

设计一个可以风量控制器进行通信的控制板,该控制板由1块OLED显示屏和8个物理按键组成,其中显示屏用来显示当前变风量控制器运行状况及风速。

其中物理按键分别的功能是灯照明开关,风量增大设置,风量减少设置,风机开关,报警开关,节能模块开关,电源开关,静音开关。

2.思路

首先,要有一个OLED显示屏,刚好Proteus里面有IIC的OLED显示屏。显示屏主要用来显示风量的大小,这里我暂定等级大小为0-15级。

然后接8个按键上去进去控制,按键识别为按下引脚识别为低电平,这里注意按键和按键间有一定的逻辑。只有当电源开关开启的时候,其他按键按下才能执行任务;只有当风机开关开启的时候,风量才能增大或者减小。静音模式和报警是相对的,只有当静音模式的时候才能按下报警按键,也只有当报警模式的时候才能按下静音模式按键。

3.仿真图

引脚说明:
主控芯片:STM32F103C8
测试Led:PC13
Uart1:9600(PA9:tx1,PA10:rx1)

OLED显示屏:SCL(PB8),SDA(PB9)

KEY按键:
KEY1(PA0)
KEY2(PA1)
KEY3(PA2)
KEY4(PA3)
KEY5(PA4)
KEY6(PA5)
KEY7(PA6)
KEY8(PA7)

在这里插入图片描述

下面是仿真视频演示:

Air volume controller

4.仿真程序

4.1 程序说明

主控芯片:STM32F103C8
HICK:64MHZ
Systick: 1ms
测试Led:PC13
Uart1:9600(PA9:tx1,PA10:rx1)

OLED显示屏:SCL(PB8),SDA(PB9)

KEY按键:
KEY1(PA0)
KEY2(PA1)
KEY3(PA2)
KEY4(PA3)
KEY5(PA4)
KEY6(PA5)
KEY7(PA6)
KEY8(PA7)

模拟RS485的串口协议如下:

灯照明开关 *KEY1H,H为0:关闭灯照明,H为1:打开灯照明
风量增大设置 *KEY21,风量增大一级,最大15级
风量减少设置 *KEY31,风量减少一级,最小0级
风机开关 *KEY4H,H为0:关闭风机,H为1:打开风机
报警开关 *KEY51,开启报警
节能模式开关 *KEY6H,H为0:关闭节能模式,H为1:开启节能模式
电源开关 *KEY7H,H为0:关闭电源,H为1:开启电源
静音开关 *KEY81,关闭报警,开启静音

注意事项:
默认电源开关和风机开关打开,只有当电源开关开启的时候,其他按键按下才能执行任务;只有当风机开关开启的时候,风量才能增大或者减小。
默认静音模式,非报警,只有当静音模式的时候才能按下报警按键,也只有当报警模式的时候才能按下静音模式按键

4.2 主函数

/* Includes ------------------------------------------------------------------*/
#include "Drv_UserSystem.h"

/**
  * @brief  main function.
  * @param  none
  * @retval none
  */
int main(void)
{
	UserSystemInit();//用户配置初始化		
	while (1)
	{				
		if (stSysTime.flg._10ms + TEN_MILLISECOND < Time_millis()) //10ms
		{
			stSysTime.flg._10ms = Time_millis();	
      Key_Scan();//按键扫描	
			OLED_Handel();//OLED显示			
		}
		if (stSysTime.flg._50ms + FIFTY_MILLISECOND < Time_millis()) //50ms
		{
			stSysTime.flg._50ms = Time_millis();				
		}
		if (stSysTime.flg._100ms + BEST_MILLISECOND < Time_millis()) //100ms
		{
			stSysTime.flg._100ms = Time_millis();	
			Receive_data_Handel();//数据接收判断
			IWDG_ReloadCounter();//清开门狗 
		}
		if (stSysTime.flg._1s + THOUSAND_MILLISECOND < Time_millis()) //1s
		{
			stSysTime.flg._1s = Time_millis();	 
			Led_Flicker();//灯光闪烁 				
	  }
  }
}

4.2 OLED显示函数

/*******************************************************************************
 * 函数名:OLED_Handel
 * 描述  :OLED显示
 * 输入  :void
 * 输出  :void
 * 调用  :初始化
 * 备注  :10ms
*******************************************************************************/
void OLED_Handel(void)
{   
	OLED_ShowString(1, 1, "Air_volume");
    OLED_ShowNum(2,12,Air_volume,2);		
}

/**
  * @brief  OLED显示字符串
  * @param  Line 起始行位置,范围:1~4
  * @param  Column 起始列位置,范围:1~16
  * @param  String 要显示的字符串,范围:ASCII可见字符
  * @retval 无
  */
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String)
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i++)
	{
		OLED_ShowChar(Line, Column + i, String[i]);
	}
}

/**
  * @brief  OLED显示数字(十进制,正数)
  * @param  Line 起始行位置,范围:1~4
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~4294967295
  * @param  Length 要显示数字的长度,范围:1~10
  * @retval 无
  */
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i++)							
	{
		OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0');
	}
}

4.3 按键函数

/*******************************************************************************
 * 函数名:Key_Scan
 * 描述  :按键扫描
 * 输入  :void
 * 输出  :void
 * 调用  :10ms
 * 备注  :
 *******************************************************************************/
void Key_Scan(void)
{
    if(Key7_IN_Read() == 0)//电源开关	
		{
			if(!KeyState.Press7)
			{
				if(KeyState.Key7flag)
				{
					KeyState.Key7flag = 0;
					power_en = 0; 
                    printf("\r\n关闭电源");							
				}
				else
				{
					KeyState.Key7flag = 1;
					power_en = 1;
                    printf("\r\n开启电源");				
				}				
			}
			KeyState.Press7 = 1;
		}		
    else
		{		
			KeyState.Press7 = 0;
		}		
	
		if(power_en)
		{
				if(Key1_IN_Read() == 0)//灯照明开关
				{
					if(!KeyState.Press1)
					{
						if(KeyState.Key1flag)
						{
							KeyState.Key1flag = 0;
							printf("\r\n关闭灯照明");							
						}
						else
						{
							KeyState.Key1flag = 1;
							printf("\r\n打开灯照明");					
						}				
					}
					KeyState.Press1 = 1;
				}		
				else
				{		
					KeyState.Press1 = 0;
				}	
				
				if(Air_blower_en)
				{
						if(Key2_IN_Read() == 0)//风量增大设置
						{
							if(!KeyState.Press2)
							{
								Air_volume++;
								if(Air_volume>15)
								{
									Air_volume = 15;
								}
								printf("Air_volume = %d\r\n",Air_volume);
								printf("\r\n风量增大一级");					
							}
							KeyState.Press2 = 1;
						}		
						else
						{		
							KeyState.Press2 = 0;
						}		
						
						if(Key3_IN_Read() == 0)//风量减少设置
						{
							if(!KeyState.Press3)
							{
								if(Air_volume == 0)
								{
								}
								else
								{
								    Air_volume--;
								}
								printf("Air_volume = %d\r\n",Air_volume);				
								printf("\r\n风量减小一级");			
							}
							KeyState.Press3 = 1;
						}		
						else
						{		
							KeyState.Press3 = 0;
						}
				}		
				
				if(Key4_IN_Read() == 0)//风机开关
				{
					if(!KeyState.Press4)
					{
						if(KeyState.Key4flag)
						{
							KeyState.Key4flag = 0;
							Air_blower_en = 0;
							printf("\r\n关闭风机");							
						}
						else
						{
							KeyState.Key4flag = 1;
							Air_blower_en = 1;
							printf("\r\n打开风机");				
						}				
					}		
					KeyState.Press4 = 1;
				}		
				else
				{		
					KeyState.Press4 = 0;
				}	

				if(Give_an_alarm == 0)
				{					
						if(Key5_IN_Read() == 0)//报警开关	
						{
							if(!KeyState.Press5)
							{
								Give_an_alarm = 1;
								printf("\r\n开启报警");			
							}
							KeyState.Press5 = 1;
						}		
						else
						{		
							KeyState.Press5 = 0;
						}	
			  }
				
				if(Key6_IN_Read() == 0)//节能模式开关
				{
					if(!KeyState.Press6)
					{
						if(KeyState.Key6flag)
						{
							KeyState.Key6flag = 0;
							printf("\r\n关闭节能模式");							
						}
						else
						{
							KeyState.Key6flag = 1;
							printf("\r\n开启节能模式");				
						}				
					}		
					KeyState.Press6 = 1;
				}		
				else
				{		
					KeyState.Press6 = 0;
				}		

				if(Give_an_alarm == 1)
				{					
						if(Key8_IN_Read() == 0)//静音开关	
						{
							if(!KeyState.Press8)
							{
								Give_an_alarm = 0;
								printf("\r\n关闭报警,开启静音");					
							}
							KeyState.Press8 = 1;
						}		
						else
						{		
							KeyState.Press8 = 0;
						}
			  }				
			}				
}

三、总结

今天主要讲了基于STM32的风量控制器的Proteus仿真。

感谢你的观看!

在这里插入图片描述

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

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

相关文章

落雪音乐 超好用的桌面端音乐播放器

之前一直都是充某Q音乐的会员&#xff0c;突然不想氪金了&#xff0c;终于找到一个开源的音乐播放器&#xff0c;在此先给落雪无痕大佬跪了 太爱了 简直白嫖怪的福音 话不多说&#xff0c;直接上操作&#xff1a;解压密码&#xff1a;www.1234f.com下载地址&#xff1a;极速云…

B/S模式的web通信(高并发服务器)

这里写目录标题 目标实现的目标 服务器代码&#xff08;采用epoll实现服务器&#xff09;整体框架main函数init_listen_fd函数&#xff08;负责对lfd初始化的那一系列操作&#xff09;epoll_run函数do_accept函数do_read函数内容补充&#xff1a;http中的getline函数 详解do_re…

DE2-115开发板基于verilog和nioⅡ的流水灯实现

目录 一、 内容概要二、 实现2.1 基于Nios II软核的流水灯2.1.1 准备工作2.1.2 工程搭建2.1.3 硬件代码设计Ⅰ 连接IP核Ⅱ 编写代码Ⅲ 各种配置 2.1.4 软件代码设计Ⅰ 环境构建Ⅱ 编写代码 2.1.5 代码下载Ⅰ 硬件下载Ⅱ 软件下载 2.1.6 运行结果 2.2 Verilog流水灯 三、 心得体…

LORA学习笔记2——训练集处理

前言 对于ai训练来说&#xff0c;处理训练集是模型训练的重要环节。训练集的质量对最终模型的质量影响巨大。这里以二次元角色为例&#xff0c;记录下训练集处理的流程和一些心得。 素材准备 素材准备有以下几个需要注意的点&#xff1a; 通常训练二次元角色需要30张以上的…

栈和队列(栈的详解)

目录 栈栈的实现栈的结构栈的初始化栈的销毁入栈出栈获取栈顶元素栈的判空获取栈的数据个数test.c(测试)总结 栈 栈也是线性表&#xff08;在逻辑上是顺序存储&#xff09;的一种&#xff0c;栈只允许其在固定的一端进行插入和删除&#xff0c;栈中的元素遵循后进先出&#xf…

Linux-笔记 开发板Uboot命令使用

将之前自学的知识整理了一下笔记&#xff0c;以便回忆 信息查询命令 1、help/?&#xff1a;查看所支持命令 > ? md md - memory displayUsage: md [.b, .w, .l] address [# of objects]2、bdinfo&#xff1a;查询板子信息 > bdinfo arch_number 0x00000000 boot_p…

多商户Docker Supervisor进程管理器部署

Dockerfile 根目录下没有Dockerfile的可以复制下面的命令 # 使用基础镜像 FROM leekay0218/crmeb-mer## 复制代码 ## 在本地调试注释掉&#xff0c;使用映射把文件映射进去 #ADD ./ /var/www# 设置工作目录 WORKDIR /var/www# 设置时区为上海 ENV TZAsia/Shanghai RUN ln -sn…

对数据进行标准化和归一化

数据的形式&#xff1a;保存在CSV中&#xff0c;第一列为姓名&#xff0c;第二列之后为特征。 标准化 输入文件的路径&#xff0c;设置保存转化后的文件路径 import pandas as pd from sklearn.preprocessing import StandardScaler# 读取CSV文件 data pd.read_csv(rC:\User…

开发时如何快速分析代码和生成测试方法(Baidu Comate插件帮我一键分析)

目录 前言 Baidu Comate智能编码助手简介 安装教程 使用RabbitMQ一个绑定队列方法进行演示 进行测试现有功能 使用感觉 测试结果 前言 因为在开发代码的时候&#xff0c;发现有很多都是废话也不是很想写注释 的&#xff0c;毕竟程序员最讨厌的两件事情&#xff0c;一…

Hikyuu高性能量化研究框架助力探索

Hikyuu Quant Framework 是一款基于C/Python的开源量化交易分析与研究工具&#xff0c;主要用于A股市场的交易策略分析与回测&#xff0c;目前不支持期货等&#xff0c;需要自行改造。 Hikyuu的目标 Hikyuu的最初目的是为了快速对A股全市场股票进行策略回测和验证&#xff0c…

windows窗口消息队列与消息过程处理函数

在Windows窗口应用程序中&#xff0c;消息队列和窗口过程函数是实现消息驱动机制的核心组件。 消息队列&#xff08;Message Queue&#xff09;&#xff1a; 消息队列是用于存储窗口消息的缓冲区。当用户与应用程序交互时&#xff0c;系统会将生成的消息插入到消息队列中&…

C++11:常用语法汇总

目录 &#x1f341;统一的列表初始化 { }initializer_list &#x1f341;decltype 推导表达式类型&#x1f341;可变参数模板解析可变参数包方法一方法二 &#x1f341;lambda 表达式捕捉列表的使用运用场景举例lambda表达式 与 函数对象 &#x1f341;统一的列表初始化 { } 在…

电商购物系统首页的商品分类

如上图对商品的一个分类实际上和省市区的分类十分类似 , 都是通过自关联的方法来实现 , 但是这里不同的是 , 涉及到外键来获取数据 首先让我们来看一下最后通过后端返回数据的形式是什么样子的 """{1:{channels:[{id:1 , name:手机 , url:},{}{}],sub_cats:[{…

苍穹外卖面试总结

项目介绍 我完成了一个外卖项目&#xff0c;名叫苍穹外卖&#xff0c;是跟着黑马程序员的课程来自己动手写的。 项目基本实现了外卖客户端、商家端的后端完整业务。 商家端分为员工管理、文件上传、菜品管理、分类管理、套餐管理、店铺营业状态、订单下单派送等的管理、数据…

考研数学|强化阶段怎么刷《660》《880》《1000》?

强化阶段想要刷好题&#xff0c;首先要选一本适合自己的题集&#xff01; 一般在强化阶段&#xff0c;大家用多个最多的题集就是660题&#xff0c;880题还有1000题 660题的特点是只训练客观题&#xff0c;虽然题目的质量很高&#xff0c;但是训练面还是比较窄 880题是综合训…

【SpringBoot】 什么是springboot(二)?springboot操作mybatisPlus、swagger、thymeleaf模板

文章目录 SpringBoot第三章1、整合mybatsPlus1-234-67-10问题2、整合pageHelper分页3、MP代码生成器1、编写yml文件2、导入依赖3、创建mp代码生成器4、生成代码5、编写配置类扫描mapper类6、编写控制器类4、swagger1、什么是swagger2、作用3、发展历程4、一个简单的swagger项目…

ADC模-数转换原理与实现

1. 今日摸鱼计划 今天来学习一下ADC的原理&#xff0c;然后把ADC给实现 ADC芯片:ADC128S102 视频&#xff1a; 18A_基于SPI接口的ADC芯片功能和接口时序介绍_哔哩哔哩_bilibili 18B_使用线性序列机思路分析SPI接口的ADC芯片接口时序_哔哩哔哩_bilibili 18C_基于线性序列机的S…

MFC的句柄概念以及句柄类型

在MFC&#xff08;Microsoft Foundation Class&#xff09;桌面应用程序中&#xff0c;窗口是通过句柄&#xff08;Handle&#xff09;来进行管理和操作的。 句柄是一个标识符&#xff0c;用于唯一标识和引用窗口、控件、设备上下文等对象。在MFC桌面应用程序中&#xff0c;常…

mac -- Navicat premium for mac 12的安装破解过程

下载准备好dmg文件&#xff0c;接下来开始安装破解。 镜像在官网下载&#xff0c;复制打开链接可以直接下载&#xff0c;可以直接下载中文版&#xff0c;不需要汉化&#xff1a;&#xff08;下载包不能用&#xff0c;留言我发给你&#xff09; 英文64位&#xff1a; http://dow…

【0003day】VOSviewer分析

这个软件也可以用知网&#xff0c;也可以用web of science。 首先&#xff0c;需要创建数据。这个数据如何创建&#xff0c;需要参考对应的教程。&#xff08;本文以web of science为平台来做分析。&#xff09; 首先&#xff0c;创建对应的数据库。 一直下一步 让后选择完…