如何使用定时器计数器.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如何使用定时器计数器

8.1 什么是定时器/计数器 8.2 为什么需要定时器/计数器 8.3 SPCE061A的定时器/计数器 8.4 定时器应用示例 第1页/共26页 8.1 什么是定时器/计数器 “定时器”是单片机系统中最基本、最常用的部件之一。什么是定时器呢?举一个简单的例子:假如我们下午4点要参加一个重要的会议,那么为了准时到场,我们要每过一段时间看看表,确定是不是该出发了。实际上还有更好的解决办法,就是设定一个闹钟,到时候提醒我们去开会,这样我们就可以专心做别的事情,省去了不断看表的麻烦。在单片机中,“定时器”就是充当了这个闹钟的角色。 第2页/共26页 下面我们简单了解一下定时器的工作原理。 第3页/共26页 通过设定计数初值实现定时 第4页/共26页 我们的程序怎样才能知道是否发生了计数溢出呢?这要涉及到“中断”的概念了。简单地说,每发生一次溢出,可以通过设置使CPU中止执行目前的程序(即“中断”),转而执行事先设计好的“处理计数溢出”的一段程序(即“中断服务程序”);当中断服务程序执行结束后,CPU会返回当初中断的位置,继续执行原来的程序。 第5页/共26页 第6页/共26页 8.2 为什么需要定时器/计数器 通过上一节的学习,我们对定时器/计数器有了一个大体上的了解。定时器/计数器的出现使我们拥有了既可精确计时又能及时提醒的“闹钟”,这将大大简化我们的程序设计。拿一个最简单的例子来说,要实现LED发光管每0.5秒闪烁一次,如果不使用定时器,就需要设计一个循环,经过繁琐的计算来确定循环需要执行的次数,从而实现延时0.5秒;有了定时器就方便得多,只需设定好计数频率和计数初值就可以了。 第7页/共26页 另外,对于某些功能需求,没有定时器/计数器是无法实现的。例如把上面LED闪烁的例子做一点点扩展,用按键控制一个LED发光管的亮灭,同时让另一个LED发光管每0.5秒闪烁一次。此时只有使用定时器才能实现0.5秒的准确定时了。 第8页/共26页 8.3 SPCE061A的定时器/计数器 SPCE061A单片机拥有两个16位的定时器——TimerA和TimerB,它们也可以作为计数器使用。“16位”就是说它的计数部件可以记录的最大数值是(216-1),即65535。 第9页/共26页 这两个定时器的使用方法非常简单,只需对单片机中的几个寄存器进行控制就可以了。两个定时器可以分别设置工作状态而互不影响。 第10页/共26页 SPCE061A的定时器控制寄存器 第11页/共26页 只要向上述几个寄存器里写入适当的数值就可以达到定时或计数的目的了。例如,要将TimerA设定为每0.43秒溢出一次,那么只需令P_TimerA_Ctrl的值为0x0032,再令P_TimerA_Data的值为0xC8F6就可以了。 第12页/共26页 8.4 定时器应用示例 设计程序使一个LED发光管以0.6秒为周期闪烁,即发光管每0.3秒点亮或熄灭一次。 分析题目要求,主要涉及两方面的操作,即控制LED发光管的亮灭以及定时0.3秒。对于LED发光管,只用一个IO就可以控制了(例如使用IOA0);而对于0.3秒定时,我们可以利用TimerA定时器轻易地实现。 第13页/共26页 首先设置P_TimerA_Ctrl寄存器。从《SPCE061A编程手册》或《SPCE061A单片机教材书》中可以查到,当P_TimerA_Ctrl设置为0x0032时, 定时器的计数频率将被设置为32768Hz。也就是说,CPU每1/32768秒向TimerA发出一次计数信号。我们需要定时0.3秒,也就是每次要等CPU发出0.3/(1/32768)=9830个计数信号之后对LED发光管进行一次点亮或熄灭操作。 第14页/共26页 怎样才能知道CPU已经发出了9830个计数信号?大体上有两种做法: 方法一:给定时器一个初始计数值0,开始定时后,程序不断查询P_TimerA_Data的值,当P_TimerA_Data达到9830时,表示0.3秒已经到了,再通过程序把P_TimerA_Data的值恢复为0,进行下一轮定时。这种方法比较简洁易懂,但缺点是明显的:程序需要不停地判断计数值是否达到了9830,一方面难以“集中精力”完成其他工作(本例题只需完成一项工作,因此这一点在本例中体现得并不明显),另一方面也浪费了大量的CPU时间。 第15页/共26页 方法二:与方法一相比,方法二的效率将大大提高,但是要利用“中断”了。给TimerA设定一个初始计数值,让它在这个初始值的基础上开始计数,在9830个计数信号之后刚好发生溢出,进入中断, 第16页/共26页 在中断服务程序中处理LED灯的点亮或熄灭工作。由于TimerA的最大计数值是6

文档评论(0)

peili2018 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档