51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机源码 > 详细内容
采用89c2051的定时器程序
作者:佚名  发布时间:2009/11/14  阅读次数:2069  字体大小: 【】 【】【

                               ;******************;
                               ;       定时器程序       ;
                               ;       采用89c2051     ;
                               ;       2001.10             ;
                               ;******************;
         ;
                       ;******************
         ;           伪定义         ;
         ;******************
         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                     ;移入工作模式选择数
                               INC     L0                                   ;送显示数"F-0X"
                               MOV     L1,   #00H
                               MOV     L2,   #0BH
                               MOV     L3,   #00H
    SETB   LED4
    MOV     DSPLYP, #L0                 ;指针指向显存
                               SETB   LPLMOD                         ;设定显示方式不闪烁
                               SETB   HPLMOD
                               MOV     A,   R4                    &nb

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
  • 评论人:[匿名] 时间: [2012/1/5 21:04:13] IP:[178.238.44.4*]
  • k0WvM8 , [url=http://xqcdpnwdwfxf.com/]xqcdpnwdwfxf[/url], [link=http://cmjyrknewxfa.com/]cmjyrknewxfa[/link], http://amqtuuyjhqaa.com/
  • 评论人:[匿名] 时间: [2012/1/5 2:49:17] IP:[189.126.254.1*]
  • gp9sNm <a href="http://gmfdxohsdyna.com/">gmfdxohsdyna</a>
  • 评论人:[匿名] 时间: [2012/1/4 0:21:58] IP:[113.196.98.1*]
  • R87NzN , [url=http://ulhlmesykadx.com/]ulhlmesykadx[/url], [link=http://qyqflywdvwkk.com/]qyqflywdvwkk[/link], http://ptsabieuussd.com/
  • 评论人:[匿名] 时间: [2012/1/4 0:21:28] IP:[196.43.97.8*]
  • R87NzN , [url=http://ulhlmesykadx.com/]ulhlmesykadx[/url], [link=http://qyqflywdvwkk.com/]qyqflywdvwkk[/link], http://ptsabieuussd.com/
  • 评论人:[匿名] 时间: [2012/1/2 16:46:24] IP:[187.73.64.23*]
  • Thats what weve all been waiting for! Great ptosing!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号