状态机的介绍

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;
}
相关推荐
卢锡荣9 小时前
Type-c OTG数据与充电如何进行交互使用应用讲解
c语言·开发语言·计算机外设·电脑·音视频
v_for_van9 小时前
力扣刷题记录2(无算法背景,纯C语言)
c语言·算法·leetcode
二年级程序员9 小时前
动态内存管理
c语言
我能坚持多久9 小时前
D20—C语言文件操作详解:从基础到高级应用
c语言·开发语言
(❁´◡`❁)Jimmy(❁´◡`❁)10 小时前
CF2188 C. Restricted Sorting
c语言·开发语言·算法
想放学的刺客10 小时前
单片机嵌入式试题(第27期)设计可移植、可配置的外设驱动框架的关键要点
c语言·stm32·单片机·嵌入式硬件·物联网
天昊吖11 小时前
stc8H启用DMA发送后 卡住【踩坑日志】
单片机
李永奉11 小时前
杰理芯片SDK开发-ENC双麦降噪配置/调试教程
人工智能·单片机·嵌入式硬件·物联网·语音识别
BackCatK Chen11 小时前
第 1 篇:软件视角扫盲|TMC2240 软件核心特性 + 学习路径(附工具清单)
c语言·stm32·单片机·学习·电机驱动·保姆级教程·tmc2240
兆龙电子单片机设计11 小时前
【STM32项目开源】STM32单片机多功能电子秤
stm32·单片机·开源·毕业设计·智能家居