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

2024-05-12 16:44

本文主要是介绍基于STM32的风量控制器的Proteus仿真,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、风量控制器
    • 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仿真。

感谢你的观看!

在这里插入图片描述

这篇关于基于STM32的风量控制器的Proteus仿真的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/983172

相关文章

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

perl的学习记录——仿真regression

1 记录的背景 之前只知道有这个强大语言的存在,但一直侥幸自己应该不会用到它,所以一直没有开始学习。然而人生这么长,怎就确定自己不会用到呢? 这次要搭建一个可以自动跑完所有case并且打印每个case的pass信息到指定的文件中。从而减轻手动跑仿真,手动查看log信息的重复无效低质量的操作。下面简单记录下自己的思路并贴出自己的代码,方便自己以后使用和修正。 2 思路整理 作为一个IC d

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品