设计分享|基于51单片机的数字时钟(汇编)

本设计基于51单片机实现了一个多功能时钟系统,具备日期时间显示、秒表、闹钟等功能。系统采用CMOS 8位微控制器,支持多种定时器和中断机制,能够进行精确的时间管理。通过按键可以设置时间和调整闹钟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

具体功能:

设计介绍

单片机介绍

设计思路

设计内容

仿真图

程序


具体功能:

上电后滚动显示年、月、日、时、分,最后进入秒计时,通过四个按键可对时间进行设置操作。

设计介绍

单片机介绍

51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X51 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。

设计思路

文献研究法:搜集整理相关单片机智能手环系统相关研究资料,认真阅读文献,为研究做准备;

调查研究法:通过调查、分析、具体试用等方法,发现单片机智能手环系统的现状、存在问题和解决办法;

比较分析法:比较不同单片机智能手环系统的具体原理,以及同一类传感器性能的区别,分析单片机智能手环系统的研究现状与发展前景;

软硬件设计法:通过软硬件设计实现具体硬件实物,最后测试各项功能是否满足要求。

设计内容

仿真图

本设计利用protues8.7软件实现仿真设计,具体如图。

Protues也是在单片机仿真设计中常用的设计软件之一,通过设计出硬件电路图,及写入驱动程序,就能在不实现硬件的情况进行电路调试。另外,protues还能实现PCB的设计,在仿真中也可以与KEIL实现联调,便于程序的调试,且支持多种平台,使用简单便捷。

程序

本设计由汇编语言编写,主代码具体如下:​​​​​​​

DISBEG    EQU  30H          ;显示单元首地址CALB        EQU  P1.7         ;报警喇叭TIMCON     EQU  2FH        ;存放报时次数ORG    0000H                     ;程序开始LJMP        MAINORG     0003H           ;关外中断0RETIORG    000BH            ;定时器T0中断程序入口LJMP        INTT0            ;跳至INTTO执行ORG     0013H            ;关中断1RETIORG        001BH                ;定时器T1中断程序入口LJMP        INTT1          ;跳至INTT1执行ORG     0023H            ;关串行中断RETITAB:   DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH;共阳段码表          "0""1""2" "3""4""5""6""7" "8""9""不亮""A""-"I_TAB:  DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0C6H,0BFH,88H; 显示数  "0    1    2    3    4   5   6   7   8    9  不亮  C   -    A  "; 内存数  "0    1    2    3    4   5   6   7   8    9  0AH  0BH 0CH  0DH ";STAB表,启动时显示2008年10月14日、A06-3-67(学号)用STAB:   DB 0AH,0AH,0AH,0AH,0AH,0AH,07H,06H,0CH,03H,0CH,06H,00H,0DH,0AH,0AHDB 04H,01H,0CH,00H,01H,0CH,08H,00H,00H,02H,0AH,0AH,0AH,0AH,0AH,0AHDLY1M:   MOV    R6,#14H        ;1毫秒延时DL_LOOP:    MOV     R7,#19HDL_LOOP1:   DJNZ     R7,DL_LOOP1DJNZ     R6,DL_LOOPRETDLY20M:  CLR     CALB         ;20毫秒延时LCALL     D_II_PLAYLCALL    D_II_PLAYLCALL    D_II_PLAYSETB     CALBRETDL_LOOPS:  LCALL     DL05SLCALL     DL05SRETDL05S:     MOV       R3,#20H           ;8毫秒*32=0.196秒DL05S1:     LCALL     D_II_PLAYDJNZ      R3,DL05S1RET;程序开始                 ;;;整点报时用CTIME:     MOV      A,#10HMOV       B,79HMUL      ABADD      A,78HMOV      TIMCON,ACLOOP:      LCALL    DLY20MLCALL    DL_LOOPSLCALL    DL_LOOPSLCALL      DL_LOOPSDJNZ     TIMCON,CLOOPCLR      08H            ;清整点报时标志AJMP    MLOOP1;主程序开始MAIN:      LCALL ST                 ;上电显示年月日及班级学号MOV       R0,#00H        ;清00H-7FH内存单元MOV       R7,#80H        ;MLOOP:     MOV       @R0,#00H        ;INC       R0              ;DJNZ      R7,MLOOP      ;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)MOV       DISBEG,#70H     ;显示单元为70-75H;以下主程序循环MLOOP1:   LCALL     D_II_PLAY       ;调用显示子程序JNB     P1.0,T_SETSC    ;P1.0口为0时转时间调整程序JNB       P1.1,DLY5       ;秒表功能,P1.1按键调时时作减1加能JNB       P1.2,FUNBT     ;秒表STOP,PUSE,CLRJNB       P1.3,TSET       ;定时闹铃设定JB       08H,  CTIMEAJMP      MLOOP1       ;P1.0口为1时跳回MLOOP1FUNBT:    LJMP      DLY6;以下闹铃时间设定程序,按P1.3进入设定TSET:     LCALL     DLY20MJB        P1.3,MLOOP1    ;TS_LOOP:    JNB       P1.3,TS_LOOP    ;等待键释放JB       05H,CLRBELL    ;闹铃已开的话,关闹铃MOV      DISBEG,#50H    ;进入闹铃设定程序,显示50-55H闹钟定时单元MOV       50H,#0CH       ;"-"   闹铃设定时显示格式00:00: -MOV       51H,#0AH        ;"黑"MINCHG:   SETB      EALCALL     D_II_PLAYJNB      P1.2,DLY1        ;分加1JNB      P1.0,DLY3        ;分减1JNB      P1.3,DLY       ;进入时调整AJMP    MINCHGCLRBELL:    CLR      05H            ;关闹铃标志CLR      CALBAJMP      MLOOP1DLY:        LCALL     DLY20M        ;消抖JB      P1.3, MINCHGLJMP      DLY8           ;进入时调整T_SETSC:     LJMP     R_SETTIM       ;转到时间调整程序R_SETTIMDLY1:        LCALL     DLY20M        ;消抖JB      P1.2, MINCHGDLY2:      LCALL     D_II_PLAY      ;等键 释放JNB       P1.2, DLY2CLR       EAMOV       R0,#53H        ;LCALL     ADD_1        ;闹铃设定分加1MOV     A,R3          ;分数据放入ACLR       C               ;清进位标志CJNE      A,#60H,ADD_M  ;ADD_M:     JC       MINCHG         ;小于60分时返回ACALL    CLR_H          ;大于或等于60分时分计时单元清0AJMP      MINCHGDLY3 :     LCALL     DLY20M        ;消抖JB      P1.0, MINCHGDLY4:      LCALL     D_II_PLAY        ;等键 释放JNB       P1.0, DLY4CLR       EAMOV      R0,#53H        ;LCALL     SUB_M         ;闹铃设定分减1LJMP    MINCHG;以下秒表功能/时钟转换程序;按下P1.1 可进行功能转换DLY5:     LCALL     DLY20MJB        P1.1,T_MLOOP1JNB       P1.1,$CPL       03HJNB       03H,DIS_SETMOV       DISBEG,#60H    ;显示秒表数据单元MOV       60H,#00HMOV      61H,#00HMOV       62H,#00HMOV       63H,#00HMOV       64H,#00HMOV       65H,#00HMOV       TL1,#0F0H     ;10MS定时初值()MOV       TH1,#0D8H      ;10MS定时初值SETB      TR1SETB      ET1T_MLOOP1:  LJMP      MLOOP1DIS_SET:  MOV       DISBEG,#70H    ;显示时钟数据单元CLR       ET1CLR       TR1T_MLOOP11:  LJMP      MLOOP1;以下秒表暂停\清零功能程序;按下P1.2暂停或清0,按下P1.1退出秒表回到时钟计时DLY6:     LCALL     DLY20MJB        P1.2,T_MLOOP11T_EST11:     JNB       P1.2,T_EST11CLR       ET1CLR       TR1T_EST22:     JNB      P1.1,DLY5JB       P1.2,T_EST21LCALL     DLY20MJB        P1.2,T_EST22T_EST55:     JNB       P1.2,T_EST51MOV       60H,#00HMOV       61H,#00HMOV       62H,#00HMOV       63H,#00HMOV       64H,#00HMOV       65H,#00HT_EST33:   JNB      P1.1,DLY5JB       P1.2,T_EST31LCALL     DLY20MJB        P1.2,T_EST33T_EST44:     JNB       P1.2,T_EST41SETB      ET1SETB      TR1AJMP      MLOOP1;以下键等待释放时显示不会熄灭用T_EST411:    LCALL     D_II_PLAYAJMP      T_EST11T_EST21:     LCALL     D_II_PLAYAJMP      T_EST22T_EST31:   LCALL     D_II_PLAYAJMP      T_EST33T_EST41:    LCALL     D_II_PLAYAJMP      T_EST44T_EST51:    LCALL     D_II_PLAYAJMP      T_EST55; 1秒计时程序;T0中断服务程序INTT0:     PUSH      ACC           ;累加器入栈保护PUSH      PSW           ;状态字入栈保护CLR       ET0          ;关T0中断允许CLR       TR0             ;关闭定时器T0MOV       A,#0B7H         ;中断响应时间同步修正ADD       A,TL0           ;低8位初值修正MOV       TL0,A           ;重装初值(低8位修正值)MOV       A,#3CH          ;高8位初值修正ADDC      A,TH0          MOV       TH0,A           ;重装初值(高8位修正值)SETB      TR0             ;开启定时器T0DJNZ      R4, I_INT0        ;20次中断未到中断退出A_DDS:    MOV    R4,#14H          ;20次中断到(1秒)重赋初值
CPL       07H           ;闹铃时间隔呜叫用MOV     R0,#71H        ;指向秒计时单元(71H-72H)ACALL    ADD_1          ;调用加1程序(加1秒操作)MOV     A,R3                ;秒数据放入A(R3为2位十进制数组合)CLR       C                   ;清进位标志CJNE      A,#60H,A_DDM     A_DDM:    JC      I_INT0               ;小于60秒时中断退出ACALL    CLR_H             ;大于或等于60秒时对秒计时单元清0MOV    R0,#77H             ;指向分计时单元(76H-77H)ACALL    ADD_1             ;分计时单元加1分钟MOV     A,R3                ;分数据放入ACLR       C                   ;清进位标志CJNE      A,#60H,A_DDH      ;A_DDH:   JC       I_INT0               ;小于60分时中断退出ACALL     CLR_H            ;大于或等于60分时分计时单元清0LCALL     DLY20M            ;正点报时SETB     08HMOV    R0,#79H             ;指向小时计时单元(78H-79H)ACALL     ADD_1             ;小时计时单元加1小时MOV       A,R3                ;时数据放入ACLR       C                   ;清进位标志CJNE      A,#24H,RSTART       ;RSTART:   JC        I_INT0               ;小于24小时中断退出ACALL    CLR_H              ;大于或等于24小时小时计时单元清0I_INT0:     MOV       72H,76H             ;中断退出时将分、时计时单元数据移MOV       73H,77H             ;入对应显示单元MOV       74H,78H             ;MOV       75H,79H             ;LCALL    BELLPOP     PSW                 ;恢复状态字(出栈)POP       ACC                 ;恢复累加器SETB      ET0                 ;开放T0中断RETI                        ;中断返回;闪动调时程序\秒表功能程序;T1中断服务程序,用作时间调整时调整单元闪烁指示或秒表计时INTT1:       PUSH      ACC              ;中断现场保护PUSH      PSW               JB         03H, R_ADDS       ;=1时秒表MOV     TL1,   #0B0H      ;装定时器T1定时初值MOV       TH1,   #3CH       DJNZ      R2,I_INT1         ;0.3秒未到退出中断(50MS中断6次)MOV       R2,#06H           ;重装0.3秒定时用初值CPL       02H               ;0.3秒定时到对闪烁标志取反JB         02H,FLASH0        ;02H位为1时显示单元"熄灭"MOV       72H,76H           ;02H位为0时正常显示MOV       73H,77H           MOV       74H,78H          MOV       75H,79H          I_INT1:      POP      PSW               ;恢复现场POP       ACC               RETI                        ;中断退出FLASH0:    JB        01H,FLASH1        ;01H位为1时,转小时熄灭控制MOV      72H,7AH           ;01H位为0时,"熄灭符"数据放入分MOV     73H,7AH          ;显示单元(72H-73H),将不显示分数据MOV      74H,78H           MOV      75H,79H           AJMP     I_INT1            ;转中断退出FLASH1:     MOV       72H,76H           ;01H位为1时,"熄灭符"数据放入小时MOV      73H,77H           ;显示单元(74H-75H),小时将不显示MOV      74H,7AH       MOV       75H,7AH     AJMP     I_INT1            ;转中断退出R_ADDS :    CLR      TR1MOV       A,#0F7H           ;中断响应时间同步修正,重装初值(10ms)ADD       A,TL1             ;低8位初值修正MOV       TL1,A             ;重装初值(低8位修正值)MOV       A,#0D8H            ;高8位初值修正ADDC      A,TH1         MOV       TH1,A             ;重装初值(高8位修正值)SETB      TR1               ;开启定时器T0MOV     R0,#61H             ;指向秒计时单元(71H-72H)ACALL     ADD_1              ;调用加1程序(加1秒操作)CLR       C                  MOV       A,R3               JZ        R_ADDM             ;加1后为00,C=0AJMP      I_INT01              ;加1后不为00,C=1R_ADDM:    ACALL     CLR_H             ;大于或等于60秒时对秒计时单元清0MOV    R0,#63H             ;指向分计时单元(76H-77H)ACALL     ADD_1              ;分计时单元加1分钟MOV     A,R3               ;分数据放入ACLR       C                   ;清进位标志CJNE      A,#60H,R_ADDH     R_ADDH:   JC       I_INT01             ;小于60分时中断退出LCALL     CLR_H             ;大于或等于60分时分计时单元清0MOV    R0,#65H             ;指向小时计时单元(78H-79H)ACALL     ADD_1              ;小时计时单元加1小时I_INT01:    POP     PSW                 ;恢复状态字(出栈)POP       ACC                 ;恢复累加器RETI                        ;中断返回            ;; 加1子 程 序ADD_1:     MOV    A,@R0           ;取当前计时单元数据到ADEC    R0              ;指向前一地址SWAP      A               ;A中数据高四位与低四位交换ORL     A,@R0           ;前一地址中数据放入A中低四位ADD    A,#01H          ;A加1操作DA        A               ;十进制调整MOV       R3,A            ;移入R3寄存器ANL     A,#0FH          ;高四位变0MOV     @R0,A           ;放回前一地址单元MOV    A,R3            ;取回R3中暂存数据INC       R0              ;指向当前地址单元SWAP    A               ;A中数据高四位与低四位交换ANL     A,#0FH          ;高四位变0MOV    @R0,A           ;数据放入当削地址单元中RET                        ;子程序返回;分减1子 程 序              ;;SUB_M:    MOV    A,@R0           ;取当前计时单元数据到ADEC    R0              ;指向前一地址SWAP      A               ;A中数据高四位与低四位交换ORL     A,@R0           ;前一地址中数据放入A中低四位JZ        SUB_M1DEC    A               ;A减1操作SUB_M11:   MOV      3,A              ;移入R3寄存器ANL     A,#0FH          ;高四位变0CLR       C               ;清进位标志SUBB      A,#0AHSUB_M111:   JC      SUB_M110MOV     @R0,#09H        ;大于等于0AH,为9SUB_M10:    MOV    A,R3            ;取回R3中暂存数据INC       R0              ;指向当前地址单元SWAP    A               ;A中数据高四位与低四位交换ANL     A,#0FH          ;高四位变0MOV    @R0,A           ;数据放入当削地址单元中RET                       ;子程序返回;SUB_M1:   MOV      A,#59HAJMP      SUB_M11SUB_M110:  MOV     A,R3            ;移入R3寄存器ANL     A,#0FH          ;高四位变0MOV       @R0,AAJMP      SUB_M10;时减1子 程 序 SUB_H:    MOV    A,@R0           ;取当前计时单元数据到ADEC    R0              ;指向前一地址SWAP      A               ;A中数据高四位与低四位交换ORL     A,@R0           ;前一地址中数据放入A中低四位JZ        SUB_H1         ;00减1为23(小时)DEC    A                ;A减1操作SUB_H11:  MOV       R3,A            ;移入R3寄存器ANL     A,#0FH          ;高四位变0CLR       C               ;清进位标志SUBB      A,#0AH          ;时个位大于9为9SUB_H111:   JC      SUB_H110       MOV     @R0,#09H        ;大于等于0AH,为9SUB_H10:  MOV    A,R3            ;取回R3中暂存数据INC       R0              ;指向当前地址单元SWAP    A               ;A中数据高四位与低四位交换ANL     A,#0FH          ;高四位变0MOV    @R0,A           ;时十位数数据放入RET                       ;子程序返回SUB_H1:    MOV       A,#23HAJMP      SUB_H11SUB_H110:  MOV       A,R3            ;时个位小于0A不处理ANL     A,#0FH          ;高四位变0MOV       @R0,A           ;个位移入AJMP      SUB_H10;清零程序 ;对计时单元复零用CLR_H:     CLR     A               ;清累加器MOV     @R0,A          ;清当前地址单元DEC     R0              ;指向前一地址MOV     @R0,A           ;前一地址单元清0RET                          ;子程序返回;时钟时间调整程序;当调时按键按下时进入此程序R_SETTIM:  CLR      ET0                ;关定时器T0中断CLR     TR0                ;关闭定时器T0LCALL    DL_LOOPS        ;调用1秒延时程序LCALL     DLY20M           ;消抖JB      P1.0,SLEEP        ;键按下时间小于1秒,关闭显示(省电)MOV      R2,#06H           ;进入调时状态,赋闪烁定时初值MOV       70H,#00H           ;调时时秒单元为00 秒MOV      71H,#00HSETB     ET1                ;允许T1中断SETB     TR1                ;开启定时器T1SET_2:     JNB     P1.0,SET_1         ;P1.0口为0(键未释放),等待SETB      00H                ;键释放,分调整闪烁标志置1SET_4:     JB      P1.0,SET_3          ;等待键按下LCALL     DL05S              ;有键按下,延时0.5秒LCALL     DLY20M           ;消抖JNB        P1.0,R_SETHH       ;按下时间大于0.5秒转调小时状态MOV     R0,#77H           ;按下时间小于0.5秒加1分钟操作LCALL     ADD_1             ;调用加1子程序MOV     A,R3               ;取调整单元数据CLR     C                  ;清进位标志CJNE     A,#60H,SET_LOOP    ;调整单元数据与60比较SET_LOOP:   JC       SET_4              ;调整单元数据小于60转SET_4循环LCALL     CLR_H             ;调整单元数据大于或等于60时清0CLR     C                  ;清进位标志AJMP      SET_4             ;跳转到SET_4循环SLEEP:     SETB     ET0               ;省电(LED不显示)状态。开T0中断SETB     TR0               ;开启T0定时器(开时钟)SET_LOOP1:  JB       P1.0,SET_LOOP1      ;无按键按下,等待。LCALL     DLY20M           ;消抖JB        P1.0,SET_LOOP1     ;是干扰返回SET_LOOP1等待SET_LOOP2:  JNB       P1.0,SET_LOOP2     ;等待键释放LJMP      MLOOP1           ;返回主程序(LED数据显示亮)R_SETHH:    CLR      00H               ;分闪烁标志清除(进入调小时状态)SETB      01H                ;小时调整标志置1SET_LOOP3:  JNB     P1.0,SET_5          ;等待键释放SET_6:      JB      P1.0,SET_7          ;等待按键按下LCALL    DL05S             ;有键按下延时0.5秒LCALL     DLY20M            ;消抖JNB      P1.0,STOP        ;按下时间大于0.5秒退出时间调整MOV    R0,#79H           ;按下时间小于0.5秒加1小时操作LCALL    ADD_1              ;调加1子程序MOV    A,R3              CLR     C               CJNE     A,#24H,C_YHH        ;计时单元数据与24比较C_YHH:      JC       SET_6               ;小于24转SET_6循环LCALL     CLR_H               ;大于或等于24时清0操作AJMP     SET_6               ;跳转到SET_6循环STOP:     JNB       P1.0,STOP1         ;调时退出程序。等待键释放LCALL     DLY20M           ;消抖JNB       P1.0,STOP          ;是抖动,返回STOP再等待CLR       01H                ;清调小时标志CLR       00H                ;清调分标志CLR       02H                ;清闪烁标志CLR       TR1                ;关闭定时器T1CLR       ET1                ;关定时器T1中断SETB      TR0               ;开启定时器T0SETB      ET0                ;开定时器T0中断(计时开始)LJMP     MLOOP1             ;跳回主程序SET_1:    LCALL    D_II_PLAY            ;键释放等待时调用显示程序(调分)AJMP     SET_2               ;防止键按下时无时钟显示SET_3:    LCALL    D_II_PLAY            ;等待调分按键时时钟显示用JNB      P1.1, DLY7         ;减1分操作AJMP     SET_4               ;调分等待SET_5:    LCALL    D_II_PLAY            ;键释放等待时调用显示程序(调小时)AJMP     SET_LOOP3         ;防止键按下时无时钟显示SET_7:    LCALL    D_II_PLAY            ;等待调小时按键时时钟显示用JNB       P1.1, DLY7B         ;小时减1操作AJMP     SET_6                ;调时等待STOP1:    LCALL    D_II_PLAY            ;退出时钟调整时键释放等待AJMP     STOP              ;防止键按下时无时钟显示;DLY7,分减1程序?DLY7:      LCALL     DLY20M           ;消抖JB       P1.1,SET_41         ;干扰,返回调分等待DLY7_M:   JNB     P1.1,DLY7_M       ;等待键放开MOV     R0,#77H            LCALL     SUB_M             ;分减1程序LJMP      SET_4               ;返回调分等待;SET_41:     LJMP     SET_4             ;;DLY7B,时减1程序                                            ;DLY7B:    LCALL     DLY20M            ;消抖JB       P1.1,SET_61         ; 干扰,返回调时等待DLY7_H:   JNB      P1.1,DLY7_H        ; 等待键放开MOV     R0,#79H         LCALL    SUB_H              ; 时减1程序LJMP     SET_6               ; 返回调时等待SET_61:    LJMP      SET_6;显示程序                  ;;;显示数据在70H-75H单元内,用六位LED共阳数码管显示,P0口输出段码数据,P2口作;扫描控制,每个LED数码管亮1MS时间再逐位循环。D_II_PLAY:   MOV    R1,DISBEG         ;指向显示数据首址MOV    R5,#0FEH          ;扫描控制字初值PLAY:     MOV     A,R5              ;扫描字放入AMOV    P2,A              ;从P2口输出MOV     A,@R1             ;取显示数据到AMOV     DPTR,#TAB         ;取段码表地址MOVC    A,@A+DPTR       ;查显示数据对应段码MOV     P0,A              ;段码放入P1口MOV      A,R5           JB        ACC.2,D_LOOP     ;小数点处理CLR       P0.7          ;D_LOOP:     JB       ACC.4,D_LOOP1     ;小数点处理CLR        P0.7          ;D_LOOP1:    LCALL     DLY1M             ;显示1MSINC     R1                ;指向下一地址MOV     A,R5              ;扫描控制字放入AJNB     ACC.5,CLOSE      ;ACC.5=0时一次显示结束RL       A                 ;A中数据循环左移MOV     R5,A              ;放回R5内MOV     P0,#0FFHAJMP     PLAY              ;跳回PLAY循环CLOSE:     MOV      P2,#0FFH            ;一次显示结束,P2口复位MOV     P0,#0FFH           ;P0口复位RET                          ;子程序返回; SD_II_PLAY ,上电显示子程序;不带小数点显示,有"A""-"显示功能SD_II_PLAY: MOV      R1,DISBEGMOV     R5,#0FEH          ;扫描控制字初值I_PLAY:    MOV     A,R5              ;扫描字放入AMOV     P2,A              ;从P2口输出MOV     A,@R1             ;取显示数据到AMOV     DPTR,#I_TAB       ;取段码表地址MOVC    A,@A+DPTR       ;查显示数据对应段码MOV     P0,A              ;段码放入P1口MOV      A,R5          LCALL     DLY1M             ;显示1MSINC     R1              ;指向下一地址MOV     A,R5            ;扫描控制字放入AJNB     ACC.5,FLSH    ;ACC.5=0时一次显示结束RL       A                 ;A中数据循环左移MOV     R5,A             ;放回R5内AJMP     I_PLAY            ;跳回PLAY循环FLSH:    MOV      P2,#0FFH            ;一次显示结束,P2口复位MOV     P0,#0FFH           ;P0口复位RET                          ;子程序返回;ST,上电时显示年月班级用,采用移动显示,先右移,接着左移.ST:        MOV       R0,#40H          ;将显示内容移入40H-5FH单元MOV       R2,#20H      MOV      R3,#00H     CLR       A          MOV       DPTR,#STAB    S_LOOP:     MOVC       A,@A+DPTR      MOV       @R0,A         MOV      A,R3         INC       A            MOV      R3,A        INC          R0           DJNZ         R2,S_LOOP         ;移入完毕MOV        DISBEG,#40H      ;以下程序从左往右移SS_LOOP:   MOV       R2,#50             ;控制移动速度SS_LOOP1:  LCALL    SD_II_PLAY    DJNZ         R2,SS_LOOP1      INC          DISBEGMOV        A,DISBEGCJNE         A,#5AH, SS_LOOP   MOV        DISBEG,#5AH      ;以下程序从右往左移MOV        R3,#1BH           ;显示27个单元SS_LOOP2:  MOV       R2,#32H            ;控制移动速度SS_LOOP12: LCALL        SD_II_PLAY       ;DJNZ         R2,SS_LOOP12     ;DEC       DISBEGDJNZ         R3,SS_LOOP2      ;RET;以下是闹铃时间设定程序中的时调整程序DLY8:     LCALL     D_II_PLAY          ;等待键释放JNB       P1.3, DLY8MOV      50H,#0AH          ;时调整时显示为00:00:- .MOV      51H,#0CHR_BTIM:    SETB      EALCALL     D_II_PLAYJNB       P1.2,DLY12        ;时加1键JNB       P1.0,DLY14        ;时减1JNB       P1.3,DLY9          ;闹铃设定退出键JNB       P1.1,DLY10         ;闹铃设定有效或无效按键AJMP      R_BTIMDLY9:        LCALL     DLY20M           ;消抖JB       P1.3, R_BTIMDLY8M:      LCALL     D_II_PLAY           ;键释放等待JNB      P1.3, DLY8MMOV      DISBEG,#70HLJMP     MLOOP1DLY10:     LCALL     DLY20M           ;消抖        ;JB       P1.1, R_BTIMDLY11:    LCALL     D_II_PLAY           ;键释放等待JNB       P1.1, DLY11CPL      05HJNB      05H,R_BTIM11MOV      50H,#00H          ;05H=1,闹铃开,显示为 00:00:0。AJMP      R_BTIMR_BTIM11:   MOV      50H,#0aH          ;闹铃不开,显示为00:00:- .AJMP      R_BTIMDLY12:       LCALL     DLY20M            ;消抖        ;JB       P1.2, R_BTIMDLY13:      LCALL    D_II_PLAY           ;键释放等待JNB       P1.2, DLY13CLR       EAMOV       R0,#55HLCALL     ADD_1MOV      A,R3            ;CLR       C                 ;CJNE      A,#24H,A_DDH33N   ;A_DDH33N:   JC       R_BTIM          ;小于24点返回ACALL     CLR_H              ;大于等于24点清零AJMP      R_BTIMDLY14  :    LCALL     DLY20M             ;消抖        ;JB       P1.0, R_BTIMDLY15:      LCALL     D_II_PLAY           ;键释放等待JNB       P1.0, DLY15CLR       EAMOV       R0,#55HLCALL     SUB_HLJMP      R_BTIM;以下是闹铃判断子程序BELL:     JNB       05H,BBELL         ;05H=1,闹钟开,要比较数据MOV      A,79H           ;从时十位、个位、分十位、分个位顺序比较CJNE       A,55H,BBELLMOV      A,78HCLR        CBELL_1:      CJNE       A,54H,BBELLMOV      A,77HCLR       CCJNE       A,53H,BBELLMOV      A,76HCLR        CBELL_2:     CJNE       A,52H,BBELLJNB       07H,BBELL          ;07H在1秒到时会取反CLR        CALB             ;时分相同时呜叫(1秒间隔叫)RETBBELL:     SETB      CALB              ;闹铃不开RETEND
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值