单片机课程设计之 定时中断程序的设计 | 太极博弈原理官方站|紫欽天|融通百科为我所用|生活全智慧|生活智慧之书

正在阅读:

单片机课程设计之 定时中断程序的设计

967

 定时中断程序的设计

定时中断的内部结构前面我讲到,希望初学者要认真掌握,在此我们谨简单的列出与定时有关的寄存器,以便大家参考:

寄存器TMOD:

    T1

T0

GATE

C/T

M1

M0

GATE

C/T

M1

M0

门控位

 

方式

方式

门控位

 

方式

方式

TMOD被分成两部份,T1T0每部份4.分别用于控制T1T0, TCON也被分成两部份,4位用于定时/计数器,4位则用于中断(我们暂不管).TF10)我们上节课已提到了,当计数溢出后TF10)就由0变为1.原来TF10)在这儿!那幺TR0TR1又是什幺呢?

  寄存器TCON:

TF1

TR1

TF0

TR0

 

 

 

 

D7

D6

D5

D4

D3

D2

D1

D0

TR0/TR1:T0/T1的运行控制位,是中断的第二级开关,一级开关是EA;

TF0/TF1:T0/T1的溢出标识位,在中断查询中用得较多;它由硬件直接清0.

          对入定时的4种定式方式,希望大家了解一下即可,要用的时候再查资料也可以.

    下面我们有定时器T0模式0设计一个程序,P1.0端口的LED1秒,灭1秒; 执行方法如下:

       定时参数T为:1C18H  

                          定时时间  X  晶体频率

         T=  8192  - 

                                   12

 

       因为模式0只有13位,定时参数为:E018H

       我们先让定时器T0定时1毫秒,中断1000次为1秒,此时P1.0端口的LED1秒,在中断1000次为1秒,此时P1.0端口的LED1秒,周而复始,程序如下:   程序编号为TTT0.ASM

                       ORG                    0000H

                                   LJMP            MAIN

                                   ORG             000BH

                                   LJMP            TTT00

 

                                   ORG             0050H

              MAIN:

                           MOV            SP,#60H                 ;指针初始化

                    MOV              TMOD,#00H              ;设置定时寄存器

                                   MOV            TCON,#00H                       

                                   MOV            TL0,#18H            ;设置定时参数

                                   MOV            TH0,#0E0H         

                    MOV              50H,#00H            ;清定时中断次数

                    MOV              51H,#00H            

                                   SETB            TR0                            ;开定时中断

                                   SETB            ET0                      ;容许T0中断

                                   SETB            EA                       ;开中断

                     LOOP: 

  AJMP       LOOP                 ;

              TTT00:

                                   MOV            TL0,#18H            ;重设置定时参数

                                   MOV            TH0,#0E0H         

                    INC                50H                            ;中断次数加1

                                   MOV            A,50H                  

                                   CJNE            A,#0FFH,RN00   ;中断255次吗?

                                   MOV            50H,#00H            ;是,清0

                                   INC                     51H                            

                    MOV              A,51H                  

                                   CJNE            A,#04H,RN00            ;中断1000次吗?

                                   MOV            51H,#00H            ;是

                                   CPL                     P1.0                           P1.0状态取反

               RN00:

                                   RETI

                                   END

              下面我们通过外部终端来触发T0P1.0端口的LED1秒,周而复始执行,T0定义为模式2计数方式,初始值为:FFH,T0P3.4有负跳变时,计数器溢出,单片机产生中断,此时T1(模式0产生1毫秒定时,1000次后,P1.0端口状态发生翻转,程序设计如下:

程序编号为TTT1.ASM

               ONGTOGLLE     EQU      60H

                                ORG             0000H

                                   LJMP            MAIN

                                   ORG             000BH

                                   LJMP            TTT00

                    ORG        001BH

                    LJMP              TTT111

                                   ORG             0050H

              MAIN:

                           MOV            SP,#60H                 ;指针初始化

                    MOV              TMOD,#06H              ;设置定时寄存器

                                   MOV            TCON,#00H                       

                                   MOV            TL0,#0FFH         ;设置计数参数

                                   MOV            TH0,#0FFH         

                    MOV              50H,#00H            ;清定时中断次数

                    MOV              51H,#00H            

                                   SETB            TR0                            ;开定时中断

                                   SETB            ET0                      ;容许T0中断

                                   MOV            TL1,#18H            ;设置定时参数

                                   MOV            TH1,#0E0H         

                    MOV             ONGTOGLLE,#00H;                                                         SETB           EA                      ;开中断

                          LOOP:

                    MOV              A, ONGTOGLLE

                    CJNE              A,#01H,LOOP    ;有中断触发吗?

                    SETB              TR1                            ;有,开定时器T1

                                   SETB            ET1

LOOP0:

    AJMP       LOOP0               ;

TTT00:

     CLR                  TR0                                   ;关计数器T0

          MOV                    ONGTOGLLE,#01H        ;设置中断触发标识

          RETI

              TTT111:

                                   MOV            TL1,#18H            ;重设置定时参数

                                   MOV            TH1,#0E0H         

                    INC                50H                            ;中断次数加1

                                   MOV            A,50H                  

                                   CJNE            A,#0FFH,RN00   ;中断255次吗?

                                   MOV            50H,#00H            ;是,清0

                                   INC                     51H                            

                    MOV              A,51H                  

                                   CJNE            A,#03H,RN00            ;中断1000次吗?

                                   MOV            51H,#00H            ;是

                                   CPL                     P1.0                           P1.0状态取反

               RN00:

                                   RETI

                                   END

              上面的程序中,我们第一次用到了标志位ONGTOGLLE其实我们在设计上面的程序时,还是将它定义为一个数,原因是便于大家好理解,在许多大项目设计中,设置标志是非常有用的,当某种事情发生时,如果我不急着去处理此事,就设置一个标志,等到该处理此事时,只要判断此标志位即可,在用到标志位时特别要小心,如果此功能完全用完后,一定要将标志位还原,否则,程序再次执行到此处时又会执行一遍,周而复始。

              讲了这幺多,那幺中断到底有什幺用呢?

              中断的作用主要有: 当主程序在执行时,忽然来了一个外部事件要处理,这个外部事件就是中断,主程序马上停下来(当然要执行完最后一条完整的指令),处理中断事务,比如说:当你和同事在处理一个事情,忽然老板有急事找你,插入几句话,你必须停止下来和老板谈完后,又回到先前的事情中继续去做,这样做,才不会漏掉中间的某些事情,因而中断的作用非常明显,他通常在按键扫描,紧急事务处理中表现非常出色,下面我们用中断查询的方式来做一个低频频率计,大多频率计多是在此基础上开发出来的,只是这些产品在硬件上加了一些复杂的硬件电路和数字处理电路,所用的单片机也不一样,程序设计如下: (此程序用到定时T1中断,后面的程序我们会见到).

                                       VCC

 

 

 输入信号                         P3.2

                     

                     

 

 

    

            DISBUF   EQU      50H        ;50---53H显示缓冲区

            ORG     0000H

            LJMP         MAIN

            ORG          0100H

        MAIN:

            MOV         SP,#60H                            ;指针初始化

                   MOV            TMOD,#90H                     ;定时器1设置

            MOV         TL1,#00H                   ;定时器初值清0

            MOV         TH1,#00H                  

        NEXT0:

            JB              P3.2,NEXT0                      ;查询信号输入

            SETB  TR0                                          ;有信号,T0中断

              NEXT1:

           JNB             P3.2,NEXT1                      ;信号为高电平吗?

        NEXT2:

           JB         P3.2,NEXT2                    ;信号为低电平吗?

           CLR             TR0                                   ;是,关定时,测试完一个信号周期

                 MOV             A,TL1                                ;读低位定时值

           MOV           R0,# DISBUF                           ;显示缓冲器送R0

           XCHD  A,@R0                              ;低位定时值送50H

           SWAP   A                                       

           INC             R0                                      ;指向下一个显示缓冲区

           XCHD  A,@R0                              ;低位定时值送51H

           MOV           A,#TH1                             ;读搞位定时值

           INC             R0

           XCHD  A,@R0                              ;低位定时值送52H

           SWAP   A                                       

           INC             A

           XCHD  A,@R0                              ;低位定时值送53H

NEXT3:

LCALL DISPLAY                          ;调显示程序

AJMP   NEXT3                              

          以上程序只是示范程序,,没有太多的意义,显示器显示的只是信号的16进制周期值,并且只是捕捉到的一次值,如果有兴趣的同学可以进行硬件和软件的改进,在此不再累述。

抱歉,这篇文章关闭了评论功能。

关闭