单片机师傅清指教 (单片机师傅清零怎么弄)
本文目录导航:
单片机师傅清指教
状态机的概念状态机是软件编程中的一个重要概念。
比这个概念更重要的是对它的灵活应用。
在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。
比如说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态;再触发另一个键后切换到C状态,或者返回到A状态。
这就是最简单的按键状态机例子。
实际的按键解析程序会比这更复杂些,但这不影响我们对状态机的认识。
进一步看,击键动作本身也可以看做一个状态机。
一个细小的击键动作包含了:释放、抖动、闭合、抖动和重新释放等状态。
同样,一个串行通信的时序(不管它是遵循何种协议,标准串口也好、I2C也好;也不管它是有线的、还是红外的、无线的)也都可以看做由一系列有限的状态构成。
显示扫描程序也是状态机;通信命令解析程序也是状态机;甚至连继电器的吸合/释放控制、发光管(LED)的亮/灭控制又何尝不是个状态机。
当我们打开思路,把状态机作为一种思想导入到程序中去时,就会找到解决问题的一条有效的捷径。
有时候用状态机的思维去思考程序该干什么,比用控制流程的思维去思考,可能会更有效。
这样一来状态机便有了更实际的功用。
程序其实就是状态机。
也许你还不理解上面这句话。
请想想看,计算机的大厦不就是建立在“0”和“1”两个基本状态的地基之上么?状态机的要素状态机可归纳为4个要素,即现态、条件、动作、次态。
这样的归纳,主要是出于对状态机的内在因果关系的考虑。
“现态”和“条件”是因,“动作”和“次态”是果。
详解如下:①现态:是指当前所处的状态。
②条件:又称为“事件”。
当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
③动作:条件满足后执行的动作。
动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。
动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
④次态:条件满足后要迁往的新状态。
“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
如果我们进一步归纳,把“现态”和“次态”统一起来,而把“动作”忽略(降格处理),则只剩下两个最关键的要素,即:状态、迁移条件。
状态机的表示方法有许多种,我们可以用文字、图形或表格的形式来表示一个状态机。
纯粹用文字描述是很低效的,所以就不介绍了。
接下来先介绍图形的方式。
状态迁移图(STD)状态迁移图(STD),是一种描述系统的状态、以及相互转化关系的图形方式。
状态迁移图的画法有许多种,不过一般都大同小异。
我们结合一个例子来说明一下它的画法,如图1所示。
图1 状态迁移图①状态框:用方框表示状态,包括所谓的“现态”和“次态”。
②条件及迁移箭头:用箭头表示状态迁移的方向,并在该箭头上标注触发条件。
③节点圆圈:当多个箭头指向一个状态时,可以用节点符号(小圆圈)连接汇总。
④动作框:用椭圆框表示。
⑤附加条件判断框:用六角菱形框表示。
状态迁移图和我们常见的流程图相比有着本质的区别,具体体现为:在流程图中,箭头代表了程序PC指针的跳转;而在状态迁移图中,箭头代表的是状态的改变。
我们会发现,这种状态迁移图比普通程序流程图更简练、直观、易懂。
这正是我们需要达到的目的。
状态迁移表除了状态迁移图,我们还可以用表格的形式来表示状态之间的关系。
这种表一般称为状态迁移表。
表1就是前面介绍的那张状态迁移图的另一种描述形式。
表1 状态迁移表①采用表格方式来描述状态机,优点是可容纳更多的文字信息。
例如,我们不但可以在状态迁移表中描述状态的迁移关系,还可以把每个状态的特征描述也包含在内。
②如果表格内容较多,过于臃肿不利于阅读,我们也可以将状态迁移表进行拆分。
经过拆分后的表格根据其具体内容,表格名称也有所变化。
③比如,我们可以把状态特征和迁移关系分开列表。
被单独拆分出来的描述状态特征的表格,也可以称为“状态真值表”。
这其中比较常见的就是把每个状态的显示内容单独列表。
这种描述每个状态显示内容的表称之为“显示真值表”。
同样,我们把单独表述基于按键的状态迁移表称为“按键功能真值表”。
另外,如果每一个状态包含的信息量过多,我们也可以把每个状态单独列表。
④由此可见,状态迁移表作为状态迁移图的有益补充,它的表现形式是灵活的。
⑤状态迁移表优点是信息涵盖面大,缺点是视觉上不够直观,因此它并不能取代状态迁移图。
比较理想的是将图形和表格结合应用。
用图形展现宏观,用表格说明细节。
二者互为参照,相得益彰。
用状态机思路实现一个时钟程序接下来,我将就状态机的应用,结合流程图、状态迁移图和状态迁移,举一个实际例子。
下面这张图是一个时钟程序的状态迁移图,如图2所示。
图2 时钟程序状态迁移图把这张图稍做归纳,就可以得到它的另一种表现形式——状态迁移表,如表2所示。
表2 时钟程序状态迁移表状态机应用的注意事项 基于状态机的程序调度机制,其应用的难点并不在于对状态机概念的理解,而在于对系统工作状态的合理划分。
初学者往往会把某个“程序动作”当作是一种“状态”来处理。
我称之为“伪态”。
那么如何区分“动作”和“状态”。
本匠人的心得是看二者的本质:“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;而“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。
初学者的另一种比较致命的错误,就是在状态划分时漏掉一些状态。
我称之为“漏态”。
“伪态”和“漏态”这两种错误的存在,将会导致程序结构的涣散。
因此要特别小心避免。
更复杂的状态机前面介绍的是一种简单的状态结构。
它只有一级,并且只有一维,如图3所示。
图3线性状态机结构如果有必要,我们可以建立更复杂的状态机模型。
1 多级状态结构状态机可以是多级的。
在分层的多级状态机系统里面,一个“父状态”下可以划分多个“子状态”,这些子状态共同拥有上级父状态的某些共性,同时又各自拥有自己的一些个性。
在某些状态下,还可以进一步划分子状态。
比如,我们可以把前面的时钟例子修改如下:把所有和时钟功能有关的状态,合并成1个一级状态。
在这个状态下,又可以划分出3个二级子状态,分别为显示时间、设置小时、设置分钟;同样,我们也可以把所有和闹钟功能有关的状态,合并成1个一级状态。
在这个状态下,再划分出4个二级子状态,分别为显示闹钟、设置“时”、设置“分”、设置鸣叫时间。
我们需要用另一个状态变量(寄存器)来表示这些子状态。
子状态下面当然还可以有更低一级的孙状态(子子孙孙无穷尽也),从而将整个状态体系变成了树状多级状态结构,如图4所示。
图4 树状多级状态结构2 多维状态结构状态结构也可以是多维的。
从不同的角度对系统进行状态的划分,这些状态的某些特性是交叉的。
比如,在按照按键和显示划分状态的同时,又按照系统的工作进程做出另一种状态划分。
这两种状态划分同时存在,相互交叉,从而构成了二维的状态结构空间。
举一个这方面的例子,如:空调遥控器,如图5所示。
图5 多维状态机结构同样,我们也可以构建三维、四维甚至更多维的状态结构。
每一维的状态都需要用一个状态变量(寄存器)来表示。
无论多级状态结构和多维状态结构看上去多么迷人,匠人的忠告是:我们依然要尽可能地简化状态结构,能用单级、单维的结构,就不要给自己找事,去玩那噩梦般的复杂结构。
简单的才是最有效的。
结束语对状态机的理解需要一个由浅入深的过程。
这个过程应该是与实践应用和具体案例思考相结合的。
当一种良好的思路成为设计的习惯,它就能给设计者带来回报。
愿这篇手记里介绍的基于状态机的编程思路能给新手们带来一些启迪,帮助大家找到“程序设计”的感觉。

状态图怎么画
状态图的画法如下:
第一步:下载软件“亿图图示”安装并启动,或访问亿图图示网页版。
新建状态图,依次点击“软件/计算机-软件开发-UML图”,从展示的例子中,选择一个喜欢的模板。
第二步:套用模板,点击“使用”。
第三步:点击画布中的状态图,如果图中缺少一部分内容则从符号库中选择合适的符号添加到画布中(多余一部分内容则直接删除符号及与之相连接的直线)。
点击想要更改的文本框,更改文本框图形形状或文本框内的文字。
第四步:完成状态图的绘制后,可以通过点击左上角的保存、打印、导出等合适的方式保留绘制好的状态图。
状态图简介
状态图(Statechart Diagram)是描述一个实体基于事件反应的动态行为,显示了该实体如何根据当前所处的状态对不同的事件做出反应的。
通常创建一个UML状态图是为了以下的研究目的:研究类、角色、子系统、或组件的复杂行为。
状态机由状态组成,各状态由转移链接在一起。
状态是对象执行某项活动或等待某个事件时的条件。
转移是两个状态之间的关系,它由某个事件触发,然后执行特定的操作或评估并导致特定的结束状态。
状态机图教程 (UML State Diagram)
状态机图用于模拟各个类对象,用例和整个系统的动态行为。
换句话说,当一个状态机创建它所附着的对象,该对象成为状态机的所有者时,例如,状态机附加的对象可以是类,用例甚至整个系统。
状态机图是一种行为,它指定对象在其生命周期中响应事件所经历的状态序列。
状态机用于指定必须响应异步刺激或其当前行为取决于其过去的对象的行为。
状态机用于模拟对象,用例甚至整个系统的行为,尤其是反应系统,它们必须响应来自系统外部的参与者的信号。
在UML中,状态机除了传统的起始图表符号之外还引入了两个新概念: - 复合和嵌套状态 - 正交区域 在图形上,状态呈现为具有圆角的矩形。
转换呈现为实线直线。
试试吧!寻找在线状态机图工具?只需单击下面的“绘制”按钮即可在线创建状态机图。
Visual Paradigm Online是免费*且直观的。
在开始之前,您还可以通过此State Machine Diagram教程了解State Machine Diagram。
现在画画 状态是对象生命期间的条件,它可以满足执行某些活动的某些条件,或者等待接收某些事件。
一个状态有五个部分: 1. 状态名 - 状态名称 2. 进入 - 进入状态的行动 3. 做活动 - 在进入状态时执行的行动 4. 退出状态 - 在离开状态下执行的操作 5. Deferrable Trigger - 在该状态下未处理的事件列表,而是被推迟并排队等待另一个状态的对象处理 对象在有限的时间内保持状态。
例如,家中的加热器可能处于以下四种状态中的任何一种:空闲,冷却,加热,启动和活动。
过渡 - 转换是两个状态之间的关系,指示处于第一状态的对象将执行某些动作并且当指定事件发生并且满足指定条件时进入第二状态。
- 过渡火灾意味着发生状态变化。
在转换触发之前,对象处于源状态;它发射后,据说处于目标状态。
- 过渡分为五个部分: - 来源状态 - 受过渡影响的状态 - 事件触发器 - 一种可以触发源状态以满足保护条件的激励, - 保护条件 - 在接收事件触发器触发转换时计算的布尔表达式, - 操作 - 可执行的原子计算,可以直接作用于拥有状态机的对象,并间接作用于对象可见的其他对象, - 目标状态 - 转换完成后处于活动状态。
来源状态和目标状态源状态 (Source State) :受转换影响的状态;如果对象处于源状态,则当对象接收到转换的触发事件并且满足保护条件(如果有)时,可以触发传出转换。
目标状态 (Target State) :过渡完成后处于活动状态。
事件是在某个时间点发生的离散信号。
它也被称为刺激和对象的一种输入。
以下是事件的特征: - 可能会导致状态发生变化 - 可以触发操作 - 操作可以是内部操作或外部操作 - 可能有相关的条件 - 信号事件可用于在状态机之间进行通信 - 状态过渡标签 - 事件[警卫条件] - Condition是一个布尔函数 - 条件在状态机上是可选的 - 条件适用于有限的时间段 - 发生事件时,条件必须为true才能发生状态转换。
如果condition为false,则不会发生状态转换。
由于状态转换的瞬间执行动作。
状态转换标签可以表示为以下格式 - 活动/行动 - 事件[条件] /行动 - 进入/退出行动决策节点 用于表示测试条件,以确保控制流或对象流仅沿一条路径下降。
Fork节点 是伪状态,用于将进入的转换分成两个或多个终止于正交目标顶点的转换。
从fork顶点传出的段不得有保护或触发器,并且它必须只有一个传入和至少两个传出转换。
Join节点 是伪状态,用于合并从不同正交区域中的源顶点发出的若干转换。
进入连接顶点的过渡不能有保护或触发,它必须至少有两个传入过渡和一个传出过渡。
合并节点 (Merge Node) 用于将使用决策节点创建的不同决策路径重新组合在一起。
选择 (Choice) 是一种伪状态,当达到该状态时,导致动态评估其传出转换的触发器的保护。
这实现了动态条件分支。
它允许将转换分成多个传出路径,以便决定采用哪条路径。
示例:状态机图的选择节点 Terminate 是伪状态,表示状态机的生命线已经结束。
终止伪状态由十字表示。
与最终状态不同,终止伪状态意味着由于上下文对象被终止而终止状态机。
除了与导致终止状态的转换相关联的操作之外,状态机不执行任何状态的退出,也不执行任何退出操作。
简单状态是没有子结构的状态。
复合状态可以进一步细分为子状态(在状态内或单独的图中)。
具有子状态(嵌套状态)的 状态 称为 复合状态 。
子状态可以嵌套到任何级别。
嵌套状态机可以具有至多一个初始状态和一个最终状态。
通过显示某些状态仅在特定上下文(封闭状态)内可能,子状态用于简化复杂的平面状态机。
除了复合状态,还有另一个称为子机状态的符号,它在语义上等同于复合状态。
甲 复合状态 具有两个或更多个区域被称为 正交 。
与复合状态不同,子机状态旨在对状态进行分组,因此您可以重用它们。
正交状态分为由虚线分隔的两个或更多个区域: 每个区域的一个状态在任何时间点始终是活动的,即同时的基板 进入:转换到正交状态的边界激活所有区域的初始状态 退出:必须在所有区域达到最终状态才能触发完成事件 您可以使用并行和同步节点来指定不同的子状态。
Concurrent Substates是独立的,可以在不同的时间完成。
历史状态 - 浅/深 历史状态允许状态机重新进入在离开复合状态之前处于活动状态的最后一个子状态。
历史状态使用的示例如下图所示: 您可以在以下情况下使用状态机: - 在业务建模期间,您可以创建状态机来为用例场景建模。
- 在分析和设计过程中,您可以对事件驱动的对象建模,这些对象会响应对象上下文之外的事件。
- 在分析和设计过程中,您可以使用多个状态机图来显示同一状态机及其行为的不同方面。
可以通过以下步骤开发用例模型。
1. 识别具有复杂行为的实体或标识参与其生命周期将被指定的行为的类 2. 模型状态 - 确定实体的初始状态和最终状态 3. 模型转换 4. 模型事件 - 识别影响实体的事件 5. 从初始状态开始,跟踪事件的影响并确定中间状态 6. 确定状态的任何进入和退出操作 7. 必要时使用子状态扩展状态 8. 如果实体是一个类,请检查该类的操作和关系是否支持该状态中的操作,如果不扩展该类 9. 根据需要进行细化和精心制作 你也可以: - 为抽象目的绘制用于逻辑分类状态的子状态 下面的数字时钟状态机图示例显示了简单数字时钟的接口: 附加类的状态机图: 用于建模DigitalClock行为的状态图: 下面提供了一些更多的State Machine Diagram示例。
状态机图示例:烤面包机 状态机图示例:烤箱 状态机图示例:计算机测试 此示例通过使用两个区域表示两组并发子状态。
状态机器图例子:人生 此示例通过使用两个区域表示两组并发子状态。
可在在线状态机图软件中编辑的自由状态机图示例和模板:Visual Paradigm Online。
使用模板作为起点来创建自己的状态机图。
烤箱 数码时钟 正交状态 复合状态 加热器 烤面包机 售票系统 电话