状态机的介绍

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;
}
相关推荐
清风6666664 小时前
基于单片机的噪声波形检测与分贝测量仪设计
单片机·嵌入式硬件·毕业设计·课程设计
Neverfadeaway4 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
一碗绿豆汤4 小时前
c语言-流程控制语句
c语言
易享电子5 小时前
基于单片机车窗环境监测控制系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·fpga开发·51单片机·proteus
子牙老师5 小时前
从零手写gdb调试器
c语言·linux内核·gdb·调试器
三佛科技-134163842125 小时前
LED氛围灯方案开发MCU控制芯片
单片机·嵌入式硬件·智能家居·pcb工艺
小莞尔6 小时前
【51单片机】【protues仿真】基于51单片机主从串行通信系统
c语言·单片机·嵌入式硬件·物联网·51单片机
Hello_Embed6 小时前
STM32 环境监测项目笔记(一):DHT11 温湿度传感器原理与驱动实现
c语言·笔记·stm32·单片机·嵌入式软件
三佛科技-134163842127 小时前
便携式榨汁机方案开发,榨汁机果汁机MCU控制方案设计
单片机·嵌入式硬件·智能家居·pcb工艺