天天看点

C语言实现简单的状态机

先来看一下状态机的定义:

状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为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;
}
           

文章参考自朱友鹏老师物联网课程