单时钟完成多点分别计时的实现和应用

发布时间:2010-11-16 16:15    发布者:eetech
关键词: 单时钟 , 多点 , 计时 , 实现 , 应用
本文通过介绍只有双时钟的单片机系统,在多个事件需要分别定时或延时的时候,解决一个时钟完成多个计时延时的有效方法,通过这种方法可以达到对多个被控事件统一自动控制目的。

一、引言  

单片机作为嵌入式系统的微控制器,已经不是新鲜的事情,作为单片机的定时/计数器的使用可以说没有什么难度,但对于需要多个独立计时的事件,单片机的两个时钟显得有点不能满足要求,其实不然,合理的运用内存和标志位可以实现一个定时器充当多个计时时钟的效果,本文以51系列单片机为例,实现一个时钟控制8个独立马达的运行过程中,时间分别统计方法。  

二、单片机计数/定时器的基本原理简介  

本文以51系列单片机为例介绍定时器的用法,定时/计数器的原理可以分为定时和计数两部分,定时器的原理是通过设定8位或16位的定时器单元,通过给定定时器单元的初值,然后启动定时器,于是定时器开始从初值开始累计,每增加一个数需要特定的时间,这个特定的时间是累加指令的机器周期,是由MCU的晶振的频率决定。对于51系列的单片机机器周期是时钟周期的1/12,也就是晶振频率的12分频。单片机的定时器原理上相当于一个16位的内存单元,通过TMOD可以设定定时/计数器的工作方式。计数值从初值计到全“1”,如果是16位方式则计数单元变成FF,此时并不产生中断,当下一个计数指令加1,导致存储单元溢出,在中断控制寄存器允许的情况下产生中断,通过中断服务程序执行特定的任务。计数器的原理不同之处在于,不是单纯的加指令,而是对外部的脉冲计数,常用来测量脉冲的宽度。  

三、时钟对多事件分别计数的具体途径  

对于实时性要求不是很高的时间可以通过如下方式实现。在完成基本的定时器工作方式设定以后,也就是设定定时器的计数方式,比如16位或8位,以及计数的初始值,以及启动中断的方式,建议使“SETB   TR0”的方式。并且允许中断。在中断服务程序中,开辟存储单元,以8个事件为例,每个事件不一定同时发生,每个事件发生以后以相同的时间延迟,再进行下一步的任务,为了完成定时延时,事件发生的时刻记作A1,A2,A3。。。。。。A10,中段服务程序中首先检查有无这些既定的事件发生,没有则不做任何处理,恢复计数初值后退出中断,相反,假如检测到AX(X=1、2、3。。。。。。)事件发生则给预先选定的对应的内存单元增加1,也就是执行累加运算,比如,  

A1"50H;表示A1对应的存储单元是50h
A2"51H;表示A2对应的存储单元是51h
A3"52H;
。   。
。   。
。   。
A7  57H;   表示A7对应的存储单元是57h  

假如A3事件发生,则对52H内存表示的地址单元增加1,使用的指令是“INC  52H”,可以预先计算事件延时时间与计数单元数值的关系,当对应的数值到了预先设定的值时,执行下一任务。比如开关操作等等,并且恢复初始值以便继续循环控制。这样可以分别对A1到A7,8个任务分别计时,时间可以相同也可以不同,具体的情况可以根据中断程序中寄存器累计的实际值与根据需要所设定的预定值比较而实现。  

四、典型应用  

也许大家都看到过繁华街道上的拼图式广告牌吧,有十几个或者几十个三棱柱,通过旋转,构成不同的画面,在每幅画面都停留一段时间,这正好是上面介绍的情况,当一个棱柱的某个画面转到特定的角度,比如正对马路的方向,该画面必须停留,等所有与此画面相连接而能拼成完整画面的其他柱面到来,也就是从柱面开始启动到下一次停下来需要所有画面经过相同的时间,然而所有的主面不可能同时启动,可能为了形成某种观赏效果,有意依次启动,或由中间开始启动,逐渐向两边延伸,等等,所有这些事件的转动控制实质就是定时控制,先启动,先停止。最终保证所有的画面构成一幅完整的画面,而且必须是一个平面,我通过这种方法成功地完成了8组和15组转动马达的起停控制,实践证明这种方法简单可行。部分原程序如下所示。基本流程和部分程序代码如下。  


  




  
以下是定时中断服务程序的全部代码,可以完成对8个事件的时间统计,并在时间满足条件时,调用子程序OUT01,是对外部开关的控制指令。通过这段程序,成功实现了一个定时器对多个事件的自动运行控制(以下程序仅供参考)。  

TIME0:  CLR   TR0
PUSH  PSW
PUSH  ACC
MOV   TL0,#22H;定时100ms重新启动定时器0
MOV   TH0,#1CH
   
LINSHI: MOV   A,2AH
CJNE   A,#0FFH,DEA
SETB   TR0
POPACC
POPPSW   
RETI
   
DEA:MOV   A,2AH
CJNE  A,#00H,DE1
MOV   A,2CH
CJNE  A,#00H,DE1
;SETB  TR0
POP   ACC
POP   PSW   
RETI
DE1:JNB   2AH.0,DEAL1
DE2:JNB   2AH.1,DEAL2
DE3:JNB   2AH.2,DEAL3
DE4:JNB   2AH.3,DEAL4I
DE5:JNB   2AH.4,DEAL5I
DE6:JNB   2AH.5,DEAL6I
DE7:JNB   2AH.6,DEAL7I
DE8:JNB   2AH.7,DEAL8I
LJMP  FINISH
  
DEAL4I: LJMP  DEAL4
DEAL5I: LJMP  DEAL5
DEAL6I: LJMP  DEAL6
DEAL7I: LJMP  DEAL7  
DEAL8I: LJMP  DEAL8
DEAL1:  JNB   2CH.0,DE2
INC   50H
MOV   A,50H
CJNE  A,#20,DE2
CLR   2CH.0
LCALL OUT01
mov   50h,#00h
LJMP  DE2
DEAL2:  JNB   2CH.1,DE3
INC   51H
MOV   A,51H
CJNE  A,#20,DE3
CLR   2CH.1
LCALL OUT01
MOV   51H,#00H
LJMP  DE3   
DEAL3:JNB   2CH.2,DE4
INC   52H
MOV   A,52H
CJNE  A,#20,DE4
CLR   2CH.2
LCALL OUT01
MOV   52H,#00H
LJMP  DE4
DEAL4:JNB   2CH.3,DE5I
INC   53H
MOV   A,53H
CJNE  A,#20,DE5I
CLR   2CH.3
LCALL OUT01
MOV   53H,#00H
DE5I:   LJMP  DE5
DEAL5: JNB   2CH.4,DE6I
INC   54H
MOV   A,54H
CJNE  A,#20,DE6I
CLR   2CH.4
MOV   54H,#00H
LCALL OUT01
DE6I:   LJMP  DE6
DEAL6:  JNB   2CH.5,DE7I
  INC   55H
MOV   A,55H
CJNE  A,#20,DE7I
CLR   2CH.5
LCALL OUT01
MOV   55H,#00H
DE7I:   LJMP  DE7
DEAL7:  JNB   2CH.6,DE8I
INC   56H
MOV   A,56H
CJNE  A,#20,DE8I
CLR   2CH.6
LCALL OUT01
MOV   56H,#00H
DE8I:   LJMP  DE8
DEAL8: JNB   2CH.7,FINISH
INC   57H
MOV   A,57H
CJNE  A,#20,FINISH
CLR   2CH.7
LCALL OUT01
MOV   57H,#00H  

FINISH: MOV   A,2CH
CJNE  A,#00H,TUI

  
SETB  TR0;SETB  TR0
POP   ACC
POP   PSW
RETI
TUI:SETB  TR0;开定时器   
POP   ACC
POP   PSW   
RETI
OUT01:  MOV  A,2CH
MOV  P2,A
CLR  G0
LCALLDELAY
CLR  CLOCK
LCALLDELAY
SETB CLOCK
NOP

CLR  CLOCK
SETB G0
LCALLDELAY
RET
本文地址:https://www.eechina.com/thread-39861-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

相关在线工具

相关视频

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表