
有限状态机概念# }1 [) e- W1 A8 | 3 L2 }! F: l0 A3 Z2 N8 q 有限状态机是一种概念思想,把复杂的控制逻辑分解成有限个稳定状态,组成闭环系统,通过事件触发,让状态机按设定的顺序处理事务。单片机C语言的状态机编程,是利用条件选择语句(switch、case或者if、else)切换状态,通过改变状态机状态,让程序按设定的顺序执行。; y4 j7 N$ E, i 有限状态机由有限的状态和相互之间的转移构成,在任何时候只能处于给定数目的状态中的一个。当接收到一个输入事件时,状态机产生一个输出,同时也可能伴随着状态的转移。状态机的原理如下:在当前状态下,发生某个事件后转移到下一个状态,然后决定执行的功能动作。可参考如下示意图: ![]() 要想使用状态机思想进行编程,需要将任务分解成有限个稳定状态。6 b' I! ^" p3 d( z! m# ], F 这里以常见的按键动作进行举例说明: ![]() 状态1 = 按键弹起、 状态2 = 前沿抖动、 状态3 = 按键按下、 状态4 = 后沿抖动。 有限状态机的C代码实现如下: if (定时器 >= 10ms) //10ms是典型消抖时间 { switch (按键状态) {3 b! \7 K& }! g$ Z! h# Z( \ case 按键弹起状态:4 P4 ~$ y9 e% X, S if (IO读取为低电平) 按键状态=前沿抖动; + c* D# w. q+ h3 ^! P break;* m6 J5 R p& o! A case 前沿抖动状态:6 z' X1 c7 j; }: s if (IO读取为低电平) 按键状态=按键按下; g' X0 p/ m" Z7 J1 ] break; case 按键按下状态: if (IO读取为高电平) 按键状态=后沿抖动; 9 c* ~) z1 Q6 l( A k break;" F+ O7 Q8 p" t7 [5 k4 o case 后沿抖动状态: if (IO读取为高电平) 按键状态=按键弹起; break;7 }2 F0 g, C# X' i2 w" u/ X default:按键状态=按键弹起; }. o8 {+ z2 Y3 M* X& f. @ }& N! b c3 ^7 Q3 g 状态机编程建议1 w' a& u3 q5 Z% {5 H0 W 巧妙的使用结构体和枚举一方面可以便于扩展和维护状态机的状态和事件,另一方面可提高程序的可读性。假设有3种状态(状态数可以随意增加),状态枚举如下: typedef enum { state_1=1, state_2,' f; o6 B- U0 X2 u3 a state_3 }State; 假设有5个事件(也可以随意增加),事件枚举如下:+ K6 |" i# C* z' h8 M. d7 x$ k typedef enum{ event_1=1, event_2, event_3, event_4,1 W+ C5 g4 L- ^; ^9 Q' P0 M event_5! X$ F+ M& `. j6 i. \- Q }Event;3 e+ L# c/ i; M0 } * y$ ?; j5 A e! r1 D6 X" `% r5 U 定义一个结构体描述如下: typedef struct {8 c8 P/ H5 i3 G$ R) d State curState; //当前状态 Event eventId; //事件 State nextState; //下一个状态" i# B6 k6 J' M Action action; //动作功能- M9 H, d( `. C/ J* i: I" E }StateEvent;0 D& N7 T% X6 Z4 h9 _* `* E 根据具体的应用场景调整State和Event,并赋予相应的动作功能,整体的基本流程如下:当前状态->有事件触发->跳到下一个状态->具体的动作功能 ![]() |