学海荡舟手机网

主页 > 实用文摘 > 教育文摘_15 > > 详细内容

单时钟完成多点分别计时的实现和应用_嵌入式系统论文

 摘要:本文通过介绍只有双时钟的单片机系统,在多个事件需要分别定时或延时的时候,解决一个时钟完成多个计时延时的有效方法,通过这种方法可以达到对多个被控事件统一自动控制目的。

    关键词:单片机、定时器、机器周期、分频

    一、引言

    单片机作为嵌入式系统的微控制器,已经不是新鲜的事情,作为单片机的定时/计数器的使用可以说没有什么难度,但对于需要多个独立计时的事件,单片机的两个时钟显得有点不能满足要求,其实不然,合理的运用内存和标志位可以实现一个定时器充当多个计时时钟的效果,本文以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
                        pop        acc
                 pop        psw   
                        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
                        lcall    delay
                        clr      clock
                        lcall    delay
                        setb     clock
                        nop
                       
                        clr      clock
                        setb     g0
                        lcall    delay
                        ret