【STC15】系统低功耗状态机编程(面向对象思想)

系统流程图

如果产品有低功耗,则可以使用这个系统框架,根据系统状态位切换系统状态,分为系统运行和系统待机两个状态

程序

程序主要由 main.c 和 system.c 组成。

main.c
#include "system.h"
extern System_t System;//System_t 对象

/*
* @name   main
* @brief  主函数
* @param  void	
* @retval int      
*/
int main(void)
{
	//系统初始化
	Hradware.Sys_Init();

	//串口1发送初始化信息
	#ifdef Monitor_Run_Code //因为public.h中没有预编译宏定义Monitor_Run_Code,所以不会往串口输出信息,而且这些本就是调试信息,在出产品时是不需要的
		printf("Initialization completed,system startup!\r\n\r\n");
	#endif
	
	//系统主循环
	while(1)
	{
		if(System.ucSystem_Statues == System_Run)
		{
			System.Run();		//系统运行
		}
		else
		{
			System.StandBy();	//系统待机
		}
	}
}
System.h

System.h 主要包含对 System_t 类的定义。

typedef struct 
{
    void (*Run)(void);    //正常工作时的任务
    void (*Standby)(void);//待机模式下的任务
}System_t;
System.c

系统运行函数Run(),系统正常运行时,所执行的功能

#include "system.h"


static void Run();
static void Halt();

/*初始化 System_t 对象成员*/
System_t System =
{
    Run,
    Halt
};


/*
* @name   Run
* @brief  系统运行
* @param  None
* @retval None   
*/
static void Run()
{
    static uint16_t i = 0;
    //获取PCB板温度
    NTC.Get_Temperature_Value();
    //数码管显示温度
    TM1620.Disp_Tempareture();

    //按键2双击
    if(KEY2.Double_Click == TRUE)
    {
        KEY2.Double_Click = FALSE;
        //连接TCP服务器
        ESP8266.TCP_Connect_Server();
    }
    //接收TCP服务器信息
    ESP8266.Receive_Information();
    //将温度通过TCP传到服务器
    ESP8266.Transfer_Tempareture(NTC.fTemperature);

    i = 500;
    while(i--)
    {
        Public.Delay_ms(1);
        //状态机扫描按键2
        KEY2.KEY_Detect();

        if(UART1.ucRec_Flag == TRUE)
        {
            break;
        }
        if(KEY1.KEY_Flag == TRUE)
        {
            break;
        }
        if(KEY2.KEY_Flag == TRUE)
        {
            break;
        }
    }
    //按键1检测,长按2S进入待机模式
    KEY1.KEY_Detect();
    //模块配网
    ESP8266.SmartConfig();
    //按键1触发调整PWM灯亮度
    PWM.PWM_LED_Adjust_Brightness();
    //串口1协议解析
    UART1.Protocol();
}

系统进入停机模式函数Halt(),由StandBy()函数调用;

/*
* @name   Halt
* @brief  系统停机模式,只能外部中断唤醒
* @param  None
* @retval None   
*/
static void Halt()
{
    //串口打印调试信息
    #ifdef Monitor_Run_Code
        printf("The MCU enter halt mode!\r\n\r\n");
    #endif

    //喂狗
    WatchDog.Feed();
}

 

 

参考资料:

转载自:https://blog.csdn.net/weixin_46251230/article/details/126684103

作者:

posted @   FBshark  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2023-11-12 【低功耗蓝牙BLE】2-Generic Access Profile(GAP)协议
2023-11-12 markdown插入图片
点击右上角即可分享
微信分享提示