先来看一下状态机的定义:
状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为FSM(Finite State Machine),主要分为2大类:
第一类,若输出只和状态有关而与输入无关,则称为Moore状态机
第二类,输出不仅和状态有关而且和输入有关系,则称为Mealy状态机
考虑状态机的关键点:当前状态、外部输入、下一个状态
状态机的主要用途:电路设计、FPGA程序设计、软件设计
- 电路设计中广泛使用了状态机思想
- FPGA程序设计
- 软件设计(框架类型的设计,譬如操作系统的GUI系统、消息机制)
状态机解决了什么问题:
一般的程序都是顺序执行,这种程序有个特点是程序的大体执行流程是既定的,程序的执行是遵照一定的大的方向有迹可寻的。但是偶尔会碰到这样的程序:外部不一定会按照既定流程来给程序输入信息,而程序还需要完全能够接收并响应外部的这些输入信号,还要能做出符合逻辑的输出。
用C语言实现简单的状态机:
题目:开锁状态机。功能描述:用户连续输入正确的密码则会开锁,如果密码输入过程错误则锁会退回到初始状态重新计入密码,即:用户只需要连续输入出正确的密码即可开锁(输入错误不用撤销、也不用删除)
#include <stdio.h>
typedef enum // 定义状态机的状态集
{
STATE1,
STATE2,
STATE3,
STATE4,
STATE5,
STATE6,
STATE7,
}STATE;
int main(void)
{
int num = 0;
STATE state = STATE1;
printf("Please enter the password, continue to enter the correct lock.\n");
while(1)
{
scanf("%d", &num);
printf("The number you entered is:%d\n", num);
switch(state)
{
case STATE1:
if(num == 1)
{
state = STATE2;
}
else
{
state = STATE1;
}
break;
case STATE2:
if(num == 2)
{
state = STATE3;
}
else
{
state = STATE1;
}
break;
case STATE3:
if(num == 3)
{
state = STATE4;
}
else
{
state = STATE1;
}
break;
case STATE4:
if(num == 4)
{
state = STATE5;
}
else
{
state = STATE1;
}
break;
case STATE5:
if(num == 5)
{
state = STATE6;
}
else
{
state = STATE1;
}
break;
case STATE6:
if(num == 6)
{
state = STATE7;
}
else
{
state = STATE1;
}
break;
default:
state = STATE1;
}
if(state == STATE7)
{
printf("Password entered correctly.\n");
break;
}
}
return 0;
}
文章参考自朱友鹏老师物联网课程