新闻  |   论坛  |   博客  |   在线研讨会
单片机定时器程序
tvb2058 | 2007-09-14 14:12:44    阅读:13201   发布文章

;******************;
 ;    定时器程序
    ;
 ;    采用89c2051   ;

;******************;
 ;
      ;******************
     ;      伪定义
     ;
     ;******************
     SL     EQU   30H           ;SL存放秒的个位数

     SH    EQU   31H           ;SH存放秒的十位数
     ML    EQU   32H            ;ML存放分的个位数
     MH    EQU   33H           ;MH存放分的十位数
     HL     EQU   34H           ;HL存放时的个位数
     HH    EQU   35H            ;HH存放时的十位数
     ;
     L0     EQU   36H           ;L0~L3:
显示数据存储器
            L1    EQU   37H
     L2     EQU   38H
     L3    EQU   39H
     DSPLYP    EQU   3AH         ;
显示数据指针(DISPLAY-POINT)
     PLYTS     EQU   3BH         ;显示次数计数器
(DISPLAY-TIMES)
     ;
     LPLMOD   BIT   39H          ;低两位显示方式
(LOW-PLAY-MOD)
     HPLMOD   BIT   3AH         ;高两位显示方式
(HIGH-PLAY-MOD)
     BRIGHT    BIT   3BH         ;DISPLAY子程序参数:亮灭指示位

        ;
        TCOUNT   EQU   3CH         ;
时间计数器(TIME-COUNT)
        ;
        ADDRES  EQU   3DH           ;加1子程序参数

        MAX     EQU   3EH           ;加1子程序参数
     IFDEC    BIT   20H            ;BCD加法子程序参数
            ;
        R_MOD  EQU   3FH          ;
响铃方式参数
     ;
     LED4     BIT   30H            ;
发光管状态位
     BELL     BIT   P1.7           ;蜂鸣器
     SWITCH  BIT   P3.7           ;继电器
     FKEY     BIT   P3.0           ;功能键 (S1)
     MKEY    BIT   P3.1           ;修改键 (S2)
     ;
     WORKIN BIT   38H            ;
工作状态指示位
     ;

            ;******************
            ;     中断入口
    ;
         ;******************
      ORG    0000H
START:  LJMP  MAIN           ; 0000H  引向主程序

      LJMP  ERR            ; 0003H
      NOP
      NOP
      LJMP  ERR            ;
引向出错处理程序
      LJMP  PGT0           ; 000BH  引向中断处理程序PGT0
      NOP
      NOP
      LJMP  ERR            ; 引向出错处理程序

      LJMP  ERR            ; 0013H  INT1
      NOP
      NOP
      LJMP  ERR
      LJMP  ERR            ; 001BH  T1
      NOP
      NOP
      LJMP  ERR
      LJMP  ERR            ; 0023H
      NOP
      NOP
      LJMP  ERR
      LJMP  ERR            ; 002BH
      NOP
      NOP
         ;
      ;************
       ;  
主程序  ;
      ;************
        MAIN:   MOV   IE,  #00H            ;关中断

                    MOV   SP,  #57H            ;设置堆栈指针
                    MOV   PSW,  #00H          ;选用寄存器组0
                    MOV   TMOD, #11H          ;设定中断工作方式为T0和
T1
            ;
                    MOV   A, 56H
                    CJNE  A, #0AAH, CSTART     ;判上电复位标志,无标志转冷启动

                    MOV   A, 57H
                    CJNE  A, #55H,  CSTART      ;
无标志转冷启动
                    AJMP  HSTART               ;有上电复位标志转热启动
                    NOP
                   NOP
                    LJMP  ERR                  ;
软件陷阱,引向出错处理程序
    CSTART: MOV   P1, #0FFH             ;冷启动,全面初始化
                    MOV   P3, #0FFH
                    MOV   TCON,  #00H          ;
计时停止
                    MOV   TL0, #0B0H            ;赋中断T0初值
                    MOV   TH0, #3CH
                    MOV   TCOUNT, #0AH          ;
赋定时器初值
                    MOV   R5, #00H              ;R5为一空单元(备用)
                    MOV   R4, #00H              ; R4 为工作模式选择寄存器

                    MOV   SL, #00H              ;定时单元清零
                    MOV   SH, #00H              ;
                    MOV   ML, #00H             ;
                    MOV   MH, #00H             ;

                    MOV   HL, #00H             ;
                    MOV   HH, #00H             ;

                    MOV   PLYTS,  #64H         ;赋显示次数初值为100次
                     MOV   DSPLYP,  #L0  ;显示指针指向显存单元
                    MOV   L0,  #0AH           ;送显示数据"-----"
                    MOV   L1,  #0AH
                    MOV   L2,  #0AH
                    MOV   L3,  #04H
                    SETB   LED4                 ;LED4为数码管之间的发光二极管

                    SETB   LPLMOD              ;设定显示方式为闪烁
                    SETB   HPLMOD              ;
                    SETB   BRIGHT               ;
允许显示
      CLR    WORKIN              ;清工作标志 , 待命
                    AJMP  SETUP                ;转开始工作
                    NOP
      NOP
                    LJMP  ERR          ;
软件陷阱
         HSTART:    MOV   SCON, #00H    ; 有上电标志,热启动,清串行口控制寄存器
                    MOV   IP,  #00H      ; 清中断优先控制寄存器
                    SETB   FKEY           ;重设按键
                    SETB   MKEY
                    SETB   EA              ;
开中断
                    AJMP  BEGIN           ;转向继续工作
                    NOP
      NOP
                    LJMP   ERR            ;
软件陷阱
            SETUP:  SETB  EA               ;开中断
            ;
       MAIN1:   ACALL  DISPLY          ;
调用显示
              JB    FKEY,  JUDGE    ;按键扫描
       ACALL  KEYDLY        ;延时消抖动
       JB    FKEY,  JUDGE    ;无键按下转向判断是否到点
       CLR   ET0              ;功能键被按下,则
       CLR   TR0          ;暂停计时
                     ACALL MENU           ; 调用菜单设置程序
               BEGIN:  SETB  WORKIN          ;置工作标志位,开始工作
              SETB  ET0              ;开中断
   SETB  TR0              ;开始计时
   MOV   A, R4            ;移入工作模式选择
   RL    A           ;指针放大
                     MOV   DPTR,  #M_TAB
       JMP   @A+DPTR        ;
根据工作模式跳转到相应程序段
                M_TAB:  AJMP  WORK1
       AJMP  WORK2
       AJMP  WORK3
              AJMP  WORK4
              NOP
              NOP
              LJMP  ERR               ;
软件陷阱
WORK1:  ;
  WORK2:  CLR   SWITCH            ;
工作方式1和2:开继电器
          AJMP  MAIN2
          NOP
   NOP
          LJMP  ERR                ;
软件陷阱
  WORK3:  ;
WORK4:  SETB  SWITCH             ;
工作方式3和4:不开继电器
  MAIN2:  CLR   BELL                 ;蜂鸣器短鸣一声,以示开始工作
           ACALL  DL05S
           SETB  BELL
   JUDGE:  JNB WORKIN, MAIN1           ;
判断是否在定时之中
            MOV   A, SL                  ;判断秒是否为零
            JNZ   MAIN1
            MOV   A, SH                ;
判断秒是否为零
            JNZ   MAIN1
            MOV   A, ML                ;
判断分是否为零
            JNZ   MAIN1
            MOV   A, MH                ;
判断分是否为零
            JNZ   MAIN1
            MOV   A, HL                ;
判断时是否为零
            JNZ   MAIN1
            MOV   A, HH                ;
判断时是否为零
            JNZ   MAIN1                ;若时分秒全为零则
            CLR   ET0                  ; 停止计时
            CLR   TR0                  ;
            ACALL ACTION              ;
调用到点工作子程序
            AJMP  MAIN                ; 返回
            NOP
     NOP
            LJMP ERR                   ;
软件陷阱
     ;
        ;******************
     ;   
倒计时程序   ;
     ;******************
            PGT0:   CLR   EA               ;关中断

                    PUSH  ACC           ;保护现场
      PUSH  PSW
      PUSH  DPL
      PUSH  DPH
      MOV   PSW, #08H         ;
选用寄存器组1
      CLR   TR0                  ;暂停计时

      MOV   A,#0B7H             ;中断同步修正
      ADD   A,TL0
      MOV   TL0,A
      MOV   A,#3CH
      ADD   A,TH0
      MOV   TH0,A
                    SETB  TR0                  ;
恢复计时
                    DEC   TCOUNT               ;定时器T0每50 000毫秒溢出一次,则
      MOV   A,  TCOUNT           ; 溢出10次为0.5秒
             JNZ   OUTT0             ;判断是否到半秒
      MOV   TCOUNT, #0AH         ;
      CPL   LED4               ;
若到半秒LED取反
      JNB   LED4, OUTT0         ;LED每闪烁一次是一秒
      MOV   R0, #SH             ;移入秒位的地址
      SETB  IFDEC                ;BCD子程序参数,使其做减法
      ACALL ADDBCD            ;调用BCD子程序, 秒减1
      CJNE  R3, #99H, OUTT0      ;判断秒要否借位

                    MOV   SH, #05H            ;要借位则
                    MOV   SL, #09H            ; 送数据59(否则显示99)
      MOV   R0, #MH             ;移入分位的地址

      ACALL ADDBCD            ;分减1
      CJNE  R3, #99H, OUTT0     ;判断分要否借位

                    MOV   MH, #05H
                    MOV   ML, #09H
      MOV   R0, #HH
      ACALL ADDBCD
            OUTT0:  POP   DPH           ;
恢复现场
      POP   DPL
      POP   PSW
      POP   ACC
      SETB  EA
      RETI                    ;
中断返回
                    NOP
      NOP
                    LJMP ERR                    ;
软件陷阱
 ;
 ;
            ;**************************
     ;   BCD
子程序(加1或减1 )  ;
            ;**************************
   ADDBCD: MOV   A, @R0           ;移入被操作数的高位

            DEC   R0                ;指针减一
            SWAP  A
            ORL   A, @R0            ;
移入被操作数的低位
            MOV   B, #01H           ;B寄存器送立即数#01H
            MOV   C, IFDEC          ;若 减法标志位为1,则

            MOV   B.3,  C           ;
            MOV   B.4,  C           ; B
寄存器的值被改为#99H
            MOV   B.7,  C           ;
           ADD   A, B              ; 对一个压缩的BCD码加#99H等于对其减一

           DA    A                 ;BCD码调整
           MOV   R3, A             ;暂存结果
           ANL   A, #0FH           ;取低位码
           MOV   @R0, A           ;存数
           MOV   A, R3             ;取回结果
           INC   R0                ;指针加一
           SWAP  A                ;交换
           ANL   A, #0FH          ;取结果数的高位
            MOV   @R0, A          ;存数
            RET
            NOP
            NOP
            LJMP  ERR             ;
软件陷阱
     ;
        ;**************
 ;  
加1程序   ;
        ;**************
 ADDONE: MOV  R0, ADDRES   ;移入被加数单元的地址

                  CLR   IFDEC         ;设定BCD子程序做加法
                   ACALL ADDBCD      ;调用BCD子程序
                  CLR   C             ;判断被加数是否大于
                  MOV   A,  R3       ;最大值"MAX"
                  CJNE  A,  MAX, JGOVER
  JGOVER: JC    ENDADO
                  CLR   A            ;若大于"MAX",则清零

                  MOV   @R0, A
                  DEC   R0
                  MOV   @R0, A
 ENDADO: RET
                  NOP
                  NOP
                  LJMP   ERR       ;
软件陷阱
     ;
        ;******************
     ;  
调时快进程序  ;
        ;******************
   QUICK:    CLR   LPLMOD    ;设定显示方式不闪烁

                  CLR   HPLMOD
                  ACALL ADDONE      ;
调用加1子程序
                  MOV   L0,  R4       ;将工作模式选择数移入显存
                  INC   L0             ;加1转化成显示值
                  ACALL KEYDLY       ;延时
                  ACALL DL100
                  JNB   MKEY, QUICK      ;
判断键是否松开
                  SETB  LPLMOD          ;若松开则恢复闪烁显示方式
                  CJNE  R6, #02H, ENDQUK
                  SETB  HPLMOD
                  CLR   LPLMOD
  ENDQUK: RET
                  NOP
                  NOP
                  LJMP ERR             ;
软件陷阱
     ;
;
        ;******************
     ;  
功能菜单程序  ;
     ;******************
   MENU: MOV   R6,  #00H         ; 初始化;  R6 计功能键按键次数

               MOV   ADDRES,  #05H   ; 将 R5 的地址送入,以便于改变 R4 的值
               MOV   MAX, #04H        ; 定义工作模式选择寄存器R4 的最大值
               MOV   DSPLYP, #L0       ;定义显示指针指向显存
               SETB  LPLMOD       ;设定低两位数闪烁
               CLR   HPLMOD
               MOV   L0,  R4           ;
送显示数据"F-0X"
               INC    L0
               MOV   L1,  #00H
               MOV   L2,  #0BH
               MOV   L3,  #00H
               SETB  LED4
            ;
  WAITFK: ACALL DISPLY              ;等待F键释放

                JNB   FKEY,  WAITFK
  MENU1:  ACALL DISPLY
                JB    MKEY,  JGFKEY       ;M
键扫描
                ACALL KEYDLY             ;延时消抖动
                JB    MKEY,  JGFKEY       ; 未按下则转F键扫描
                CJNE  R6, #00H, NEXT1      ;
                MOV   SL, #00H            ;
若中途改变定时方式,则清除原计时数据
                MOV   SH, #00H
                MOV   ML, #00H
                MOV   MH, #00H
                MOV   HL, #00H
                MOV   HH, #00H
  NEXT1:  MOV   R2,  #00H            ;R2
用于判断按键时间是否超过0.5秒
  NEXT2:  ACALL ADDONE             ;调用加1程序
                MOV   L0,  R4              ;移入工作方式选择数
                INC    L0
                ;
  WAITMK: ACALL DISPLY             ;
等待M键释放
                INC   R2                    ;R2自增一
                CLR   C
                CJNE  R2, #0C8H, JGQUIC    ;
若R2大于等于200则调用快进子程序

  JGQUIC:  JC    WATMK1
                 ACALL QUICK
 WATMK1: JNB   MKEY,  WAITMK      ; R2小于200则等待M键释放

                ;
JGFKEY: JB    FKEY,  MENU1        ;
功能(F)键扫描
               ACALL KEYDLY             ;延时消抖动
               JB    FKEY,  MENU1        ;键未按下则转修改(M)键扫描
               INC   R6                   ;F键按键次数加1
               MOV   A,  R6              ;移入按键次数

               RL    A                ;指针放大
               MOV   DPTR,  #FUNTAB
               JMP   @A+DPTR            ;
根据按键次数跳转到相应的程序段

 

 FUNTAB: AJMP  WAITFK
                AJMP  SETLOW
                AJMP  SETHI
                AJMP  ENDMEN
                NOP
                NOP
                AJMP  ENDMEN
 ;STWKMD:                             ;工作模式设定,不需另外改变菜单

 ;
 SETLOW:  MOV   MAX, #60H         ;
设置低位(秒位或分位)
                  MOV   A,  R4             ;移入工作模式选择数

                  RL    A                ;指针放大
                  MOV   DPTR,  #FTAB1
                  JMP   @A+DPTR          ;
根据工作模式选择数跳转到相应的程序段
    FTAB1:  AJMP  SETSS
                  AJMP  SETM60
                  AJMP  SETSS
                  AJMP  SETM60
                  NOP
                  NOP
                  AJMP  WAITFK
SETSS:      MOV   DSPLYP, #SL          ;
设定显示区域为MM:SS
                  MOV   ADDRES, #SH
                  AJMP  WAITFK
 SETM60:  MOV   DSPLYP,  #ML       ; 设定显示区域为
HH:MM
                 MOV   ADDRES,  #MH
                AJMP  WAITFK
     ;
 SETHI:          CLR   LPLMOD               ;设置高位(分位或时位
)
                     SETB  HPLMOD              ;高两位数码管闪烁

                     MOV   MAX, #31H           ;最大数为30
                     MOV   A,  R4              ;移入工作模式选择数

                     RL    A                    ;指针放大
                     MOV   DPTR,  #FTAB2      ;移入表首地址
                     JMP   @A+DPTR           ;根据工作模式选择数跳转到相应的程序段
 FTAB2:        AJMP  SETM30
                     AJMP  SETHH
                     AJMP  SETM30
                     AJMP  SETHH
                     NOP
                     NOP
                     AJMP  WAITFK           ;
返回等待键释放
   SETM30:    MOV   ADDRES,  #MH   ;移入分位的地址
                     AJMP  WAITFK           ;转向等待键释放
      SETHH:   MOV   ADDRES,  #HH   ;移入时位的地址
                     AJMP  WAITFK          ;转向等待键释放
                    ;
   ENDMEN:  CLR   HPLMOD         ;
恢复不闪烁显示方式
                    RET
                    NOP
                    NOP
                    LJMP ERR              ;
软件陷阱
     ;
     ;****************
     ; 
到点工作程序 ;
     ;****************
 ACTION: MOV   L0,  R4           ;移入工作模式选择数

   

参与讨论
登录后参与讨论
xihu8  2015-03-23 13:37:50 

原理图在那要是有原图就好了

推荐文章
最近访客