设计分享

2023-11-11

目录

具体功能:

设计介绍

单片机介绍

设计思路

设计内容

仿真图

程序


具体功能:

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

设计介绍

单片机介绍

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计分享 的相关文章

  • uniapp 微信小程序 web-view如何查看console.log和调试H5页面

    问题场景 在微信小程序的页面中 web view内嵌了另一个页面url 从小程序跳转到该H5页面的时候 看不到该H5页面的控制台调试信息console log值 解决方案 当从小程序跳转到H5页面的时候 在微信开发者工具模拟器页面的底栏 会
  • 基于stata的medsens包进行中介效应分析

    中介变量 mediator 是一个重要的统计概念 如果自变量 X 通过某一变量 M 对因变量 Y 产生一定影响 则称 M 为 X 和 Y 的中介变量 我们既往已经介绍了SPSS和R语言行中介效应分析 今天继续介绍stata中介效应分析 大家

随机推荐

  • 使用Swin-Transformer-Semantic-Segmentation训练自己的数据(语义分割,自己做数据)

    使用Swin Transformer Semantic Segmentation训练自己的数据 系统配置 代码链接 针对MMCV 选择系统 Windows环境要求 ubuntu 18 04 安装swin segmentation 制作VOC
  • [IC卡类型]带你认识 M1、UID、CUID、FUID、UFUID

    普通IC卡 0扇区不可以修改 其他扇区可反复擦写 我们使用的电梯卡 门禁卡等智能卡发卡商所使用的都是 M1 卡 可以理解为物业发的原卡 UID 卡 普通复制卡 可以重复擦写所有扇区 主要应用在IC卡复制上 遇到带有防火墙的读卡器就会失效 C
  • 运算符重载(实现日期类)

    对基本的数据类型 都支持 等操作 对于自定义类型 要实现这些操作就要自己编写函数 这时候 C 提供了运算符重载的语法 及简化了调用的代码 又增加了可读性 运算符重载的特征 operator 合法的运算符 构成函数名 eg operator
  • 安上这几个插件,使用JetBrains 家族软件效率翻个倍儿

    文章目录 前言 安装插件 方式一 编辑器内直接安装 方式二 插件主页安装 Background Image From Bing Chinese Simplified Language Pack 中文语言包 Gitee Indent Rain
  • 攻防世界web新手之disabled_button

    攻防世界web新手之disabled button 打开题目链接 发现有一按钮 但是无法按下 查看源码发现 是这个 disabled 在捣鬼 我们不能通过点击按钮提交表单 那大不了就手动提交嘛 使用Firefox的hackbar插件就很容易
  • 解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variabl

    解决 Dmaven multiModuleProjectDirectory system property is not set Check M2 HOME environment variable and mvn script match
  • 关于数码管

    数码管显示 数码管 数码管根据内部连接的不同分为共阴极和共阳极 八段数码管内部有8颗LED组成 如果想要显示特定字形 只需控制相应的LED亮起 其它LED熄灭即可 判断数码管是共阴极还是共阳极 如果是共阴极 中间公共脚为GND 如果是共阳极
  • 基于STM32的智能温室大棚

    本文将具体说明植物试验基地温室大棚监控系统设计开发详情和流程 该系统可实现以下这些功能 本系统设计主要有两大方向 一为自动操控界面 系统自动监测环境并根据监测到的参数执行相应的操作 二为人为手动控制 人为的监测环境并操控功能的打开 本系统设
  • centos7系统基础环境优化

    关闭selinux sed i s SELINUX enforcing SELINUX disabled g etc selinux config 关闭防火墙 systemctl disable firewalld systemctl st
  • 【dc-dc】降压恒压电源管理IC 平衡车控制器 电动车控制器 以太网交换机驱动芯片

    产品 AP8851 一款宽电压范围降压型DC DC 电源管理芯片 内部集成使能开关控制 基准电源 误差放大器 过热保护 限流保护 短路保护等功能 非常适合在宽输入电压范围具有优良的负载和线性调整度 AP8851 芯片包含每周期的峰值限流 软
  • Java项目:springboot+vue的简历信息网站—计算机毕业设计

    运行环境 开发工具 IDEA Eclipse 数据库 MYSQL5 7 应用服务 Tomcat7 Tomcat8 使用框架springboot vue 项目介绍 本选题则旨在通过标签分类管理等方式 实现管理员 首页 个人中心 用户管理 简历
  • 攻防世界 shrine 解题思路

    进入题目 发现一串源代码 但是不规则 所以我们ctrl u查看源代码 这样就整理好了代码 接下来就是审计代码了 我们来看看这个代码都写了啥 首先导入了两个模块 一个flask 一个os 然后用app route装饰器传了两个路径 那我们访问
  • 文件系统FastDFS和阿里云OSS

    文章目录 1 分布式文件存储 FastDFS 1 1 FastDFS简介 1 1 1 FastDFS体系结构 1 1 2 上传流程 1 2 FastDFS搭建 容器化部署 1 2 0 Vmware虚拟机配置 1 2 1 拉取镜像 1 2 2
  • helm和chart

    Helm helm是Kubernetes 应用的包管理工具 主要用来管理 Charts 类似Linux系统的yum Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件 可以在你部署应用的时候自定义应
  • Elasticsearch7.1中文文档-第四章-API约定

    Elasticsearch REST APIs是用HTTP暴露的 并且是基于JSON的 除非另有说明 否则本章中的约定都可以使用REST API来使用 多索引 索引名称中支持日期数学 公用选项 基于URL的访问控制 多索引 大多数引用ind
  • 清除浮动的4种方式

    为什么要清除浮动 清除浮动主要是为了解决 父元素因为子级元素浮动引起的内部高度为0的问题 如下 给父盒子设置一个boder 内部放两个盒子一个big 一个small 未给big和small设置浮动 则他们会默认撑开父盒子 当我给内部两个盒子
  • 基于单链表实现一元n次多项式的创建、输出和求和操作

    在主函数中调用函数CreatePolyn 函数创建两个多项式 2 3X 5X3 2X4 3 2X 4X2 然后调用函数AddPolyn求它们的和 最后打印出求和后的结果 提示 多项式数据结构定义 typedef struct pnode f
  • FBX+VS2015配置 留意

    1 下载安装FBX SDK 2 include 和 lib 包含目录以及库目录设置 3 以下选择一种 附加依赖项libfbxsdk lib 忽略特定默认库LIBCPMT lib C C 预处理器FBXSDK SHARED 附加依赖项libf
  • [计算机网络] TCP和UDP

    TCP报文 源端口 目的端口 序号 确认号 数据偏移 数据偏移还有个名称也叫首部长度 因为TCP首部是长度可变的 这个报文段到底多长 也就是说指出TCP数据部分在整个TCP报文段的什么位置 状态位 SYN发起联机 ACK回复 RST重新联机
  • 设计分享

    目录 具体功能 设计介绍 单片机介绍 设计思路 设计内容 仿真图 程序 具体功能 上电后滚动显示年 月 日 时 分 最后进入秒计时 通过四个按键可对时间进行设置操作 设计介绍 单片机介绍 51单片是一种低功耗 高性能CMOS8位微控制器 具