状态机的介绍

1、有限状态机

(1)常说的状态机是有限状态机FSM。

  • 有限状态机即状态数量是有限的,一般用状态变量的不同值表示不同状态。
  • 状态机同时能够从外部接收信号,机器在接收到外部输入的信号后会综合考虑当前自己的状态,然后机器做出动作:跳转到另一个状态。

(2)考虑状态机的关键点:当前状态、外部输入、下一个状态

2、两种状态机:Moore型和Mealy型

状态机主要分为 有限状态机(FSM)无限状态机(ISM) ,但 无限状态机 在实际工程中几乎不用(因为无法建模和验证),所以我们通常说的"状态机"默认是 有限状态机(FSM)。有限状态机(FSM)的 2 种主流形式:Moore型和Mealy型

(1)Moore型

  • 输出只取决于当前状态。
  • 相对简单,考虑状态机的下一个状态时只需要考虑它的当前状态就行了。

(2)Mealy型

  • 输出取决于当前状态 + 输入
  • 状态机接收到一个输入信号需要跳转到下一个状态时,状态机综合考虑2个条件(当前状态、输入值)后才决定跳转到哪个状态。

3、状态机的主要用途:电路设计、FPGA程序设计、软件设计

(1)电路设计中广泛使用了状态机思想。

(2)FPGA程序设计。

(3)软件设计

4、C语言实现简单的状态机

(1)题目:开锁状态机。用户连续输入正确的密码则会开锁,如果密码输入过程错误则锁会退回到初始状态重新计入密码,即:用户只需要连续输入出正确的密码即可开锁(输入错误不用撤销、也不用删除)

(2)程序

复制代码
#include <stdio.h>
#include <ctype.h>

// 定义状态枚举
typedef enum
{
    STATE_START,    // 初始状态
    STATE_1,        // 已输入1位正确密码
    STATE_2,        // 已输入2位正确密码
    STATE_3,        // 已输入3位正确密码
    STATE_UNLOCKED  // 开锁成功状态
} State;

int main()
{
    // 预设密码(可修改)
    const char *password = "1234";
    const int password_length = 4;

    State current_state = STATE_START;  // 初始状态
    int input_char;

    printf("请输入%d位数字密码(输入错误会重置,连续正确即可开锁):\n", password_length);

    while (1)
    {
        input_char = getchar();  // 读取用户输入

        // 跳过换行符(允许用户按回车提交)
        if (input_char == '\n')
            continue;

        // 非数字字符处理:重置状态机
        if (!isdigit(input_char))
        {
            current_state = STATE_START;
            continue;
        }

        // 状态转移逻辑
        switch (current_state)
        {
            case STATE_START:
                current_state = (input_char == password[0]) ? STATE_1 : STATE_START;
                break;
            case STATE_1:
                current_state = (input_char == password[1]) ? STATE_2 : STATE_START;
                break;
            case STATE_2:
                current_state = (input_char == password[2]) ? STATE_3 : STATE_START;
                break;
            case STATE_3:
                current_state = (input_char == password[3]) ? STATE_UNLOCKED : STATE_START;
                break;
            case STATE_UNLOCKED:
                // 保持开锁状态不变
                break;
        }

        // 检测开锁成功
        if (current_state == STATE_UNLOCKED)
        {
            printf("开锁成功!\n");
            return 0;  // 程序退出
        }
    }

    return 0;
}
相关推荐
祈安_3 天前
C语言内存函数
c语言·后端
norlan_jame5 天前
C-PHY与D-PHY差异
c语言·开发语言
czy87874755 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
m0_531237175 天前
C语言-数组练习进阶
c语言·开发语言·算法
Lester_11015 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
三佛科技-187366133975 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315205 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
Z9fish5 天前
sse哈工大C语言编程练习23
c语言·数据结构·算法
代码无bug抓狂人5 天前
C语言之单词方阵——深搜(很好的深搜例题)
c语言·开发语言·算法·深度优先