教学材料《AVR单片机》-第七章_第1页
教学材料《AVR单片机》-第七章_第2页
教学材料《AVR单片机》-第七章_第3页
教学材料《AVR单片机》-第七章_第4页
教学材料《AVR单片机》-第七章_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

第一节实例11电子时钟设计一、需求分析和设计方案本实例中,我们的目标是设计一个界面友好、功能完善的电子时钟,这就要求我们按照电子时钟最常见的形式显示时间,并具有校时的功能。为达到这个目标,利用已经学习的技术,我们拟定如下的设计方案:(1)使用8位数码管显示时间,显示格式为“12-34-56",中间的短横线“一”每秒跳动闪烁;(2)使用4个按键,用于实现校时功能;下一页返回第一节实例11电子时钟设计(3)K1按键为设置开关键,用于开始和退出时间的设置(Setup);(4)K2按键为向上增大键,校时时增大时间数值(Up);(5)K3按键为向下减小键,校时时减小时间数值(Down);(6)K4按键为确定键,用于确定校时(Return);(7)时间设置时,短横线停止闪烁,设置小时时,闪烁显示“小时”数值,设置分钟时,闪烁显示“分钟”数值,设置秒时,闪烁显示“秒”数值(8)系统工作流程如图7一1上一页下一页返回第一节实例11电子时钟设计二、设计过程与模块化编程对于本实例,采用模块化的设计方法,我们画出如图7-2所示的设计过程图,这个图给出了组成程序所需要的模块,也粗略的显示了各个模块间的关系。上一页下一页返回第一节实例11电子时钟设计三、软件编写

1.建立主循环框架函数main.c

对于嵌入式系统,程序在微控制器一通电就开始运行,直到断电的时候停止运行。因此,嵌入式系统程序通常都是在通电时执行一些系统初始化工作,然后重复运行任务,其典型结构是一个超级循环,代码如下:上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计

2.编写通用内存管理模块对规模稍大的程序,内存管理是一个非常关键的问题,它直接决定着整个程序的成败,对于内存总量相对来说特别少的单片机而言,内存管理就显得更加重要了。程序中对内存的分配有两种,静态分配和动态分配。对于那些在程序编写时就已经能确定下来的内存需求,在程序编译时,就由编译器为我们分配固定的内存空间,这样的分配方法称为静态分配。比如,变量定义、数组定义,在变量和数组定义的时候,编译器就静态的为我们分配了固定的内存空间。静态分配对于内存管理而言,是很简单的,它基本不用我们用户关心,编译器已经为我们做好了这一切。对于大多数的单片机程序而言,使用静态内存就能满足我们的需求了。上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计

3.编写通用队列模块队列是一种数据结构,在单片机编程中经常用到,它的基本特点是“先进先出”,就好像到食堂买饭时,人多时就需要排队,先来的人先买到饭,后到的自然后买到饭。在单片机世界里,也经常遇到有大量任务等着单片机处理,但单片机目前又处于忙碌状态,无法立刻解决完所有的任务,这时任务就需要排队等待处理,这可以借助队列来实现。所以建立一个通用的队列模块是非常重要的,下面是队列模块的实现上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计4.系统时间管理模块该模块生成20ms的系统时间标志和闪烁需要的标志,是构成一个系统所必须的模块该模块使用了T/CO定时器,采用CTC模式定时5ms,利用这个5ms来产生需要的20ms标志。代码如下:上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计上一页下一页返回第一节实例11电子时钟设计仿真调试程序,仿真方法如下:在AVRStudio中,单击Debug菜单下的StartDebugging,进人仿真环境,如图7一3所示。图中左边一栏Processo:窗口可以查看程序运行时处理器内部寄存器数据,本实例中我们关注“StopWatch”,这里可以看到程序运行了多长时间。图中右边I/0View窗口可以供我们观察特殊功能寄存器的状态。现在我们在。sm(“nop)处点击鼠标右键,选择“Tog-gleBreakpoint”插入断点,表示程序运行到此处时暂停运行,插入断点后,可在该行代码的左边看到一个红色的圆点,如图7一3所示。上一页下一页返回第一节实例11电子时钟设计仿真之前我们再对仿真相关参数进行设置,单击Dehu。菜单下的“AVRSimulator2Op-tion”菜单项,弹出如图7-4所示对话框。在该对话框中设置工作频率等参数。仿真器参数设置完毕后,按FS运行代码,等待一段时间,将会看到程序停在第一个断点处(黄色箭头)指向这行,观察左边“StopWatch”中的值,现在时间确实过去了20ms反复按FS运行代码,我们可以看到代码如预期的在第一个断点处每20ms停顿,第500ms时在第二个断点处停顿。上一页下一页返回第一节实例11电子时钟设计5.消息管理模块消息管理在模块标准化程序的设计中占有举足轻重的作用,它是所有模块级别之间信息交流的桥梁。消息的结构:消息管理实际上对一个消息队列的管理,只不过增多了一些特征:(1)定义了消息的协议规范。(消息是可以带参数的)(2)中断中只能使用消息模块的压入(Push)函数,不能使用队列首部的压入(Push-Front)函数;上一页下一页返回第一节实例11电子时钟设计

(3)中断中也不能弹出消息,消息处理属于非实时概念和领域;(4)非中断下可以使用队列首部的压入(PushFront)函数,提前处理,保证要处理信息的连贯操作;(5)每一个消息是一个枚举量,即一个独立的数字,它对应着一个消息处理函数指针。上一页下一页返回第一节实例11电子时钟设计

6.设计通用按键扫描模块这个模块基于前面的消息管理模块的基础上编写,封装了对按键扫描过程的处理,它采用了回调函数的方式调用了外部和硬件有关的按键扫描码函数。按键扫描中用到了状态机的编程方法,该方法的原理可参见7.2节的介绍。7.加入按键测试功能这个模块中,我们提供具体的读按键状态函数,并加入按键消息处理的函数。上一页下一页返回第一节实例11电子时钟设计8.通用数码管显示模块这个模块封装了对8段LED数码管处理的通用部分,和通用按键扫描模块一样,将输出显示等和具体硬件电路有关的部分采用回调函数来提供,实现了本模块代码与硬件电路连接的独立性。现在这个模块对8个数码管显示进行管理,采用了最常用的(COM控制、SEC)输出位段的方式。上一页下一页返回第一节实例11电子时钟设计10.时钟控制模块在前面模块的基础上,我们来编写最后一个模块,这个模块实现了本实例的具体任务,控制时钟的运行和对时钟校时的功能,校时部分功能的实现又用到了状态机的编程方法。上一页返回第二节有限状态机

的概念及其实现方法一、有限状态机分析设计的基本原理一个简单的有限状态机由以下几个部分组成:(1)一个有限的状态集合s,在任意的某个时刻,系统只能处于该集合中的某一个状态s;(2)一个有限的输入信号的集合I,在任意的某个时刻,系统的输入信号为输入集合的全集或子集;(3)一个有限的输出信号集合O和一个输出函数,在任意的某个时刻,输出函数都将根据系统当前所处状态S和输入L,由给出一个输出信号·

上一页下一页返回第二节有限状态机

的概念及其实现方法

(4)一个状态转换函数,它为系统的每个状态和输入集合的每个输入给出了唯一的后继状态。

(5)一个触发序列,在满足触发条件的情况下,系统执行输出函数和状态转换函数产生一个输出和完成状态的转换。这个触发条件可能是一个输入事件,也可能是一个定时器的定时事件。上一页下一页返回第二节有限状态机

的概念及其实现方法二、基于状态机分析的简单按键设计采用状态机对一个系统进行分析是一项非常细致的工作,它实际上是建立在对真实系统有了全面深入的了解和认识的基础之上,进行综合和抽象化的模型建立的过程。这个模型必须与真实的系统相吻合,既能正确和全面的对系统进行描述,也能够适合使用软件或硬件方式来实现为了说明这个方法,这一小节里,我们以单个按键的识别操作为例,把单个按键作为一个简单的系统,根据状态机的原理对其动作和确认的过程进行分析,并用状态图表示出来,然后根据状态图编写出按键接口程序。上一页下一页返回第二节有限状态机

的概念及其实现方法首先我们对按键动作进行分析,以此作为按键状态机建模的基础。在一个嵌入式系统中,按键的操作是随机的,这意味着在任意时刻,连接按键的口线都可能由高(输入1)变为低(输入0)。但,考虑人的实际按键动作,一次按键操作的抖动时间大约为10ms,而按键稳定闭合期将大约为100ms以上如果我们对按键进行扫描,可能检测到按键的状态至少有两种:无按键和按键闭合。上一页下一页返回第二节有限状态机

的概念及其实现方法按键闭合又有两种可能:抖动、真正的按键。当我们以20ms为定时间隔来进行按键扫描时,如果第一次检测到按键闭合,这时还不能确定是抖动还是真正的按键,可是如果在已经检测到一次按键闭合的基础上,再第二次检测到按键闭合,就可以肯定不是抖动了。这样,简单的按键系统,用状态机来处理,就可能处于三种状态:无按键状态0,等待确认按键状态1,按键确认等待释放状态2。上一页下一页返回第二节有限状态机

的概念及其实现方法另一方面,我们再来看看系统的输入和输出。很明显,系统的输入信号是与按键连接的I/0口电平,"1”表示按键处于开放状态,"0”表示按键处于闭合状态。而系统的输出信号则表示检测和确认到一次按键的闭合操作,用“1”表示,没有检测到按键用“0”表示经过上面的分析后,我们可以画出如图7一5所示的简单按键状态机转换图。上一页下一页返回第二节有限状态机

的概念及其实现方法对于该按键状态机,我们采用10ms的定时事件作为状态转换的触发信号。图中“状态0”为按键的初始状态,当按键输入为“1”时,表示按键处于开放,输出“0”(1/0),下一状态仍旧为“状态0"。当按键输入为“0",表示按键闭合,但输出还是“0"(0/0)(没有经过消抖,不能确认按键真正按下),下一状态进入“状态1"

“状态1"等待确认按键状态1,它表示了在10m*前按键为闭合的,因此当再次检测到按键输入为“0”时,可以确认按键被按下了(经过20ms的消抖),输出“1”表示确认按键闭合(0/1),下一状态进入“状态2"。而当再次检测到按键的输入为“1”时,表示按上一页下一页返回第二节有限状态机

的概念及其实现方法键20ms前是闭合,而现在处于开放状态,说明20ms前的检测到的按键是由于抖动干扰造成的,输出为“0"(1/0),下一状态返回到“状态0"。这样,利用状态1,实现了按键的消抖处理

“状态2”为按键已确认等待按键释放状态,因为只有等按键释放后,一次完整的按键操作过程才算完成。从对图7一5的分析中可以知道,在一次按键操作的整个过程,按键的状态是从“状态0”一>“状态1”一>“状态2",最后返回到“状态。”的。并且在整个过程中,按键的输出信号仅在“状态1”时给出了唯一的一次确认按键闭合的信号“1"(其它状态均输出,’0”)。上一页下一页返回第二节有限状态机

的概念及其实现方法所以上面状态机所表示的按键系统,不仅克服了按键抖动的问题,同时也确保在一次按键整个的过程中,系统只输出一次按键闭合信号(y,)。换句话讲,不管按键被按下的时间保持多长,在这个按键的整个过程中都只给出了一次确认的输出,因此在这个设计中,按键没有“连发”功能,它是一个最简单和基本的按键一旦有了正确的状态转换图,就可以根据状态转换图编写软件了。在软件中实现状态机的方法和程序结构通常使用多分支结构(switch...c

温馨提示

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

最新文档

评论

0/150

提交评论