C语言状态机编程思想

有限状态机概念

有限状态机是一种概念思想,把复杂的控制逻辑分解成有限个稳定状态,组成闭环系统,通过事件触发,让状态机按设定的顺序处理事务。单片机C语言的状态机编程,是利用条件选择语句(switchcase或者ifelse)切换状态,通过改变状态机状态,让程序按设定的顺序执行。
有限状态机由有限的状态和相互之间的转移构成,在任何时候只能处于给定数目的状态中的一个。当接收到一个输入事件时,状态机产生一个输出,同时也可能伴随着状态的转移。状态机的原理如下:在当前状态下,发生某个事件后转移到下一个状态,然后决定执行的功能动作。可参考如下示意图:

应用举例

要想使用状态机思想进行编程,需要将任务分解成有限个稳定状态。
这里以常见的按键动作进行举例说明:
上图为按键典型的动作图,可以分解为四个状态,分别为:
状态1 = 按键弹起、
状态2 = 前沿抖动、
状态3 = 按键按下、
状态4 = 后沿抖动。
有限状态机的C代码实现如下:
if (定时器 >= 10ms) //10ms是典型消抖时间{   switch (按键状态)   {     case 按键弹起状态:      if (IO读取为低电平) 按键状态=前沿抖动;      break;     case 前沿抖动状态:      if (IO读取为低电平) 按键状态=按键按下;      break;     case 按键按下状态:      if (IO读取为高电平) 按键状态=后沿抖动;      break;     case 后沿抖动状态:      if (IO读取为高电平) 按键状态=按键弹起;      break;default:按键状态=按键弹起;   }}

状态机编程建议

巧妙的使用结构体和枚举一方面可以便于扩展和维护状态机的状态和事件,另一方面可提高程序的可读性。假设有3种状态(状态数可以随意增加),状态枚举如下:
typedef enum {  state_1=1,  state_2,  state_3}State;
假设有5个事件(也可以随意增加),事件枚举如下:
typedef enum{  event_1=1,  event_2,  event_3,  event_4,  event_5}Event;
定义一个结构体描述如下:
typedef struct {  State curState;      //当前状态  Event eventId;      //事件  State nextState;   //下一个状态  Action action;     //动作功能}StateEvent;
根据具体的应用场景调整StateEvent,并赋予相应的动作功能,整体的基本流程如下:当前状态->有事件触发->跳到下一个状态->具体的动作功能
总结
状态机应用很广泛,也可以锻炼逻辑思维,LoRa消息推送也常采用状态机的思想, 实际上状态机涉及的知识点很多,本篇文章只是简要的介绍了下单片机C语言的状态机编程思想,在日后的开发设计中,需要不断的总结经验并灵活应用。

版权归原作者所有,如有侵权,请联系删除。

(0)

相关推荐

  • 【精品博文】关于FPGA处理中断

    所有的入门的屌丝都是知道处理器中断模式是两种是边沿触发和电平触发. 边沿触发用的很少,一般还是以下降沿触发为主.当设备完成一个数据后,会输出一个下降沿,触发处理器.而电平触发,是输出一个电平,并且会保 ...

  • 凔海笔记之单片机(五):给按键编个码

    按键通常是一种长常开型按钮开关,例如下图,如果不按动得话它就是断开状态的. 它作为单片机的附属小鬼,主要就是为了让单片机检测出它的状态,然后单片机根据这个状态来干一些事.例如,当按键按下灯亮,当按键按 ...

  • 【MSP430趣谈】MSP430第四讲之简谈中断

    上次和大家聊到了GPIO的使用,但是讲的不是很全面,要是全面涉及的话就是我们后面要讲的内容了,这里我们就不多加描述.在后期的讲解中也会慢慢涉及我们没有讲到的一些功能的.今天我们要涉及一个对于单片机来说 ...

  • 51单片机的自学之路(4)——静态数码管和动态数码管的显示实验

    静态数码管的显示实验 数码管的简介 数码管是一种半导体发光器件,其基本单元是发光二极管,也称之为LED数码管.**按照发光二极管的单元连接方式,可以分为共阳极数码管和共阴极数码管. 共阳数码管是指将所 ...

  • 谈谈单片机编程思想——状态机

    玩单片机还可以,各个外设也都会驱动,但是如果让你完整的写一套代码时,却无逻辑与框架可言.这说明编程还处于比较低的水平,你需要学会一种好的编程框架或者一种编程思想!比如模块化编程.状态机编程.分层思想等 ...

  • 嵌入式状态机编程

    状态机基本术语 现态:是指当前所处的状态. 条件:又称为"事件",当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移. 动作:条件满足后执行的动作.动作执行完毕后,可以迁移 ...

  • 嵌入式开发中的两点编程思想

    嵌入式开发,除了掌握基本的编程语法之外,编程的思想也是很关键,下面说两点编程思想. 1分层思想 嵌入式分层思想,可能你不懂,但你肯定见到过很多类似下面这样的软件结构图. 比如,RT-Thread Na ...

  • C语言经典编程(浙大版C语言第三版)详解

    C语言经典编程详解 -- 一览表: 1.[C语言经典编程]练习2-1 Programming in C is fun! (5分) 2.[C语言经典编程]练习2-3 输出倒三角图案 (5分) 3.[C语 ...

  • 【计算机基础知识】三大编程思想

    【计算机基础知识】三大编程思想

  • 语言艺术和思想艺术的完美结合

    --评张继忠<叫我名字的皮大王> 刊发日期:2020-09-14 语音阅读: ◇彭定华 <叫我名字的皮大王>中的大部分篇章,我以前在一些儿童文学刊物读过.但是收到该书后,我还是 ...

  • 单片机编程技巧—状态机编程

    摘要:不知道大家有没有这样一种感觉,就是感觉自己玩单片机还可以,各个功能模块也都会驱动,但是如果让你完整的写一套代码,却无逻辑与框架可言,上来就是开始写!东抄抄写抄抄.说明编程还处于比较低的水平,那么 ...

  • 工程师的硬核单片机编程思想

    (一)裸编程是什么? 先声明一个概念,裸编程,我创造的名词,指的是在裸机上编写程序,裸机,在单片机领域就是指带着硬件的单片机控制系统,不要想歪咯. 在裸机上编程,就犹如在一片荒地上开垦,任何一锄头下去 ...

  • 零基础编程之编程思想,QQ是怎么开发出来的?

    真人回复,随身顾问. 点击关注! 昨天发的反响还可以,但是激烈程度还是有点不够,影响我的积极性,每天时间有限,后面要降低更新频率了哦! 因为是零基础,所以对于学过的人来说,有些可能会觉得过于简单,但是 ...