状态机的介绍

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;
}
相关推荐
学逆向的1 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全
QYR-分析4 小时前
汽车碳刷市场深度解析:存量维保支撑需求,电动化重塑行业格局
单片机·嵌入式硬件·汽车
沐欣工作室_lvyiyi4 小时前
基于单片机的升降式立体车库系统设计(论文+源码)
单片机·嵌入式硬件·毕业设计·rfid·单片机毕业设计·数据库设计·物联网毕业设计
Navigator_Z4 小时前
LeetCode //C - 1293. Shortest Path in a Grid with Obstacles Elimination
c语言·算法·leetcode
碧海银沙音频科技研究院5 小时前
基于炬芯ATS3089X的BLE opus音频传输系统设计
stm32·单片机·嵌入式硬件
jeo陽5 小时前
04-循环实战:素数、最大公约数、级数求和与枚举法
c语言·开发语言·数据结构
编程圈子6 小时前
I.MX6U 裸机开发 25. PWM 与 LCD 背光
单片机·嵌入式硬件
创界工坊工作室7 小时前
35-基于AT89C51单片机的罐头生产线传送系统设计
stm32·单片机·嵌入式硬件·51单片机·proteus·生产线
爱读书的小胖7 小时前
LeetCode 88. 合并两个有序数组 C 解题分析
c语言·数据结构·算法
qq_401700417 小时前
MCU串口接收不定长数据的三种方案,哪种最稳?
stm32·单片机·嵌入式硬件