51单片机实现状态机ppt课件_第1页
51单片机实现状态机ppt课件_第2页
51单片机实现状态机ppt课件_第3页
51单片机实现状态机ppt课件_第4页
51单片机实现状态机ppt课件_第5页
已阅读5页,还剩33页未读 继续免费阅读

VIP免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章51单片机实现状态机9 1有限状态机有限状态机 FSM 与流程图很相似 具有一组按照一定路径排列的状态 依据于状态中的事件和动作 一个状态可以转移到其他状态 状态是时间中的一个点 例如 当你等火车的时候 你在等待状态 一种状态在一个状态机中 只能出现一次 事件是某时发生的事情 例如火车到达 火车运行 动作是当事件出现时 实现的任务 例如 火车到达后 上车转移是两个状态之间的联系 可以从一个状态移动到另外一个状态 状态图就是对一个事物在某个事件发生后从一个源状态到另外一个目的状态转移的图形描述 状态图中 使用圆圈表示状态 圆圈中的文字或数字表示该状态的名字或是编码 状态转移方向用箭头表示 在箭头旁写的文字是转移条件 对于梅里状态图 在箭头旁用 输入 输出 的格式表示转移条件与满足该转移条件下的输出 而对于摩尔状态机 常将输出放在状态圆圈中 由图可知 当k 0时 状态从a0转移到a1 若是k0 1 从状态a1转移到a2 等等 若是reset 0 则无论在什么状态 都将转移到a0状态 一个状态机描述需要五个要素 状态 输入 输出 状态转移函数 输出函数 如果在一个状态中包含着另一个状态序列 则称该状态为复合状态 状态机就是能够根据状态转移条件进行状态转换和输出状态活动的自动机 状态机可以使用数字电路实现 或是单片机通过软件编程实现 如果状态数量有限 输入数量有限 输出数量有限 则称为有限状态机 FSM 在数字电路中 有两类基本的电路 它们是组合电路和时序电路 它们之间的区别是组合电路的结构中没有反馈 输入值直接决定输出值 而时序电路的结构中具有反馈 其输出由状态和输入决定 状态机是时序电路的一种 9 1 1时钟同步有限状态机如果一个时序电路中的触发器都使用同一个时钟信号 则称为同步状态机1 结构时钟同步状态机的结构如图所示 其中次态逻辑由现态和输入形成 状态记忆是n个触发器 用于记忆2n状态 输出逻辑由现在状态和输入形成 在时钟的上升沿或是下降沿 取决于触发器结构 触发器在次态逻辑的控制下动作 2 输出逻辑如果一个时序电路的输出与现在状态和输入都有关 则称为梅里状态机 就是说 在某状态下 满足某输入条件的输出就是梅里输出 值得注意的是梅里状态机的输入变化直接引起输出的变化 而不是等到下一个状态到来时输出才变化 就是梅里状态机 与输入无关 输出只与状态有关的状态机 称为摩尔状态机 所以摩尔状态机的输出与状态变化同步 摩尔状态机是使用广泛的状态机 如图所示 3 状态编码具有n个状态变量的状态机具有2n个状态 究竟一个状态用什么样的二进制数表示 就是状态编码问题 状态与它的编码之间不是唯一关系 最简单的状态编码就是采用自然二进制整数顺序来表示状态 这样的编码虽然简单 但是最终的电路未必是最简单的 如果要得到最简单的结果 最好把各种编码都试一试 但是太累人 一般情况下采用经验编码方法 在状态编码时应该考虑的一些因素 1 选择初始状态的编码与状态机的复位状态相同 这样就会使状态机复位时就回到状态机的初始状态 2 每一次状态变化 应该使发生的状态变量最少 3 如果有未使用的状态 则尽量选择可以达到简化逻辑设计的状态编码 设计中应该保证从未使用状态一定可以进入初始状态 4 主从状态机一个大的状态机设计是非常复杂的 一般情况下 最好将大的状态机分解成小状态机的集合 一般划分的原则是按照功能划分 主要输入 输出和控制算法由主状态机完成 而辅助的 在主状态机控制下的算法由子状态机完成 就是说主状态机完成顶层算法 子状态机完成底层算法 最常见的划分就是将计数器作为子状态机 这时 主状态机只要发出启动信号 而等待计数器返回的计数完成信号 虽然主状态机增加了启动计数器的输出信号和来自计数器的计数完成信号 但是该计数器就可以为主状态机节省n 1个状态 主从状态机的一般结构如图所示 5 状态转移条件状态转移的条件和输入的信号数有关 n个输入信号 将有2n个转移条件 这些条件之间应该是互斥的 只能有一个转移条件有效 也就是只能转移到另外一个状态 而不是一个以上的状态 在状态机设计过程中 对于状态转移的条件是容易给出的 但是使多个状态转移条件满足互斥条件确是比较难的 因为这需要更深刻的考虑状态 转移条件之间的关系 一个状态只向另外一个状态转移的状态机是最简单的状态机 因为只有一个状态转移条件 有些状态图只给出本状态向外状态的转移条件 而向自己转移的条件未给出 这种情况可以理解为只要不向外状态转移就保持在本状态不动 6 状态机的输入信号状态机的输入信号往往使是按键信号 既然是按键信号 则按下去的时间长短是随机的 可能是一个或几个时钟脉冲的时间 如果状态机的状态转移是在某输入信号的作用之下连续转移 例如 在状态1 当按键第一次为0时 转移到状态2 第二次为0时转移到状态1 则会因为按键一直保持在0 引起状态不断的转换 不能实现每按一次按键 转换一次状态的目的 解决的方法是设计边沿微分电路 使按键按下时 只在下降沿输出一个时钟周期的低电平 保证只有一个状态转移 7 上电状态机初始化在状态机上电时 无论为何种输入条件 都应该进入到一个确定的状态 该状态称为上电初始状态 有些状态机可以在上电时 自动进入上电初始状态 有些状态机则不能 需要复位信号的帮助才能进入上电初始状态 9 1 2状态图状态图是用于小型 中型状态机设计的一种方法 该方法的特点是简单 状态图中的状态转移是用一根弧线表示的 所以不管有多少输入变量 也只能有一个转移条件表达式 应该使现在状态到所有次态的转移条件互斥 也就是说只能转移到一个次态 另外需要说明的是用于控制器的状态机大部分都是摩尔状态机 就是说这些状态机的输出仅仅与状态有关 例题9 1 设计一个顺序开关装置 该开关装置在按键k第一次按下时 三盏灯x y和z同时点亮 当k再次按下时 x灯立刻熄灭 y灯15s后熄灭 在y灯熄灭后18s后 z灯熄灭 例题9 2 试设计一个交通信号灯控制器 该交通灯的红 黄 绿灯亮灭顺序是如下 9 2 1C语言描述状态机的语句intstate S0 初始状态while 1 无限循环 switch state caseS0 If T0转移条件满足 状态转移到满足T0条件的次态 操作 If T1转移条件满足 状态转移到满足T1条件的次态 操作 If TN转移条件满足 状态转移到满足TN条件的次态 操作 break caseS1 插入S1的操作 插入离开S1的转移 break caseSN 插入SN的操作 插入离开SN的转移 break 通常将表示状态转移的一系列通常将表示状态转移的多个if语句写成if else语句 这样可以使转移条件形成互斥 当然也可以直接使用if语句描写状态机 例如 if state S0 if T0转移条件满足 状态转移到满足T0条件的次态 操作 elseif T1转移条件满足 状态转移到满足T1条件的次态 操作 else if TN转移条件满足 状态转移到满足TN条件的次态 操作 if state S1 插入离开该状态的条件语句 插入要转移的次态 插入S1状态的操作语句 if state SN 插入离开该状态的条件语句 插入要转移的次态 插入SN状态的操作语句 9 2 2描述状态机的完整C程序格式 include数码管的译码表格设置定时器的定时变量设置状态变量设置其他全局变量主程序 局部变量初始化定时器初始化语句中断允许语句主程序无限循环中 1 输入信号处理语句获得所有的输入信号状态 2 状态机描述语句主要是描述状态转移 转移条件 定时变量清零等该状态下的输出语句显示该状态的发光二极管 不是必须的 用于调试 3 显示处理语句将定时数据送到数码管显示 不是必须的 用于调试 4 其他语句 5 若是在状态描述语句中没有描述输出 可单独将各个状态下的输出描述定时器中断服务程序中 设置静态局部变量根据定时器工作模式确定是否设置初值 若是需要精确定时 选择不需要预置初值的工作方式2每中断一次就增加数值的语句 获得确定的中断时间 例如1s 按照确定的中断时间 增加定时变量 9 3示例程序在状态机描述中 除了直接描述状态机的语句外 还需要按键 钮 输入语句 定时器描述等语句 本节通过示例对按键 定时等的C描述给予介绍 示例程序1 按键处理程序 P3口全部连接按键 P0口连接的数码管显示按键的值 程序中变量kk是按键的值 不同的按键按下 数码管显示不同的值 源程序如下 include AT89X51 h unsignedintcodetable 0 xC0 0 xF9 0 xA4 0 xB0 0 x99 0 x92 0 x82 0 xF8 0 x80 0 x90 unsignedintkk 0 x08 voidmain unsignedintnn while 1 P3 0 xff P3口连接8个按键作为输入if P3 0 x00 0 xff 如果有按键按下for nn 0 nn 1000 nn 延时if P3 0 x00 0 xff 按键还在按下状态 switch P3 case0 xfe P3 0 0 fe 11111110kk 0 break case0 xfd P3 1 0 fd 11111101kk 1 break case0 xfb P3 2 0 fb 11111011kk 2 break case0 xf7 P3 3 0f7 11110111kk 3 break case0 xef P3 4 0 ef 11101111kk 4 break case0 xdf P3 5 0 df 11011111kk 5 break case0 xbf P3 6 0 bf 10111111kk 6 break case0 x7f P3 7 07f 01111111kk 7 break default kk 8 while P3 0 xff 如果按键还在按下时 则停留在此 等待按键抬起 P0 table kk 将键值送到P0口连接的数码管显示 示例程序2 按键控制秒计数 定时器0工作在方式1 P3口引脚连接按键 按键按下后 P0口连接的数码管显示按键号 P1口循环显示0 按键号之间的值 P2 0连接的LED灯亮1s 灭1s 如下程序采用定时器0 方式1工作 由于预装初值需要时间 所以不是精确计数 源程序如下 include AT89X51 h 文件夹名yuzuo2unsignedintcodetable 0 xC0 0 xF9 0 xA4 0 xB0 0 x99 0 x92 0 x82 0 xF8 0 x80 0 x90 unsignedintkk 0 x08 unsignedintt0 voidmain unsignedintnn TMOD 0 x01 定时器0 M1M0 01 模式1 gate 0 外中断不起作用 C T 0TH0 0 x3c 设置TH初值0 x3cb0 65536 50000 15536 50ms中断一次 每秒中断20次TL0 0 xb0 设置TL初值TR0 1 启动定时器0ET0 1 设置中断使能寄存器 允许定时器0中断EA 1 允许所有中断源中断while 1 P3 0 xff P3口连接8个按键作为输入if P3 0 xff 如果有键按下for nn 0 nn 1000 nn 延时消除抖动if P3 0 xff 如果按键抬起 执行如下语句 switch P3 case0 xfe P3 0 0 fe 11111110kk 0 break case0 xfd P3 1 0 fd 11111101kk 1 break case0 xfb P3 2 0 fb 11111011kk 2 break case0 xf7 P3 3 0f7 11110111kk 3 break case0 xef P3 4 0 ef 11101111kk 4 break case0 xdf P3 5 0 df 11011111kk 5 break case0 xbf P3 6 0 bf 10111111kk 6 break case0 x7f P3 7 07f 01111111kk 7 break default kk 8 while P3 0 xff 如果按键还在按下时 则停留在此 等待按键抬起 P0 table kk P0口连接的数码管显示按键值P1 table t0 P1口连接的数码管显示t0值 voidtimer0 interrupt1 定时器0中断服务程序 staticunsignedintnn 设置局部静态变量TH0 0 x3c 重置初值TL0 0 xb0 重置初值nn if nn 20 如果中断20次 执行如下语句 nn 0 t0 P2 0 P2 0 P2 0相连的LED灯闪烁if t0 kk 由于kk是按键值 所以按键不同 kk不同 因此延迟时间也不同 t0 0 示例程序3 按键控制定时时间的程序 定时器0工作在方式2 按键值kk不同 则t0值的循环周期不同 因此可以通过kk改变t0 进而改变与t0相关的周期长度 源程序如下 include AT89X51 h unsignedintcodetable 0 xC0 0 xF9 0 xA4 0 xB0 0 x99 0 x92 0 x82 0 xF8 0 x80 0 x90 unsignedintkk 0 x08 unsignedintt0 voidmain unsignedintnn TMOD 0 x02 定时器0 工作模式M1 M0 2 0000 0010 8位 自动重装定时模式 gate 0 外中断不起作用 C T 0 取时钟信号 TH0 0 x06 预置初值6到定时器TH 预置250微秒溢出一次 12MHz 0 25ms 若是需要定时1s 则需要乘以4000 TL0 0 x06 预置TL0值TR0 1 启动定时器0ET0 1 允许定时器中断EA 1 允许总中断 while 1 P3 0 xff P3口连接8个按键作为输入if P3 0 xff 有键按下for nn 0 nn 1000 nn 循环延时语句if P3 0 xff 如果按键处于按下状态 switch P3 case0 xfe P3 0 0kk 0 break case0 xfd P3 1 0kk 1 break case0 xfb P3 2 0kk 2 break case0 xf7 P3 3 0kk 3 break case0 xef P3 4 0kk 4 break case0 xdf P3 5 0kk 5 break case0 xbf P3 6 0kk 6 break case0 x7f P3 7 0kk 7 break default kk 8 while P3 0 xff 如果按键还在按下时 则停留在此 等待按键抬起 P0 table kk P0口连接的数码管显示按键值P1 table t0 P1口连接的数码管显示t0值 voidtimer0 interrupt1 定时器0中断服务程序 中断后应产生时间标志 0 25ms中断一次 12MHz 延时1s 需要中断4000次 由于自动重装 所以定时精确staticunsignedintnn 设置局部静态变量nn if nn 4000 如果中断4000次 相当于1s nn 0 t0 P2 0 P2 0 使P2 0连接的LED灯闪烁if t0 kk kk改变t0的循环周期 t0 0 示例程序4 在使用如下的按键检测程序时 可以根据需要按键的多少裁减程序 如果需要按键按下时起作用 则应该去掉等待按键抬起的语句 但是应该注意 若是在状态转移条件中 连续两个转移条件具有相同的键值 这可能引起状态连续变化 P3口连接按键 P0口连接的数码管显示按键值 源程序如下 include AT89X51 h unsignedintcodetable 0 xC0 0 xF9 0 xA4 0 xB0 0 x99 0 x92 0 x82 0 xF8 0 x80 0 x90 unsignedintn0 n1 n2 n3 n4 n5 n6 n7 unsignedintkk 8 voidmain unsignedintnn while 1 P3 0 xff P3口连接8个按键作为输入if P3 0 0 P3 0键按下 for nn 0 nn 1000 nn 延时if P3 0 0 如果还在按下状态 则n0 1 kk 0 否则n0 0 kk 8 n0 1 kk 0 P2 0 0 else n0 0 while P3 0 等待按键抬起 if P3 1 0 P3 1连接的按键处理程序 for nn 0 nn 1000 nn if P3 1 0 n1 1 kk 1 elsen1 0 while P3 1 if P3 2 0 P3 2连接的按键处理程序 for nn 0 nn 1000 nn if P3 2 0 n2 1 kk 2 elsen2 0 while P3 2 if P3 3 0 P3 3连接的按键处理程序 for nn 0 nn 1000 nn if P3 3 0 n3 1 kk 3 P3 3连接的按键处理程序elsen3 0 while P3 3 if P3 4 0 for nn 0 nn 1000 nn if P3 4 0 n4 1 kk 4 P3 4连接的按键处理程序elsen4 0 while P3 4 if P3 5 0 P3 5连接的按键处理程序 for nn 0 nn 1000 nn if P3 5 0 n5 1 kk 5 elsen5 0 while P3 5 if P3 6 0 P3 6连接的按键处理程序 for nn 0 nn 1000 nn if P3 6 0 n6 1 kk 6 elsen6 0 while P3 6 if P3 7 0 P3 7连接的按键处理程序 for nn 0 nn 1000 nn if P3 7 0 n7 1 kk 7 elsen7 0 while P3 7 P0 table kk P0口连接的数码管显示按键值 9 4灯开关类例题 例题9 3 设计一个开关灯装置 该开关灯装置在按键k P3 0引脚 第一次按下时 三盏灯a b和c同时点亮 当k再次按下时 a灯立刻熄灭 b灯15s后熄灭 在b灯熄灭18s后 c灯熄灭 源程序如下 include AT89X51 h 文件夹名yuzuo2unsignedintcodetable 0 xC0 0 xF9 0 xA4 0 xB0 0 x99 0 x92 0 x82 0 xF8 0 x80 0 x90 unsignedintkk 0 x08 state 0 unsignedintt0 voidmain unsignedintnn TMOD 0 x01 定时器0 M1 M0 01 模式1 gate 0 外中断不起作用 C T 0 单片机时钟12MHzTH0 0 x3c TH初值0 x3cb0 65536 50000 1553650ms中断一次 每秒20次TL0 0 xb0 设置TL初值TR0 1 启动定时器0ET0 1 设置中断使能寄存器 允许定时器0中断EA 1 允许所有中断 while 1 P3 0 xff P3口连接8个按键作为输入if P3 0 xff 如果有键按下for nn 0 nn 1000 nn 循环延时语句if P3 0 xff 如果按键抬起 switch key

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论