单片机定时器的复用.docVIP

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

定时器的复用 一个单片机系统的设计经常会用到多种不同目的和用途的定时,例如系统需要输出一个指示“心跳正常”的秒闪信号,间隔0.5s;按键检测时临时需要约20ms的消抖;蜂鸣器需要发声延时;用户菜单选择时可能需要对应的发光管或LCD点阵(字段)闪烁;通讯时需要设定应答超时判别,等等。是不是要抱怨一个单片机上的若干个定时器不够用了?其实,用一个定时器资源就可以搞定所有的这一切定时要求。 首先,选定一个你喜欢的定时器,按所需应用的定时精度要求设定其定时中断频率。一般人机界面的定时精度为ms级就足够了,所以可以设定定时中断时间间隔为1ms,5ms或10ms;例如我的选择: // TPM2 overflow interrupt service routine // Interrupt at every 1ms void interrupt 14 TPM2_Overflow_ISR(void){ TPM2SC_TOF = 0; //reset interrupt flag msTimeoutCount++; //1ms increment } 变量msTimeoutCount是一个16位word型的静态变量,在中断服务程序中简单地对它递增,无需考虑溢出。如果你的中断时间间隔为Nms,则在中断中对其递增的方法为“msTimeoutCount += N”。它在程序模块的前面被声明,为了提高中断服务程序的效率,其被定位在直接寻址区: // Following data are declared in the direct addressing area //for fast access (address lt; 0x100) #pragma DATA_SEG SHORT MY_ZEROPAGE // direct addressing data segment volatile word msTimeoutCount; 然后写一段独立的定时判别函数。这个函数有两个入口参数:特定定时实例的一个定时变量指针和所需的定时时间长度。若定时时间长度为0,则定时过程被复位,实际上是当前的定时计数器值(msTimeoutCount)被复制到定时实例的一个定时变量中。返回值为0则表明定时时间未到,0xff则为一次定时时间到并自动开始下一次的定时过程。具体代码如下: // Check for timeout occurance // Input *timer - pointer of timer counter // timeOutVal - timeout value, 0=forced timer update // Return 0 - no timeout yet // 0xff - timeout occured and timer updated byte TimeOutChk(word *timer, word timeOutVal){ word shadow, diff; TPM2SC_TOIE = 0; 针对8位机必须禁止定时中断,16位机以上则无需如此 shadow = msTimeoutCount; 将当前时间计数值复制一份以作后需 TPM2SC_TOIE = 1; 对应上面的中断禁止,现在开放中断 if (timeOutVal= =0) { //复位定时过程 *timer = shadow; return(0); } else { diff = shadow - *timer; //计算定时时间间隔 if (diffgt;=timeOutVal) { //定时时间到 *timer += timeOutVal; //更新定时变量,开始下一次定时过程 return(0xff); // 返回时间到标志 } else { return(0); //定时时间未到 } } } 剩下的就看具体应用的需要而开辟特定的定时实例了。每一个实例必须有一个word型的变量作为定时跟踪变量。 例如产生500ms的定时(msCount变量在模块前面已经定义): void main(void) { ... TimeOutChk(amp;msCount, 0); //复位初始化定时实例 ... while(1) { Clock(); KeyScan(); ... } } //=============================================================// Keep the system clock running //=============================================

文档评论(0)

整理王 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档