什么是状态机,用c语言写一个例子并解释
时间: 2024-03-06 09:48:22 浏览: 24
状态机是一种常用的编程模型,用于描述系统或程序的不同状态和状态之间的转移关系。它通常由一组状态和一组事件触发器组成,状态之间会根据触发器的输入不断地进行转移。状态机可以用于许多场景,比如嵌入式系统、游戏引擎、自动控制等。
下面是一个使用C语言实现简单状态机的例子,该状态机模拟了一个灯的开关控制器:
```c
#include <stdio.h>
#include <stdbool.h>
// 定义状态枚举
typedef enum {
STATE_OFF,
STATE_ON,
STATE_BLINKING,
} State;
// 定义事件枚举
typedef enum {
EVENT_POWER_ON,
EVENT_POWER_OFF,
EVENT_BUTTON_PRESSED,
EVENT_TIMEOUT,
} Event;
// 定义状态机结构体
typedef struct {
State state;
bool blinking_on;
int blink_counter;
} StateMachine;
// 状态转移函数
void state_transition(StateMachine* sm, Event event) {
switch (sm->state) {
case STATE_OFF:
if (event == EVENT_POWER_ON) {
sm->state = STATE_ON;
}
break;
case STATE_ON:
if (event == EVENT_BUTTON_PRESSED) {
sm->state = STATE_BLINKING;
sm->blinking_on = true;
sm->blink_counter = 0;
} else if (event == EVENT_POWER_OFF) {
sm->state = STATE_OFF;
}
break;
case STATE_BLINKING:
if (event == EVENT_BUTTON_PRESSED) {
sm->state = STATE_ON;
sm->blinking_on = false;
} else if (event == EVENT_TIMEOUT) {
sm->blinking_on = !sm->blinking_on;
sm->blink_counter++;
if (sm->blink_counter >= 10) {
sm->state = STATE_ON;
sm->blinking_on = false;
}
}
break;
}
}
// 主函数
int main() {
StateMachine sm = {STATE_OFF, false, 0};
printf("State machine started.\n");
// 模拟事件触发
state_transition(&sm, EVENT_POWER_ON);
state_transition(&sm, EVENT_BUTTON_PRESSED);
for (int i = 0; i < 20; i++) {
state_transition(&sm, EVENT_TIMEOUT);
}
state_transition(&sm, EVENT_BUTTON_PRESSED);
state_transition(&sm, EVENT_POWER_OFF);
printf("State machine stopped.\n");
return 0;
}
```
在上述代码中,状态机由三个状态和四个事件触发器组成。事件触发器包括:电源开启(EVENT_POWER_ON)、电源关闭(EVENT_POWER_OFF)、按键按下(EVENT_BUTTON_PRESSED)和超时(EVENT_TIMEOUT)。状态机的状态包括:关闭(STATE_OFF)、开启(STATE_ON)和闪烁(STATE_BLINKING)。当电源打开时,状态机进入开启状态;当按下按键时,状态机进入闪烁状态,并开始闪烁灯;当超时时,灯会闪烁10次后停止,并返回到开启状态;当再次按下按键时,灯停止闪烁,状态机返回到开启状态;当电源关闭时,状态机返回到关闭状态。
总之,状态机是一种非常常用的编程模型,可以方便地描述系统或程序的状态和状态之间的转移关系。通过使用状态机,程序可以更加清晰、简洁地表达其逻辑,易于维护和扩展。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)