关注、星标公众号,直达精彩内容
文章来源:头条-嵌入式在左C语言在右
链接:https://www.toutiao.com/i6843028812112855564/
有限状态机概念有限状态机是一种概念思想,把复杂的控制逻辑分解成有限个稳定状态,组成闭环系统,通过事件触发,让状态机按设定的顺序处理事务。单片机C语言的状态机编程,是利用条件选择语句(switch
、case
或者if
、else
)切换状态,通过改变状态机状态,让程序按设定的顺序执行。
有限状态机由有限的状态和相互之间的转移构成,在任何时候只能处于给定数目的状态中的一个。当接收到一个输入事件时,状态机产生一个输出,同时也可能伴随着状态的转移。状态机的原理如下:在当前状态下,发生某个事件后转移到下一个状态,然后决定执行的功能动作。可参考如下示意图:
要想使用状态机思想进行编程,需要将任务分解成有限个稳定状态。
这里以常见的按键动作进行举例说明:
上图为按键典型的动作图,可以分解为四个状态,分别为:
状态1 = 按键弹起、
状态2 = 前沿抖动、
状态3 = 按键按下、
状态4 = 后沿抖动。
有限状态机的C代码实现如下:
if (定时器 >= 10ms) //10ms是典型消抖时间
{
switch (按键状态)
{
case 按键弹起状态:
if (IO读取为低电平) 按键状态=前沿抖动;
break;
case 前沿抖动状态:
if (IO读取为低电平) 按键状态=按键按下;
break;
case 按键按下状态:
if (IO读取为高电平) 按键状态=后沿抖动;
break;
case 后沿抖动状态:
if (IO读取为高电平) 按键状态=按键弹起;
break;
default:按键状态=按键弹起;
}
}
状态机编程建议
巧妙的使用结构体和枚举一方面可以便于扩展和维护状态机的状态和事件,另一方面可提高程序的可读性。假设有3种状态(状态数可以随意增加),状态枚举如下:
typedef enum {
state_1=1,
state_2,
state_3
}State;
假设有5个事件(也可以随意增加),事件枚举如下:
typedef enum{
event_1=1,
event_2,
event_3,
event_4,
event_5
}Event;
定义一个结构体描述如下:
typedef struct {
State curState; //当前状态
Event eventId; //事件
State nextState; //下一个状态
Action action; //动作功能
}StateEvent;
根据具体的应用场景调整State
和Event
,并赋予相应的动作功能,整体的基本流程如下:当前状态->有事件触发->跳到下一个状态->具体的动作功能
总结
状态机应用很广泛,也可以锻炼逻辑思维,LoRa消息推送也常采用状态机的思想, 实际上状态机涉及的知识点很多,本篇文章只是简要的介绍了下单片机C语言的状态机编程思想,在日后的开发设计中,需要不断的总结经验并灵活应用。
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?


微信扫码登录