【STC15】系统低功耗状态机编程(面向对象思想)
1.【STC15 学习笔记】【转载】51单片机学习教程(简单入门)2.【STC15 学习笔记】Proteus仿真3.【STC15 学习笔记】8051 中断号简介4.【STC15 学习笔记】细说STC15单片机I/O口的四种工作模式5.【STC15】单片机中常说的 1T 和 12T 的意思6.【STC15】面向对象的.h/.c程序架构7.【STC15】内部RAM讲解(data/idata/xdata的区别)&全局变量的保存位置的设定8.【STC15】通过硬件PWM调整灯亮度9.【STC15】CCP PCA PWM区别10.【STC15】前后台方式实现按键的长按检测(面向对象)11.【STC15】实现printf()重定向的可能出现的问题的解决
12.【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
作者:ONE_Day|
合集:
STC15学习笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源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插入图片