2017年嵌入式第八届省赛真题解析_if(uwtick-uwtickuart>=2000)

动作:在状态机的迁移过程中,状态机会做出一些其它的行为,这些行为就是动作,动作是状态机对事件的响应

条件:状态机对事件并不是有求必应的,有了事件,状态机还要满足一定的条件才能发生状态迁移

注:一个状态机需要在状态集合中选取一个状态作为初始状态

也有人将它分为4类:状态,事件,动作,变换。

状态:一个状态机至少要包含两个状态

事件:事件就是执行某个操作的触发条件或者口令

动作:事件发生后执行的动作

变换:也从一个状态变化为另一个状态

不管是哪一种,其核心还是不变的。

通过以状态图的方式展示整个程序的流程图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57yW56iL5bCP54aK,size_20,color_FFFFFF,t_70,g_se,x_16

各个状态的动作:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57yW56iL5bCP54aK,size_20,color_FFFFFF,t_70,g_se,x_16

在写程序前一定要将各个状态机的动作,变换以流程图的方式表示。上述状态机在裸机上选择switch…case语句实现整个程序的运行

整个程序以以各个状态为主体实现程序的逻辑,按键和显示界面进行输入与输出。

1.按键


//***按键扫描子函数
void Key_Proc(void)
{
	if((uwTick -  uwTick_Key_Set_Point)<50)	return;//减速函数
		uwTick_Key_Set_Point = uwTick;

	ucKey_Val = Key_Scan();
	unKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val); 
	ucKey_Up = ~ucKey_Val & (ucKey_Old ^ ucKey_Val);	
	ucKey_Old = ucKey_Val;
	
	if(state == 0)  //状态0,按键才有效
	{
		if(unKey_Down == 1)
		{
			if(platform != 1)
			{
				//先将第一位清0,然后置1
				layer_set &= ~(1<<0);
				layer_set |= (1<<0);
			}
		}
		if(unKey_Down == 2)
		{
			if(platform != 2)
			{
				//先将第二位清0,然后置1
				layer_set &= ~(1<<1);
				layer_set |= (1<<1);
			}
		}	
		if(unKey_Down == 3)
		{
			if(platform != 3)
			{
				//先将第三位清0,然后置1
				layer_set &= ~(1<<2);
				layer_set |= (1<<2);
			}
		}
		if(unKey_Down == 4)
		{
			if(platform != 4)
			{
				//先将第四位清0,然后置1
				layer_set &= ~(1<<3);
				layer_set |= (1<<3);  
			}
		}	
		// ucled低四位赋值
		ucLed &=  (0xf0);
		ucLed |= layer_set;
		if(unKey_Down != 0) //按键按下进行计时,超过1s进入状态1,
		{
			uwTick_Set_Point = uwTick;
		}
	}
}

按键主要是在初始状态下对目标层数的设置。

对一个8位变量的某一位进行操作:

清0(将第n位清0,n:[0-7]):layer_set &= ~(1<<n)
置1(将第n位置1,n:[0-7]):layer_set |= (1<<2)

第4位清0:layer_set &= 0xf0

2.状态机

整个逻辑其实参考现实中的电梯的运行,先从低到高方向处理对应的层数,当最高层处理完后,在处理比原来的当前层较低的层数。在其基础了添加了状态变换需要的条件和该状态下对应的动作。


void run(void)
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);// 默认高电平
	if(layer_set) // 按键按下,执行
	{
		switch(state)
		{
			case 0:
				if(uwTick - uwTick_Set_Point >= 1000)
					state = 1; //  1s后,进入状态1
				else
					break;
			case 1:
				//升降机关门:PA =1,关门时间4s
				HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
				uwTick_S
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值