有限状态机在单片机编程中的应用

有限状态机在单片机编程中的应用
有限状态机在单片机编程中的应用

学习笔记

有限状态机在单片机编程中的应用

在单片机编程中,如果在不使用操作系统的情况下同时执行多个任务,可能会遇到下面这些情况:

?一个任务的执行时间过长,导致其他任务无法及时执行

?在一些任务中大量使用delay() 等函数进行软件延时,这些延时函数占用过多时间,影响其他任务的执行

?一些复杂任务的程序逻辑不清晰,不便于以后对程序进行维护,或添加新功能

本文介绍的有限状态机,可以做到将一个耗时较长的复杂任务分解为多个简单任务,同时使代码逻辑更加清晰,从而解决上述问题。

目录:

? 1. 什么是有限状态机

? 2. 有限状态机的作用

? 2.1 分解耗时过长的任务

? 2.2 避免软件延时对CPU 资源造成浪费

? 2.3 使程序逻辑更加清晰

? 3. 有限状态机的实现

? 3.1 通过switch - case 语句实现

? 3.2 通过Arduino 库实现

? 3.3 其他方式

? 4. 示例一:按键去抖动程序的优化

? 4.1 传统的按键去抖动程序

? 4.2 优化后的按键去抖动程序

? 5. 示例二:通过有限状态机实现的闹钟程序

? 6. 后记

1. 什么是有限状态机

根据维基百科上的定义,有限状态机(finite-state machine, FSM,简称状态机)是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。1

为了理解这句话,假设自己还有三天就要考试,这时候就要进入紧张的备考状态,将空闲时间用在复习上。但是,为了保证足够的精力,小睡一会儿也是十分有必要的。那么,什么时候复习,什么时候睡觉呢?可以这样描述:

在复习的时候:

如果感到瞌睡,则睡觉

如果没有感觉到瞌睡,则继续复习

在小睡的时候:

如果感觉不再瞌睡,则开始复习

如果感觉依旧瞌睡,则继续睡觉

也可通过一幅简单的示意图(也叫「状态转移图」)表示出来:

这个例子其实就是一个简单的有限状态机,其中,复习和小睡是两个状态,感觉瞌睡和感觉清醒这两个条件可以使状态发生转换。2

另外,Programming Basics3网站上也提供了状态机相关的教程,用形象化的图片解释了什么是有限状态机,可通过此链接访问。

在嵌入式程序设计中,如果一个系统需要处理一系列连续发生的任务,或在不同的模式下对输入进行不同的处理,常常使用有限状态机实现。例如测量、监测、控制等控制逻辑型应用。4

2. 有限状态机的作用

大家应该都知道,CPU 没有并行执行任务的能力。计算机「同时」运行多个程序,其实是多个程序依次交替执行,给人以程序同时运行的错觉。各个程序在什么时候开始执行,执行多长时间后切换到下一个程序,由操作系统决定。

单片机执行多任务也是类似的过程,但由于其资源有限,为了节省对CPU 和存储空间的占用,在很多情况下没有使用操作系统。这时,单片机中运行的各个任务必须在一定时间内主动执行完毕,才能保证下一个任务能够及时执行。

对于一些需要长时间执行的任务,例如按键去除抖动、读取和播放MP3 文件等,采用有限状态机的方式,将任务划分为多个小的步骤(状态),每次只执行其中的一步。这样,其他任务就有机会「插入」到这个任务之中,确保了各个任务都能按时执行。

对于一些简单的程序,可通过delay(), delay_ms() 之类的函数进行软件延时。这些延时函数,一般是通过将某个变量循环递加或递加,到达一定值后跳出循环,从而通过消耗CPU 时间实现了延时。

这种方式虽然简单,但在延时函数执行的过程中,其他程序无法运行,消耗了大量CPU 资源。而通过状态机,有助于减少软件延时的使用,提高CPU 利用率。

请参考下文中的示例一:按键去抖动程序的优化,这一例子展示了如何通过软件延时分解耗时较长的任务,同时减少软件延时的使用。

通过状态机,将一个复杂任务划分为多个状态,可以使程序清晰易懂,便于维护。以后想要添加、删除程序中的功能,都会变得非常容易。

下文中的示例二:通过状态机实现的闹钟展示了如何通过状态机优化程序逻辑。

3. 有限状态机的实现

如果使用C 语言,switch - case 语句,即可简单地实现有限状态机。

通过这段程序,即可实现一个具有三个状态的状态机。状态转移图如下图所示:

对于Arduino 用户,还可以使用FSM Library 实现。这一库将有限状态机进行了封装,可以以更简洁的方式实现状态机。

下载地址及使用说明:https://www.360docs.net/doc/6a10919959.html,/Code/FiniteStateMachine

对于一些更复杂的任务,使用switch - case 语句,代码可能会太简洁。这时候,使用其他方式实现状态机,可能会更好。具体请查阅相关资料。

4. 示例一:按键去抖动程序的优化

初学单片机时,我们接触的按键去抖动程序一般是这样的5:

对应的流程图如下:

从流程图中可知,delayms() 延时函数和最后的等待按键释放的程序,会占用过多时间。

如果使用有限状态机的思路,可以按照下图方式实现:

该状态机有三个状态,分别是按键未按下,等待,按键按下。当按键按下时,则会进入等待状态,若在等待状态中按键一直保持按下,说明按键已经稳定地按下,进入按键按下的状态,等待按键释放。程序代码如下:

该程序也可经过扩展,实现判断按键双击、长按等功能。只需增加相应的状态和转移条件即可。5. 示例二:通过有限状态机实现的闹钟程序

最近正在制作一个闹钟。这个闹钟支持播放MP3 格式的闹钟声6,支持贪睡模式,同时还有一些功能打算以后再添加上。

为了使程序逻辑更加清晰,也为了更方便地添加新功能,我打算采用有限状态机实现。相关程序如下:

状态转移图如图所示:

6. 后记

在单片机编程时,如果遇到代码复杂、任务占用时间过长等问题,可以尝试通过有限状态机解决。

数字逻辑模拟试卷

4、如果竞争的结果导致电路最终进入同一稳定总态,则称为临界竞争。 ( ) 5、门电路的扇出是表示输出电压与输入电压之间的关系。 ( ) 三、简答题(每题5分,共10分) 1、请列出3种“曾经是模拟的”现在却“已经成为数字的”系统,并简述为什么会有这种转变。 2、采用CMOS 晶体管实现的“与非门”和“或非门”,哪个速度快?为什么? 四、应用题(共70分) 1、已知接收端收到的汉明码码字a7a6a5a4a3a2a1=1100010,问在最多一位错的情况下发送端发送的码字是什么?(5分) 2、用卡诺图化简下列函数:(5分) ()()15,14,13,2,1,012,11,10,5,4,3,,,d F Z Y X W += ∑ 3、旅客列车分为特快A ,直快B 和慢车C ,它们的优先顺序为:特快、直快、慢车。同一时间内,只能有一趟列车从车站开出,即只能给出一个开车信号,试设计满足上述要求的开车信号控制电路。(10分) (1)列出真值表(5分) (2) 写出最简的输出逻辑表达式(5分) 4、运用一个MSI 器件实现余3码向8421BCD 码的转换。(10分) 5、运用“圈到圈”逻辑设计思想,采用74X138译码器和适当的逻辑门设计一个1位十进制数2421码的奇偶位产生电路(假定采用奇检验)。(10分)

1)作出状态/输出表(5分)。 2)说明它是Mealy 机还是Moore 机(2分) 3)说明这个电路能对何种输入序列进行检测。(3分) 7、作“0101”序列检测器的Mealy 型状态表和Moore 型状态表。凡收到输入序列为“0101”时,输出为1;并规定检测的“0101”序列不重叠。典型输入输出序列如下:(10分) 输入X :1 1 0 1 0 1 0 1 0 0 1 1 输出Z :0 0 0 0 0 1 0 0 0 0 0 0 看下面的例子就清楚了: 某序列检测器有一个输入端x 和一个输出端Z 。输入端 x 输入一串随机的二进制代码,当输入序列中出现011时,输出Z 产生一个1输出,平时Z 输出0 。典型输入、输出序列如下。 输入 x: 1 1 1 1 1 1 1 输出 Z: 1 1 试作出该序列检测器的原始状态图和原始状态表。 解.假定用Mealy 型同步时序逻辑电路实现该序列检测器的逻辑功能。 设: 状态A ------为电路的初始状态。 状态B ------表示收到了序列"011"中的第一个信号"0"。 状态C ------表示收到了序列"011"中的前面两位"01" 。 状态D ------表示收到了序列"011"。 ※ 当电路处在状态A 输入x 为0时,应令输出Z 为0转向状态B ;而处在状态A 输入x 为1时,应令输出Z 为0停留在状态A ,因为输入1不是序列"011"的第一个信号,故不需要记住。该转换关系如图5.16(a )所示。 Q1 Q2

(完整版)51单片机实现双机通信(自己整理的)

1号机程序 #in clude #defi ne uint un sig ned int #defi ne uchar un sig ned char sbit p10=P1 A 0; uchar a,b,kk; //uchar code d_c[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; void delay_ms(uchar y) { uchar i; while(y__) for(i=0;i<120;i++) 5 } void put(uchar x) // 发送函数 { SBUF=x; //SBUF:串行口数据缓冲器 while (TI==0); 〃等待发送结束 TI=0; } P £j £fA>l3 旳 4阳 1370 丘阳 H 鮎口 PDLWAJil- PDSA>f POfiAME PQ TiJT FZ^KS 畑 阳pz- A A-m FZW11 PZ.AtZ FZj9jAl4 PZ.TW? P3£VR : iD paimcc P3.sii nrn pjjfflrn F3.WTI] M*Tl pgtjgQIH F3.7/IF 1E 11 左边1号机,右边2号机, ,功能实现 帕叶DO ■ 口 IJApi FDJ H [I Z — 观旧 IP 口 .hQKD* *QAADf H ^ 弓 H.Lta RQfMM FZJWS pz. iwe F2JKA-IDI P2JTA11I F2.HW1Z P2JSM13 F2W.14 F2JM1S F3Ji nHX& gj.im:& riaiWTO rjjfWTT F3.1/W f3AT1 P3JillW F3JMF ■T2 1E

51单片机实现双机通信(自己整理的)

左边1号机,右边2号机,,功能实现 1号机程序 #include #define uint unsigned int #define uchar unsigned char sbit p10=P1^0; uchar a,b,kk; //uchar code d_c[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; void delay_ms(uchar y) { uchar i; while(y--) for(i=0;i<120;i++) ; } void put(uchar x) //发送函数 { SBUF=x; //SBUF:串行口数据缓冲器 while(TI==0); //等待发送结束 TI=0; } void main() { uchar j; SCON=0x40; //串行口工作方式1,8位通用异步发送器

— TMOD=0x20; //定时器1工作方式2 PCON=0x00; //波特率不倍增 TH1=0xf4; TL1=0xf4; //波特率2400 TR1=1; //定时器1开始计时 P2=0xc0; while(1) { if(p10==0&&j==0) { delay_ms(15); while(p10==0); kk=1; P2=0xf9; j=1; } if(p10==0&&j==1) { delay_ms(15); while(p10==0); kk=2; P2=0xa4; j=2; } if(p10==0&&j==2) { delay_ms(15); while(p10==0); kk=3; P2=0xb0; j=0; } if(kk==1) put('A'); if(kk==2) put('B'); if(kk==3) put('C'); delay_ms(10); } }

北京邮电大学 数字逻辑期末模拟试题8

本科试卷(八) 一、选择题(每小题2分,共30分) 1.逻辑函数F1=∑m (2,3,4,8,9,10,14,15), 它们之间的关系是________。 A . B . C . D .、互为对偶式 2. 最小项的逻辑相邻项是________。 A .ABCD B. C. D. 3. 逻辑函数F (ABC )=A ⊙C 的最小项标准式为________。 A.F=∑(0,3) B. C.F=m 0+m 2+m 5+m 7 D. F=∑(0,1,6,7) 4. 一个四输入端与非门,使其输出为0的输入变量取值组合有_______种。 A. 15 B. 8 C. 7 D. 1 5. 设计一个四位二进制码的奇偶位发生器(假定采用偶检验码),需要_______个异或门。 A .2 B. 3 C. 4 D. 5 6. 八路数据选择器如图1-1所示,该电路实现的逻辑函数是F=______。 A . B . C . D . 图1-1 7. 下列电路中,不属于时序逻辑电路的是_______。 A .计数器 B .触发器 C .寄存器 D .译码器 8. 对于JK 触发器,输入J=0,K=1,CP 脉冲作用后,触发器的次态应为_____。 A .0 B. 1 C. 保持 D. 翻转 9. Moore 型时序电路的输出_____。 A.与当前输入有关 B. 与当前状态有关 C. 与当前输入和状态都有关 D. 与当前输入和状态都无关 2F ABC ABCD ABC ABC ACD =++++12F F =12F F =12F F =1F 2F ABCD ABCD ABCD ABCD C A C A F +=AB AB +AB AB +A B ⊕A B +

状态机思路在单片机程序设计中的应用

状态机思路在单片机程序设计中的应用 状态机的概念 状态机是软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。 比如说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态;再触发另一个键后切换到C状态,或者返回到A状态。这就是最简单的按键状态机例子。实际的按键解析程序会比这更复杂些,但这不影响我们对状态机的认识。 进一步看,击键动作本身也可以看做一个状态机。一个细小的击键动作包含了:释放、抖动、闭合、抖动和重新释放等状态。 同样,一个串行通信的时序(不管它是遵循何种协议,标准串口也好、I2C也好;也不管它是有线的、还是红外的、无线的)也都可以看做由一系列有限的状态构成。 显示扫描程序也是状态机;通信命令解析程序也是状态机;甚至连继电器的吸合/释放控制、发光管(LED)的亮/灭控制又何尝不是个状态机。 当我们打开思路,把状态机作为一种思想导入到程序中去时,就会找到解决问题的一条有效的捷径。有时候用状态机的思维去思考程序该干什么,比用控制流程的思维去思考,可能会更有效。这样一来状态机便有了更实际的功用。 程序其实就是状态机。 也许你还不理解上面这句话。请想想看,计算机的大厦不就是建立在“0”和“1”两个基本状态的地基之上么? 状态机的要素 状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下: ①现态:是指当前所处的状态。 ②条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。 ③动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。 ④次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

数字逻辑状态机例子

Digital System Design 1 2011/6/21 Computer Faculty of Guangdong University of Technology 例:用三进程状态机实现一个简单自动售货机控制电路,电路框图如下。该电路有两个投币口(1元和5角),商品2元一件,不设找零。In[0]表示投入5角,In[1]表示投入1元,Out 表示是否提供货品。

Digital System Design 2 2011/6/21 Computer Faculty of Guangdong University of Technology 根据题意,可分析出状态机的状态包括: S0(00001):初始状态,未投币或已取商品 S1(00010):投币5角 S2(00100):投币1元 S3(01000):投币1.5元 S4(10000):投币2元或以上 用独热码表示状态编码,如上所示。相应状态转换图如下(按Moore 状态机设计)。

Digital System Design 3 2011/6/21 Computer Faculty of Guangdong University of Technology 自动售货机状态转换图

Digital System Design 4 2011/6/21 Computer Faculty of Guangdong University of Technology 设计代码 第一个Always 块:状态转移。

Digital System Design 5 2011/6/21 Computer Faculty of Guangdong University of Technology 第二个Always 块:状态转移的组合逻辑条件判断

数字逻辑实验 8_序列检测器

实验八序列检测器的设计与仿真 一、实验要求 1.用VHDL语言设计一个Mealy机以检测“1101001”序列; 2.用VHDL语言设计一个Moore机以检测“1101001”序列; 3.在文本编辑区使用VHDL硬件描述语言设计逻辑电路,再利用波形编辑区进行逻辑功 能仿真,以此验证电路的逻辑功能是否正确。 二、实验内容 用VHDL语言设计各一个mealy和moore状态机测试“1101001”位串的序列检测器,并通过仿真波形验证设计的功能是否正确。 三、实验过程 由于在报告1中已经详尽描述了如何使用Quartus 2建立逻辑原理图和使用VHDL语言实现元件功能,所以本次的实验报告中便不再赘述上述内容,报告将主要就VHDL 语言描述实现元件的功能的过程进行阐述。 1.Mealy机 选择File→New,弹出新建文本对话框,在该对话框中选择VHDL File并单击OK按钮,进入文本编辑窗口,输入VHDL代码。 library ieee; use ieee.std_logic_1164.all; entity melay is port(clk,rst,d: in std_logic; z: out std_logic); end melay; architecture arc of melay is type state_type is(s0,s1,s2,s3,s4,s5,s6); signal state: state_type; begin process(clk,rst) begin if rst= '1' then state<=s0; elsif (clk'event and clk ='1') then case state is --1101001 when s0 => if d='1' then state<=s1; else

数字逻辑第7篇习题

画出图7-5中所示的S-R锁存器的输出波形,其输入波形如图X7-4所示。假设输入和输出信号的上升和下降时间为0,或非门的传播延迟是10ns(图中每个时间分段是10ns) 解: 用图X7-5中的输入波形重作练习题7-2。结果可能难以置信,但是这个特性在转移时间比传输时间延迟短的真实器件中确实会发生。 解: 将图X7-41中的电路与图7-12中的锁存器进行比较。请证明这两个电路的功能是一致的。图X7-41中的电路常用于某些商用D锁存器中,在什么条件下该电路性能更好? 解:当C=0时,输入端2个与非门都关断,功能相同。 当C=1时,输入端2个与非门等同于反相器,功能也相同。 从传输延迟和电路代价比较:图X7-41的优点为节省一个反相器,电路代价较小,电路建立时间少一个反相器延迟,所需建立时间较短。缺点为下端输入的传输延迟较长(与非门比反相器长)。

图7-34表示出了怎样用D触发器和组合逻辑来构造带有使能端的T触发器。请表示出如何用带有使能端的T触发器和组合逻辑来构造D触发器。 解:先写出对应的特性表,再建立相应组合逻辑的卡诺图,最后写出激励组合逻辑的最小和表达: + T? ? = D ' D 'Q Q 请示出如何使用带有使能端的T触发器和组合逻辑来构造J-K触发器。 解:先写出对应的特性表,再建立相应组合逻辑的卡诺图,最后写出激励组合逻辑的最小和表达: ? =' T? + Q K Q J 分析图X7-9中的时钟同步状态机。写出激励方程,激励/转移表,以及状态/输出表(状态Q1Q2=00~11使用状态名A~D)。 解:激励方程D1=Q1’+Q2 D2=XQ2’ 输出方程Z=Q1+Q2’ 激励/转移表:现态和输入为变量,激励为函数,根据D触发器特性方程,激励/转移表可表达:

51单片机多任务的原理及其实现

51单片机多任务操作系统的原理与实现 51单片机多任务操作系统的原理与实现 -- 一个超轻量级的操作系统 前言 想了很久,要不要写这篇文章?最后觉得对操作系统感兴趣的人还是很多,写吧. 我不一定能造出玉,但我可以抛出砖. 包括我在内的很多人都对51使用操作系统呈悲观态度,因为51的片上资源太少.但对于很多要求不高的系统来说,使用操作系统可以使代码变得更直观,易于维护,所以在51上仍有操作系统的生存机会. 流行的uCos,Tiny51等,其实都不适合在2051这样的片子上用,占资源较多,唯有自已动手,以不变应万变,才能让51也有操作系统可用.这篇贴子的目的,是教会大家如何现场写一个OS,而不是给大家提供一个OS版本.提供的所有代码,也都 是示例代码,所以不要因为它没什么功能就说LAJI之类的话.如果把功能写全了,一来估计你也不想看了,二来也失去灵活性没有价值了. 下面的贴一个示例出来,可以清楚的看到,OS本身只有不到10行源代码,编译后 的目标代码60字节,任务切换消耗为20个机器周期.相比之下,KEIL内嵌的 TINY51目标代码为800字节,切换消耗100~700周期.唯一不足之处是,每个任务要占用掉十几字节的堆栈,所以任务数不能太多,用在128B内存的51里有点难度,但对于52来说问题不大.这套代码在36M主频的STC12C4052上实测,切换任务仅需2uS. #include #define MAX_TASKS 2 //任务槽个数.必须和实际任务数一至 #define MAX_TASK_DEP 12 //最大栈深.最低不得少于2个,保守值为12. unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP]; //任务堆栈. unsigned char task_id; //当前活动任务号 //任务切换函数(任务调度器) void task_switch(){ task_sp[task_id] = SP; if(++task_id == MAX_TASKS) task_id = 0; SP = task_sp[task_id]; } //任务装入函数.将指定的函数(参数1)装入指定(参数2)的任务槽中.如果该槽中原来就有任务,则原任务丢失,但系统本身不会发生错误. void task_load(unsigned int fn, unsigned char tid) {

状态机讲义

Digital System Design 大部分数字系统都可以划分为控制单元和数据单元(存储单元)两个组成部分,通常,控制单元的主体是一个状态机,它接收外部信号以及数据单元产生的状态信息,产生控制信号序列。 1 2011/6/21Computer Faculty of Guangdong University of Technology

Digital System Design 有限状态机特别适合描述那些发生有先后顺序或者有逻辑规律的事情(其实这就是状态机的本质)。状态机的本质就是对具有逻辑顺序或时序规律事件的一种描述方法,即“逻辑顺序”和“时序规律”就是状态机所要描述的核心和强项,换言之,所有具有逻辑顺序和时序规律的事情都适合用状态机来描述。 2 2011/6/21Computer Faculty of Guangdong University of Technology

Digital System Design 1、基本概念 有限状态机(Finite State Machine,FSM)是表示实现有限个离散状态及其状态之间的转移等行为动作的数学模型。(关注Matlab的Stateflow) (1)状态:也叫状态变量。在逻辑设计中,使用状态划分逻辑顺序和时序规律。 状态名称、状态编码、进入/退出操作、内部转移、子状态、延迟事件 3 2011/6/21Computer Faculty of Guangdong University of Technology

Digital System Design (2)转移:指两个状态之间的关系,表示当发生指定事件且满足指定条件时,第一个状态中的对象将执行某些操作并进入第二个状态,即“触发”了转移。将触发转移之前的状态定义为“源”状态(初始状态),而触发转移之后的状态定义为“目标”状态(次态)。 初始状态、转移条件、警戒条件、转移操作、目标状态 4 2011/6/21Computer Faculty of Guangdong University of Technology

数字逻辑设计及应用复习题

………密………封………线………以………内………答………题………无………效…… 一、填空题(每空1分,共20分) 1、请完成如下的进制转换:22.7510= 10110.11 2= 26.6 8= 16.C 16; 2、F6.A 16= 246.625 10= 0010 0100 0110.0110 0010 0101 8421BCD = 0101 0111 1001.1001 0101 1000 余3码 3、-9910的8位(包括符号位)二进制原码是 11100011 ,8位二进制反码是 10011100 ,8位二进制补码是 10011101 ; 4、请问逻辑F=A /B+(CD)/+BE /的反函数F /= A C D E CD B /+ ; 解: ACDE CD B CDE B ACDE CD B CD AB ) E B (CD )B A ()BE )CD (B A ( F ///////////+=+++=+??+=++= 5、F(A,B,C)=Σm (2,4,6)=ПM( 0,1,3,4,7 ); 6、请问图1-6所完成的逻辑是Y= A ⊕B ; 解:通过真值表可以可到该逻辑: 7、74148器件是一个3-8编码器,它采用的编码方式是 优先编码 或 数大优先编码 ; 8、74283器件是一个4位全加器,它的内部逻辑电路与串行加法器不同,采用的是 超前进位 或 先行进位 方法来实现全加逻辑。 9、如果一个与或逻辑电路的函数式为:)C B )(B A (Y / / ++=,该逻辑存在静态冒险,现通过添加冗余项的方式来消除该冒险,则该冗余项为 (A /+C ) ; 10、请写出JK 触发器的特性方程:* Q = JQ /+K /Q ; 11、请写出T 触发器的特性方程:*Q = T ⊕Q 或者TQ /+T /Q ; 12、请写出D 触发器的特性方程:*Q = D ; 13、请写出SR 触发器的特性方程:*Q = S+R /Q ; 14、如果某组合逻辑的输入信号的个数为55个,则需要 6 位的输入编码来实现该逻辑。 解:采用的公式应该是log 255,向上取整 二、选择题(每题1分,共10分) 1、下面有关带符号的二进制运算,描述正确的是,其中X 是被加数,Y 是加数,S 为和: ①. [X]原码+[Y]原码=[S]原码 ②. [X]补码+[Y]补码=[S]补码 图1-6

51单片机常见的五种流水灯编写方式

51单片机常见的五种流水灯编写方式通过改变赋值实现流水灯 void main() { while(1) { P2=0xfe; delay1ms(500); P2=0xfd; delay1ms(500); P2=0xfb; delay1ms(500); P2=0xf7; delay1ms(500); P2=0xef; delay1ms(500); P2=0xdf; delay1ms(500); P2=0xbf; delay1ms(500); P2=0x7f; delay1ms(500); } } 通过公式运算实现流水灯 void main() { while(1) { uint a,b=1; P2=0xfe; delayms(500); for(a=0;a<7;a++) {

P2-=b; // P2=P2-b delayms(500); b=b*2; //都化为同一类型进制运算 } } } 通过操作符<<与“|”实现流水灯 (通过移位实现流水灯) void main() { uchar a,i; while(1) { a=0xfe; //点亮第一位LED灯 for(i=0;i<8;i++) { P2=a; a=a<<1; //左移一位 a=a|0x01; //左移一位后与0x01相或,保证左移后最低位为1 delay_ms(500); } } } 通过库函数_crol_(字符左移)实现流水灯 void main() { uint a; a=0xfe; while(1) { P2=a;a=_crol_(a,1); delay_ms(500); } } 采用数组实现流水灯

状态机设计

集成电路实验 状态机设计实验报告 专业:电子信息工程 姓名:江燕婷 学号:2011301200025

状态机设计(实验五)实验报告 一.实验目的 1. 掌握状态机设计的基本方法 2.学习利用状态机的方法实现控制电路 二.实验原理 有限状态机(Finite State Machine FSM)是时序电路设计中经常采用的一种方式,尤其适合设计数字系统的控制模块,在一些需要控制高速器件的场合,用状态机进行设计是一种很好的解决问题的方案,具有速度快、结构简单、可靠性高等优点。有限状态机非常适合用FPGA器件实现,用Verilog HDL的case 语句能很好地描述基于状态机的设计,再通过EDA工具软件的综合,一般可以生成性能极优的状态机电路,从而使其在执行时间、运行速度和占用资源等方面优于用CPU实现的方案。 有限状态机一般包括组合逻辑和寄存器逻辑两部分,寄存器逻辑用于存储状态,组合逻辑用于状态译码和产生输出信号。根据输出信号产生方法的不同,状态机可分为两类:米里型(Mealy)和摩尔型(Moore)。摩尔型状态机的输出只是当前状态的函数,如图1-1所示;米里型状态机的输出则是当前状态和当前输入的函数,如图1-2所示。米里型状态机的输出是在输入变化后立即变化的,不依赖时钟信号的同步,摩尔型状态机的输入发生变化时还需要等待时钟的到来,必须在状态发生变化时才会导致输出的变化,因此比米里型状态机要多等待一个时钟周期。 图1-1 摩尔型状态机图1-2 米里型状态机 状态机在硬件描述语言实现上,可使用单过程、双过程或三过程等不同的结构实现。状态机的状态实现上,可采用符号编码或显式数字编码。编码方式有顺序编码(自然二进制编码),一位热码(one-hot encoding),格雷(gray code)码等。顺序编码,简单状态寄存器占用少;一位热码输出译码电路简单;在状态顺序变化时,格雷码每次只有一位变化,避免产生输出信号毛刺。

verilog常用例子

2.6.1 Verilog基本模块 1.触发器的Verilog实现 时序电路是高速电路的主要应用类型,其特点是任意时刻电路产生的稳定输出不仅与当前的输入有关,而且还与电路过去时刻的输入有关。时序电路的基本单元就是触发器。下面介绍几种常见同步触发器的Verilog 实现。 同步RS触发器 RS触发器分为同步触发器和异步触发器,二者的区别在于同步触发器有一个时钟端clk,只有在时钟端的信号上升(正触发)或下降(负触发)时,触发器的输出才会发生变化。下面以正触发为例,给出其Verilog 代码实现。 例2-15 正触发型同步RS触发器的Verilog实现。 module sy_rs_ff (clk, r, s, q, qb); input clk, r, s; output q, qb; reg q; assign qb = ~ q; always @(posedge clk) begin case({r, s}) 2'b00: q <= 0; 2'b01: q <= 1; 2'b10: q <= 0; 2'b11: q <= 1'bx; endcase end endmodule 上述程序经过综合Synplify Pro后,其RTL级结构如图2-2所示。 图2-2 同步RS触发器的RTL结构图 在ModelSim 6.2b中完成仿真,其结果如图2-3所示

图2-3 同步RS触发器的仿真结果示意图 同步T触发器 T触发器也分为同步触发器和异步触发器,二者的区别在于同步T触发器多了一个时钟端。同步T触发器的逻辑功能为:当时钟clk沿到来时,如果T=0,则触发器状态保持不变;否则,触发器输出端反转。R 为复位端,当其为高电平时,输出Q与时钟无关,Q=0。 例2-16 同步T触发器的Verilog实现。 module sy_t_ff(clk, r, t, q, qb); input clk, r, t; output q, qb; reg q; assign qb = ~q; always @(posedge clk) begin if(r) q <= 0; else q <= ~q; end endmodule 上述程序经过综合Synplify Pro后,其RTL级结构如图2-4所示。 图2-4 同步T触发器电路的RTL结构图 在ModelSim 6.2b中完成仿真,其结果如图2-5所示

状态机方式按键扫描单片机程序

状态机方式按键扫描单片机程序 这是从51hei/bbs/dpj-19294-1.html这个单片机做的收音机里面截取出来的 一个子程序,完整的代码和 adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=17&is_app=0&jk=66a 41a025f30382d&k=%D4%AD%C0%ED%CD%BC&k0=%D4%AD%C0%ED%CD%B C&kdi0=0&luki=3&n=10&p=baidu&q=98059059_cpr&rb=0&rs=1&seller_id=1&si d=2d38305f21aa466&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1831118&u=http%3A%2 F%2Fwww%2E51hei%2Ecom%2Fmcu%2F1974%2Ehtml&urlid=0” id=“5_nwl” mpid=“5” target=“_blank”>原理图可从原帖下载. /*-----------状态机方式按键扫描-----------*/ /*------------外部晶振为12MHz-----------*/ /*--------最后修改2011.02.26--------------*/#include “STC12C5620AD.H”#include “Key_Scan.H”#define Key_Mask 0x0f //屏蔽不用的按键,不用的按键用0屏蔽 ?/********************** 声明外部变量**************************/extern uchar Work_Mode; //From Main.c/********************** 按键扫描读取**************************/uchar Key_Scan(void){static uchar Key_State=0; // 定义按键状态uchar Key_Press;uchar Key_Return=0x00; //定义按键返回的键值Key_Press=Key_Input&Key_Mask;//读按键I/O电平switch(Key_State){case 0: // 按键初始态if (Key_Press!=Key_Mask)Key_State=1; // 键被按下,状态转换到键 确认态break;case 1: // 按键确认态if (Key_Press==Key_Input&Key_Mask) {Key_Return=Key_Press; // 按键仍按下且键值键值,按键确认输出BEEP_DRV=1; // 驱动蜂鸣器Key_State=2;// 状态转换到键释放态} elseKey_State=0;// 按键已抬起或改变,并转换到按键初始态break;case 2:if

51单片机操作系统的实现+源代码

51单片机操作系统开发中的问题与技巧 附代码 引言 51系列单片机是美国Intel公司在1980年推出的高性能8位单片机,在我国的应用非常广泛。目前,在软件设计中需要软件工程师从底层做起,在系统软件设计方面需要做大量的重复性劳动。如果开发一套基于51系列单片机的操作系统,那么用户只需要编写各个任务的程序,不必同时将所有任务运行的各种情况记在心中,不但大大减少了程序编写的工作量,而且减少了出错的可能性。 1 开发平台的选择和论证 开发平台的选择至关重要,因为有时它不光影响进度、产品质量、可维护性等一般问题,还涉及到方案的可实现性。 在本系统中,选择51系列单片机作为操作系统的运行平台有以下原因。 首先,51系列单片机应用非常广泛,一大批性能优越的51兼容单片机相继推出。这里包括:低功耗、高速度和增强型的Philips公司的系列产品;完美地将Flash(非易失闪存技术)EEPROM与80C51内核结合起来的Atmel公司的系列产品;在抗干扰性能,电磁兼容和通信控制总线功能上独树一帜,其产品常用于工作环境恶劣场合的Siemens公司的系列产品以及一些其它公司的产品。既然产品如此丰富,性能如此优越,那么在处理多任务并且对实时性要求严格的系统设计中,为了充分挖掘单片机的潜能(尤其是在实时性方面),也是为了简化开发的过程,基于51系列单片机的实时操作系统的需求就十分强烈了。Keil公司的RTX51 Full就是一个基于51系列单片机的有实用价值的实时操作系统,但该操作系统是一个源码不公开的收费软件。 其次,借助于Keil C51的集成开发环境,完全可以开发出适用于51系列单片机的操作系统代码。 Keil C51软件提供丰富的库函数和功能强大的Windows界面集成开发调试工具。 另外重要的一点,Keil C51生成的目标代码效率非常高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时,更能体现高级语言的优势。C编译器能产生可重入代码,而且用C语言可以打开和关闭中断。 2 开发51单片机操作系统应注意的问题 (1)操作系统软件的代码不能太长

空调系统有限状态机的设计

空调系统有限状态机的设计 摘要:空调系统状态机自动控制是以可编程逻辑为核心,配以各种传感器,电机驱动,状态机,变频器等实现自动控制,能确保空调末端温度供给,降低系统运行费用和时间,从而节约资源,它必将日趋成熟,在人类的生活中大显身手。一直以来,环保问题时世界关注的焦点,各种替代能源动力车的出现,为空调业提出来新的课题与挑战。现代家用也得发展成为人们生活的追求,空调已成为人们的必备品。 关键字:FPGA,空调系统状态机,自动控制。

一、设计分析: 1.课程设计目的: 本课程设计的目的是在掌握EDA实验开发的初步使用基础上,了解EDA技术,对空调系统进一步了解,掌握其状态机的工作原理,掌握用Verilog实现状态机的方法。通过本课程的设计,更好的巩固加深基础知识的理解,独立完成仿真过程,增强理论联系实际,提高电路分析能力,为日后的学习奠定基础。 2.课程设计要求: 试设计一个空调系统状态机,它两个输入端A和B分别与传感器相连(用两位拨码开关模拟),用于检测室内温度。如果室内温度正常,则A和B均为0。如果室内温度过高,则A为“1”,B为“0”。如果室内温度过低,则A为“0”,B为“1”。根据A和B的值来判断当前的状态,如太热,则在液晶上显示TOO-HOT,并将输出端COOL 置为“1”,并显示,表明现在开始制冷;如太冷,则在液晶上显示TOO-COLD,并将输出端HEAT置为“1”,并显示,表明现在开始加热;如适中,则在液晶上显示JUST-RIGHT,COOL和HEAT都为“0”。 要求一: 由传感器检测室内温度,并将采集来的数据传输到控制系统的预处理单元,在预处理单元将采集来的温度信号与设定值相比较,来判断当前的状态 (太热、太冷或适中),然后将处理结果传输到控制单元,最后由执行机构接受控制单元输出的控制信号,控制

51单片机最小系统的讲解和制作

单片机最小系统介绍 单片机最小系统主要由电源、复位、振荡电路以及扩展部分等部分组成。最小系统原理图如图4.1所示。 图4.1最小系统电路图 电源供电模块 图4.1.1 电源模块电路图 对于一个完整的电子设计来讲,首要问题就是为整个系统提供电源供电模块,电源模块的稳定可靠是系统平稳运行的前提和基础。51单片机虽然使用时间最早、应用范围最广,但是在实际使用过程中,一个和典型的问题就是相比其他系列的单片机,51单片机更容易受到干扰而出现程序跑飞的现象,克服这种现象出现的一个重要手段就是为单片机系统配置一个稳定可靠的电源供电模块。 此最小系统中的电源供电模块的电源可以通过计算机的USB口供给,也可使用外部稳定的5V电源供电模块供给。电源电路中接入了电源指示LED,图中R11为LED的限流电阻。S1

为电源开关。 复位电路 图4.1.2 复位电路图 单片机的置位和复位,都是为了把电路初始化到一个确定的状态,一般来说,单片机复位电路作用是把一个例如状态机初始化到空状态,而在单片机内部,复位的时候单片机是把一些寄存器以及存储设备装入厂商预设的一个值。 单片机复位电路原理是在单片机的复位引脚RST上外接电阻和电容,实现上电复位。当复位电平持续两个机器周期以上时复位有效。复位电平的持续时间必须大于单片机的两个机器周期。具体数值可以由RC电路计算出时间常数。 复位电路由按键复位和上电复位两部分组成。 (1)上电复位:STC89系列单片及为高电平复位,通常在复位引脚RST上连接一个电容到VCC,再连接一个电阻到GND,由此形成一个RC充放电回路保证单片机在上电时RST脚上有足够时间的高电平进行复位,随后回归到低电平进入正常工作状态,这个电阻和电容的典型值为10K和10uF。 (2)按键复位:按键复位就是在复位电容上并联一个开关,当开关按下时电容被放电、RST也被拉到高电平,而且由于电容的充电,会保持一段时间的高电平来使单片机复位。 振荡电路 图4.1.3 振荡电路图 单片机系统里都有晶振,在单片机系统里晶振作用非常大,全程叫晶体振荡器,他结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片接的一切指令的执行都是建立在单片机晶振提供的时钟频率。 在通常工作条件下,普通的晶振频率绝对精度可达百万分之五十。高级的精度更高。有些晶振还可以由外加电压在一定范围内调整频率,称为压控振荡器(VCO)。晶振用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。 单片机晶振的作用是为系统提供基本的时钟信号。通常一个系统共用一个晶振,便于各

51单片机实现双机通信(自己整理的)

51单片机实现双机通信(自己整理的)

左边1号机,右边2号机,,功能实现 1号机程序 #include #define uint unsigned int #define uchar unsigned char sbit p10=P1^0; uchar a,b,kk; //uchar code d_c[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8 ,0x80,0x90,0xff}; void delay_ms(uchar y) { uchar i;

for(i=0;i<120;i++) ; } void put(uchar x) //发送函数 { SBUF=x; //SBUF:串行口数据缓冲器while(TI==0); //等待发送结束 TI=0; } void main() { uchar j; SCON=0x40; //串行口工作方式1,8位通用异步发送器 TMOD=0x20; //定时器1工作方式2 PCON=0x00; //波特率不倍增 TH1=0xf4; TL1=0xf4; //波特率2400 TR1=1; //定时器1开始计时 P2=0xc0;

{ if(p10==0&&j==0) { delay_ms(15); while(p10==0); kk=1; P2=0xf9; j=1; } if(p10==0&&j==1) { delay_ms(15); while(p10==0); kk=2; P2=0xa4; j=2; } if(p10==0&&j==2) { delay_ms(15); while(p10==0);

数字逻辑第7章习题

7.4 画出图7-5中所示的S-R锁存器的输出波形,其输入波形如图X7-4所示。假设输入和输出信号的上升和下降时间为0,或非门的传播延迟是10ns(图中每个时间分段是10ns) 解: 7.5 用图X7-5中的输入波形重作练习题7-2。结果可能难以置信,但是这个特性在转移时间比传输时间延迟短的真实器件中确实会发生。 解: 7.41 将图X7-41中的电路与图7-12中的锁存器进行比较。请证明这两个电路的功能是一致的。图X7-41中的电路常用于某些商用D锁存器中,在什么条件下该电路性能更好? 解:当C=0时,输入端2个与非门都关断,功能相同。 当C=1时,输入端2个与非门等同于反相器,功能也相同。 从传输延迟和电路代价比较:图X7-41的优点为节省一个反相器,电路代价较小,电路建立时间少一个反相器延迟,所需建立时间较短。缺点为下端输入的传输延迟较长(与非门比反相器长)。

7.6 图7-34表示出了怎样用D触发器和组合逻辑来构造带有使能端的T触发器。请表示出如何用带有使能端的T触发器和组合逻辑来构造D触发器。 解:先写出对应的特性表,再建立相应组合逻辑的卡诺图,最后写出激励组合逻辑的最小和表达: + T? ? = D ' D 'Q Q 7.7 请示出如何使用带有使能端的T触发器和组合逻辑来构造J-K触发器。 解:先写出对应的特性表,再建立相应组合逻辑的卡诺图,最后写出激励组合逻辑的最小和表达: ? =' T? + Q K Q J 7.12 分析图X7-9中的时钟同步状态机。写出激励方程,激励/转移表,以及状态/输出表(状态Q1Q2=00~11使用状态名A~D)。 解:激励方程D1=Q1’+Q2 D2=XQ2’ 输出方程Z=Q1+Q2’ 激励/转移表:现态和输入为变量,激励为函数,根据D触发器特性方程,激励/转移表可表达:

电子科技大学数字逻辑设计及应用作业答案



+ 我
查看考卷——作业提交 1


当前得分:15 分(总分:100 分),折合成百分制共 15 分。 返回
作业提交 1
1. 逻辑函数
,请问其反函数 。
()
()
()
[参考答案:] 分值:5
得分:
系统自动批改于 2019 年 9 月 19 日 14 点 35


2. 有关异或逻辑的描述不正确的是 。 () 异或逻辑的反函数是同或逻辑
() 异或逻辑的对偶逻辑是同或逻辑
() 一个逻辑变量和 0 异或得到的是其反函数
[参考答案:] 分值:5
0
得分:
系统自动批改于 2019 年 9 月 19 日 14 点 35



3. 已知一个逻辑的最小项之和为 F(, , )=∑m(0,4,7) ,以下哪个等式成立 。 ()
()
()
[参考答案:] 分值:5
5
得分:
系统自动批改于 2019 年 9 月 19 日 14 点 35


4. 下面所描述的逻辑函数表达式中,哪一种可以直接从真值表中得到,而无 需其他中间步骤 。
() 标准形式
() 最简与或式
() 与非-与非形式
[参考答案:] 分值:5
5
得分:
系统自动批改于 2019 年 9 月 19 日 14 点 35


5. 下面有关最小项
的描述正确的是 。
()
()
()
[参考答案:] 分值:5
0
得分:
系统自动批改于 2019 年 9 月 19 日 14 点 35


6. 下面有关逻辑函数的描述中,正确的是 。

相关文档
最新文档