状态机编程,非常有用!!!

原视频链接:https://www.bilibili.com/video/BV1aR4y177Mh/?spm_id_from=333.788&vd_source=000517e2f52ac26c3dd3a8f0f47a1852
在这里插入图片描述
伪代码实例:洗衣机

  • 功能需求
    在这里插入图片描述
  • 由功能转变状态图
    在这里插入图片描述
  • 梳理状态之间的转换的关系
    在这里插入图片描述
  • 梳理状态之间的转换的关系(添加切换条件
    在这里插入图片描述
  • 代码编程
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

#define	SELF_CHECK_STATUS	(1)//上电自检
#define IDEL_STATUS			(2)//空闲
#define COUNT_DOWN_STATUS	(3)//倒计时
#define WATER_IN_STATUS		(4)//加水
#define DO_WASH_STATUS		(5)//洗衣
#define WATER_OUT_STATUS	(6)//放水
#define DO_DRY_STATUS		(7)//甩干
#define FINISHED_STATUS		(8)//洗衣结束
#define ARARM_STATUS		(18)//报警
#define PAUSE_STATUS		(28)//暂停

int init(void)
{
	return 0;
}
void global_check(void)
{
	return ;
}
int auto_check(void)
{
	return 0;
}
int alarm(void)
{
	return 0;
}
int wait_for_user(void)
{
	return 0;
}
int start_countdown(void)
{
	return 0;
}
int let_water_in(void)
{
	return 0;
}
int do_wash(void)
{
	return 0;
}
int let_water_out(void)
{
	return 0;
}
int do_dry(void)
{
	return 0;
}
int finished(void)
{
	return 0;
}

int main(void)
{
	static int step  = SELF_CHECK_STATUS;//状态切换标志
	
	init();//开机进行一系列初始化(主要是驱动外设)
	
	while(1)
	{
		//一些全局的事件检测,用于设置全局标志
		global_check();
		
		// 状态机
		switch (step)
		{
			case SELF_CHECK_STATUS://自检
			{
				auto_check();
				if (按下停止) step = FINISHED_STATUS;
				if (自检pass) step = IDEL_STATUS;
				else
					step = ARARM_STATUS;
			}break;
			case IDEL_STATUS://空闲
			{
				wait_for_user();
				if (按下停止) step = FINISHED_STATUS;
				if (按下开始) step = COUNT_DOWN_STATUS;
			}break;
			case COUNT_DOWN_STATUS://倒计时
			{
				start_countdown();
				if (按下停止) step = FINISHED_STATUS;
				if (倒计时结束) step = WATER_IN_STATUS;
			}break;	
			case WATER_IN_STATUS://加水
			{
				let_water_in();
				if (按下停止) step = FINISHED_STATUS;
				if (水加满了) step = DO_WASH_STATUS;
			}break;	
			case DO_WASH_STATUS://洗衣
			{
				do_wash();
				if (按下停止) step = FINISHED_STATUS;
				if (清洗时间结束) step = WATER_OUT_STATUS;
			}break;							
			case WATER_OUT_STATUS://放水
			{
				let_water_out();
				if (按下停止) step = FINISHED_STATUS;
				if (水放完 && 只洗了一遍) step = WATER_IN_STATUS;
				else if (水放完 && 洗了两遍) step = 甩干;
			}break;	
			case DO_DRY_STATUS://甩干
			{
				do_dry();
				if (按下停止) step = FINISHED_STATUS;
				if (甩干时间结束) step = FINISHED_STATUS;
			}break;	
			case FINISHED_STATUS://洗衣结束
			{
				finished();
				if (按下停止) step = FINISHED_STATUS;
				step = IDEL_STATUS;
			}break;	
			case ARARM_STATUS://报警
			{
				while(1)
				{
					alarm();//死循环,不再响应用户操作,并报警
				}
			}break;	
			case PAUSE_STATUS://暂停
			{
				//功能待完成。。。。。。。
				//在任何状态按下暂停键会跳转到暂停态,
				//再按一次暂停按键会回到之前的状态	
			}break;
			default:
			{
			}break;
		}
	}
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栋哥爱做饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值