状态机的介绍

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;
}
相关推荐
FreakStudio10 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
LDR00615 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
✎ ﹏梦醒͜ღ҉繁华落℘15 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
Luminous.15 天前
C语言--day30
c语言·开发语言
玖玥拾15 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
謓泽15 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
不会C语言的男孩15 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
zd84510150015 天前
RS485 总线详解
单片机·嵌入式硬件
2601_9516438815 天前
C语言长文整理,关键字和数据类型
c语言·数据类型·关键字·嵌入式开发·格式化输出
m0_5474866615 天前
《C#语言程序设计与实践》 全套PPT课件
c语言·c#·c语言程序设计