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

当前位置:首页 > 单片机源码 > 详细内容
AT89C2051时钟程序
作者:佚名  发布时间:2009/10/14  阅读次数:3973  字体大小: 【】 【】【

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                     AT89C2051时钟程序                 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;   定时器T0、T1溢出周期为50MS,T0为秒计数用, T1为调整时闪烁用,
;     P3.7为调整按钮,P1口 为字符输出口,采用共阳显示管。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                     中断入口程序                           ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                           ORG 0000H               ;程序执行开始地址
                           LJMP           START   ;跳到标号START执行
                           ORG 0003H               ;外中断0中断程序入口
                           RETI                         ;外中断0中断返回
                           ORG 000BH               ;定时器T0中断程序入口
             LJMP           INTT0   ;跳至INTTO执行
                           ORG 0013H               ;外中断1中断程序入口
             RETI                         ;外中断1中断返回
             ORG 001BH               ;定时器T1中断程序入口
             LJMP           INTT1   ;跳至INTT1执行
             ORG 0023H               ;串行中断程序入口地址
                           RETI                         ;串行中断程序返回
;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;                     主 程 序                                 ;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
                       START: MOV     R0,#70H             ;清70H-7AH共11个内存单元
                                     MOV     R7,#0BH             ;
             CLEARDISP:   MOV     @R0,#00H             ;
                                     INC     R0                         ;
                                     DJNZ   R7,CLEARDISP     ;
                                     MOV     20H,#00H           ;清20H(标志用)
                                     MOV     7AH,#0AH             ;放入"熄灭符"数据
                                     MOV    TMOD,#11H           ;设T0、T1为16位定时器
                                     MOV     TL0,#0B0H       ;50MS定时初值(T0计时用)
                                     MOV     TH0,#3CH       ;50MS定时初值
                                     MOV     TL1,#0B0H       ;50MS定时初值(T1闪烁定时用)
                                     MOV     TH1,#3CH         ;50MS定时初值
                                     SETB   EA                         ;总中断开放
                                     SETB   ET0                       ;允许T0中断
                                     SETB   TR0                       ;开启T0定时器
                                     MOV     R4,#14H               ;1秒定时用初值(50MS×20)
                     START1: LCALL DISPLAY               ;调用显示子程序
                                     JNB    P3.7,SETMM1       ;P3.7口为0时转时间调整程序
                                     SJMP   START1                 ;P3.7口为1时跳回START1
                       SETMM1:           LJMP SETMM         ;转到时间调整程序SETMM
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                     1秒计时程序                           ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中断服务程序
                       INTT0: PUSH   ACC                     ;累加器入栈保护
                                     PUSH   PSW                     ;状态字入栈保护
                                     CLR     ET0                     ;关T0中断允许
                                     CLR     TR0                     ;关闭定时器T0
                                     MOV     A,#0B7H             ;中断响应时间同步修正
                                     ADD     A,TL0                 ;低8位初值修正
                                     MOV     TL0,A                 ;重装初值(低8位修正值)
                                     MOV     A,#3CH               ;高8位初值修正
                                     ADDC   A,TH0                 ;
                                     MOV     TH0,A                 ;重装初值(高8位修正值)
                                     SETB   TR0                     ;开启定时器T0
                                     DJNZ   R4, OUTT0                 ;20次中断未到中断退出
                     ADDSS:   MOV   R4,#14H                     ;20次中断到(1秒)重赋初值
                                     MOV    R0,#71H                     ;指向秒计时单元(71H-72H)
                                     ACALL ADD1                           ;调用加1程序(加1秒操作)
                                     MOV     A,R3                           ;秒数据放入A(R3为2位十进制数组合)
                                     CLR   C                                 ;清进位标志
                                     CJNE   A,#60H,ADDMM           ;
                     ADDMM:   JC      OUTT0                         ;小于60秒时中断退出
                                     ACALL CLR0                           ;大于或等于60秒时对秒计时单元清0
                                     MOV   R0,#77H                     ;指向分计时单元(76H-77H)
                                     ACALL ADD1                           ;分计时单元加1分钟
                                     MOV    A,R3                           ;分数据放入A
                                     CLR     C                                 ;清进位标志
                                     CJNE   A,#60H,ADDHH           ;
                       ADDHH: JC   OUTT0                         ;小于60分时中断退出
                                     ACALL CLR0                           ;大于或等于60分时分计时单元清0
                                     MOV   R0,#79H                     ;指向小时计时单元(78H-79H)
                                     ACALL ADD1                           ;小时计时单元加1小时
                                     MOV     A,R3                           ;时数据放入A
                                     CLR     C                                 ;清进位标志
                                     CJNE   A,#24H,HOUR             ;
                         HOUR: JC       OUTT0                         ;小于24小时中断退出
                                     ACALL CLR0                           ;大于或等于24小时小时计时单元清0
                       OUTT0: MOV     72H,76H                     ;中断退出时将分、时计时单元数据移
                                     MOV     73H,77H                     ;入对应显示单元
                                     MOV     74H,78H                     ;
                                     MOV     75H,79H                     ;
                                     POP    PSW                             ;恢复状态字(出栈)
                                     POP     ACC                             ;恢复累加器
                                     SETB   ET0                             ;开放T0中断
                                     RETI                                       ;中断返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                     闪动调时 程 序                       ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T1中断服务程序,用作时间调整时调整单元闪烁指示
INTT1:                   PUSH       ACC                               ;中断现场保护
                               PUSH       PSW                               ;
                               MOV         TL1,     #0B0H             ;装定时器T1定时初值
                               MOV         TH1,     #3CH         ;
                               DJNZ       R2,INTT1OUT         ;0.3秒未到退出中断(50MS中断6次)
                               MOV         R2,#06H                 ;重装0.3秒定时用初值
                               CPL         02H                         ;0.3秒定时到对闪烁标志取反
                               JB           02H,FLASH1           ;02H位为1时显示单元"熄灭"
                               MOV         72H,76H             ;02H位为0时正常显示
                               MOV         73H,77H             ;
                               MOV         74H,78H             ;
                               MOV         75H,79H             ;
INTT1OUT:             POP         PSW                  ;恢复现场
                               POP         ACC                     ;
                               RETI                                   ;中断退出
FLASH1:                 JB           01H,FLASH2       ;01H位为1时,转小时熄灭控制
                               MOV         72H,7AH             ;01H位为0时,"熄灭符"数据放入分
                               MOV         73H,7AH             ;显示单元(72H-73H),将不显示分数据
                               MOV         74H,78H             ;
                               MOV         75H,79H             ;
                               AJMP       INTT1OUT           ;转中断退出
FLASH2:                 MOV         72H,76H             ;01H位为1时,"熄灭符"数据放入小时
                               MOV         73H,77H             ;显示单元(74H-75H),小时数据将不显示
                               MOV         74H,7AH             ;
                               MOV         75H,7AH             ;
                               AJMP       INTT1OUT           ;转中断退出
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                     加1子 程 序                           ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
                         ADD1: MOV   A,@R0             ;取当前计时单元数据到A
                                     DEC   R0                   ;指向前一地址
                                     SWAP   A                     ;A中数据高四位与低四位交换
                                     ORL    A,@R0             ;前一地址中数据放入A中低四位
                                     ADD   A,#01H           ;A加1操作
                                     DA    A                     ;十进制调整
                                     MOV     R3,A               ;移入R3寄存器
                                     ANL    A,#0FH           ;高四位变0
                                     MOV    @R0,A             ;放回前一地址单元
                                     MOV   A,R3               ;取回R3中暂存数据
                                     INC   R0                   ;指向当前地址单元
                                     SWAP   A                     ;A中数据高四位与低四位交换
                                     ANL    A,#0FH           ;高四位变0
                                     MOV   @R0,A             ;数据放入当削地址单元中
                                     RET                                   ;子程序返回
     ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                     清零程序                                   ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;对计时单元复零用
                         CLR0: CLR     A                     ;清累加器
                                     MOV     @R0,A             ;清当前地址单元
                                     DEC     R0                   ;指向前一地址
                                     MOV     @R0,A             ;前一地址单元清0
                                     RET                                           ;子程序返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                     时钟调整程序                           ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;当调时按键按下时进入此程序
                     SETMM:   cLR     ET0                       ;关定时器T0中断
                                     CLR     TR0                       ;关闭定时器T0
                                     LCALL     DL1S                     ;调用1秒延时程序
                                     JB       P3.7,CLOSEDIS   ;键按下时间小于1秒,关闭显示(省电)
                                     MOV     R2,#06H               ;进入调时状态,赋闪烁定时初值
                                     SETB   ET1                       ;允许T1中断
                                     SETB   TR1                       ;开启定时器T1
                       SET2:   JNB     P3.7,SET1           ;P3.7口为0(键未释放),等待
                                     SETB     00H                       ;键释放,分调整闪烁标志置1
                       SET4:   JB       P3.7,SET3           ;等待键按下
                                     LCALL       DL05S                   ;有键按下,延时0.5秒
                                     JNB         P3.7,SETHH         ;按下时间大于0.5秒转调小时状态
                                     MOV     R0,#77H               ;按下时间小于0.5秒加1分钟操作
                                     LCALL   ADD1                     ;调用加1子程序
                                     MOV     A,R3                     ;取调整单元数据
                                     CLR     C                           ;清进位标志
                                     CJNE   A,#60H,HHH         ;调整单元数据与60比较
                           HHH: JC     SET4                     ;调整单元数据小于60转SET4循环
                                     LCALL   CLR0                     ;调整单元数据大于或等于60时清0
                                     CLR     C                           ;清进位标志
                                     AJMP     SET4                     ;跳转到SET4循环
               CLOSEDIS:   SETB    ET0                     ;省电(LED不显示)状态。开T0中断
                                     SETB    TR0                     ;开启T0定时器(开时钟)
               CLOSE:         JB        P3.7,CLOSE       ;无按键按下,等待。
                                     LCALL   DISPLAY             ;有键按下,调显示子程序延时削抖
                                     JB         P3.7,CLOSE         ;是干扰返回CLOSE等待
               WAITH:         JNB       P3.7,WAITH         ;等待键释放
                                     LJMP     START1                 ;返回主程序(LED数据显示亮)
                     SETHH:   CLR      00H                     ;分闪烁标志清除(进入调小时状态)
                   SETHH1:   JNB     P3.7,SET5           ;等待键释放
                                     SETB                 01H                       ;小时调整标志置1
                       SET6:   JB       P3.7,SET7           ;等待按键按下
                                     LCALL       DL05S                   ;有键按下延时0.5秒
                                     JNB         P3.7,SETOUT       ;按下时间大于0.5秒退出时间调整
                                     MOV     R0,#79H             ;按下时间小于0.5秒加1小时操作
                                     LCALL    ADD1                       ;调加1子程序
                                     MOV     A,R3                       ;
                                     CLR     C                               ;
                                     CJNE   A,#24H,HOUU           ;计时单元数据与24比较
                       HOUU:   JC     SET6                         ;小于24转SET6循环
                                     LCALL   CLR0                         ;大于或等于24时清0操作
                                     AJMP     SET6                         ;跳转到SET6循环
                     SETOUT: JNB       P3.7,SETOUT1         ;调时退出程序。等待键释放
                                     LCALL   DISPLAY                   ;延时削抖
                                     JNB       P3.7,SETOUT           ;是抖动,返回SETOUT再等待
                                     CLR       01H                           ;清调小时标志
                                     CLR       00H                           ;清调分标志
                                     CLR       02H                           ;清闪烁标志
                                     CLR       TR1                           ;关闭定时器T1
                                     CLR       ET1                           ;关定时器T1中断
                                     SETB     TR0                           ;开启定时器T0
                                     SETB     ET0                           ;开定时器T0中断(计时开始)
                                     LJMP   START1                     ;跳回主程序
                       SET1:   LCALL       DISPLAY                   ;键释放等待时调用显示程序(调分)
                                     AJMP         SET2                         ;防止键按下时无时钟显示
                       SET3:   LCALL       DISPLAY                   ;等待调分按键时时钟显示用
                                     AJMP         SET4
                       SET5:   LCALL       DISPLAY                   ;键释放等待时调用显示程序(调小时)
                                     AJMP         SETHH1                     ;防止键按下时无时钟显示
                       SET7:   LCALL       DISPLAY                   ;等待调小时按键时时钟显示用
                                     AJMP         SET6
                 SETOUT1:   LCALL       DISPLAY                   ;退出时钟调整时键释放等待
                                       AJMP       SETOUT                     ;防止键按下时无时钟显示
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                     显示程序                                   ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P1口输出段码数据,P3口作
; 扫描控制,每个LED数码管亮1MS时间再逐位循环。
                   DISPLAY: MOV     R1,#70H             ;指向显示数据首址
                                     MOV     R5,#0FEH           ;扫描控制字初值
                         PLAY: MOV     A,R5                   ;扫描字放入A
                                     MOV     P3,A                   ;从P3口输出
                                     MOV     A,@R1                 ;取显示数据到A
                                     MOV     DPTR,#TAB         ;取段码表地址
                                     MOVC    A,@A+DPTR         ;查显示数据对应段码
                                     MOV     P1,A                   ;段码放入P1口
                                     LCALL   DL1MS                 ;显示1MS
                                     INC     R1                       ;指向下一地址
                                     MOV     A,R5                       ;扫描控制字放入A
                                     JNB     ACC.5,ENDOUT       ;ACC.5=0时一次显示结束
                                     RL     A                             ;A中数据循环左移
                                     MOV     R5,A                       ;放回R5内
                                     AJMP   PLAY                       ;跳回PLAY循环
                     ENDOUT: SETB   P3.5                       ;一次显示结束,P3口复位
                                     MOV      P1,#0FFH             ;P1口复位
                                     RET                                           ;子程序返回
                         TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;共阳段码表                   "0""1""2" "3""4""5""6""7" "8""9""不亮"
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                     延时程序                                   ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;1MS延时程序,LED显示程序用
                         DL1MS: MOV   R6,#14H
                         DL1:     MOV   R7,#19H
                         DL2:     DJNZ   R7,DL2
                                       DJNZ   R6,DL1
                                       RET
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
                     DS20MS: ACALL    DISPLAY
                                     ACALL   DISPLAY
                                     ACALL   DISPLAY
                                     RET
;延时程序,用作按键时间的长短判断
                     DL1S:     LCALL           DL05S
                                     LCALL           DL05S
                                     RET
                   DL05S:     MOV               R3,#20H           ;8毫秒*32=0.196秒
                   DL05S1:   LCALL           DISPLAY
                                     DJNZ             R3,DL05S1
                                     RET
;
                                     END                                         ;程序结束

  

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

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

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