天天看點

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;
}
           

文章參考自朱友鵬老師物聯網課程