⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oo.asm

📁 定时开关控制器
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;***************************************** 

;*     三路六个状态定时开关控制器        * 

;***************************************** 

;*    S1----对时按钮;S2--对分按钮     * 

;*    S3--对秒按钮;S4--退出对时     *   

;*    S5--设定预设值按钮               * 

;***************************************** 

TS      EQU    2DH         ;* TS 为秒计数器(二进制,0~24) 

TM      EQU    2EH         ;* TM 为分计数器(二进制,0~60) 

TH      EQU    2FH         ;* TH 为时计数器(二进制,0~60) 

K5      EQU    26H         ;S5状态 

KEYCODE EQU    29H         ;*KEYCODE 为键盘值 

TT0     EQU    2BH         ;*与T0配合构成为秒脉冲发生器 

CCB     EQU    20H         ;预设‘时间到’标志,为01H时表示时间到 

OFF     EQU    0FFH        ;预设值复位标志 

DPS0    EQU    11000000B      ;秒个位选通 

DPS1    EQU    11001000B      ;秒十位选通 

DPM0    EQU    11010000B    ;分个位选通 

DPM1    EQU    11011000B    ;分十位选通 

DPH0    EQU    11100000B     ;时个位选通 

DPH1    EQU    11101000B   ;时十位选通 

     

K1ON    DATA    30H    ;*第一个开启时间   30H  

K1OFF   DATA    33H    ;*第一个关闭时间   33H   

K2ON    DATA    36H    ;*第二个开启时间   36H       

K2OFF   DATA    39H    ;*第二个关闭时间   39H    

K3ON    DATA    3CH    ;*第三个开启时间   3CH    

K3OFF   DATA    3FH    ;*第三个关闭时间   3FH     

  

                             ORG 0000H              

AJMP     MAIN 

  

                             ORG 000BH             ;定时器0(T0)中断入口 

SJMP    I_T0 

  

                             ORG 001BH             ;定时器1(T1)中断入口 

I_T1:           AJMP MAIN1              

                  RETI                    

  

;*********   定时器0中断服务  ************** 

                             ORG 0060H              ;定时器T0中断服务程序 

I_T0:             PUSH   ACC 

                  PUSH   PSW 

                  MOV    TH0,#0DCH          ;0.01s时间,常数因子DC00H 

                  MOV    R3,TT0            

                  DJNZ   R3,I_T01          ;中断次数<100(每次中断0.01S),转出. 

                  MOV    R3,#100         ;中断次数=100次,重新下一个计数. 

                  MOV    A,TS            ;秒计数器加1 

                  ADD    A,#01H 

                  MOV    TS,A 

                  SUBB   A,#60                  ;秒计数器>59?  Y,秒计数器=00 

                  JC     I_T01 

                  MOV    TS,#00H 

                  MOV    A,TM                  ;分计数器加1 

                  ADD    A,#01H 

                  MOV    TM,A 

                  SUBB   A,#60                  ;分计数器>59? Y,分计数器=00 

                  JC     I_T01 

                  MOV    TM,#00H 

                  MOV    A,TH            ;时计数器加1 

                  ADD    A,#01H 

                  MOV    TH,A 

                  SUBB   A,#24                  ;时计数器>23? Y,时计数器=00 

                  JC     I_T01 

                  MOV    TH,#00H 

I_T01:         MOV    TT0,R3 

                  POP    PSW 

                  POP    ACC 

                  NOP 

NOP 

RETI 

  

;************   主程序   ******************** 

                  ORG 00F0H 

MAIN:        MOV   P0,#0FFH         ;主程序,初始化 

                  MOV   P1,#0FFH 

                  MOV   P2,#0FFH 

                  MOV   P3,#0F8H         ;p3.0~p3.2置低电平,使三个控制口关闭 

                  MOV   SP,#50H                ;初始化堆栈指针        

                  MOV   TMOD,#11H           ;T0工作于16位定时器 

                  MOV   TT0,#100         ;中断次数,每次0.01s*100=1s 

                  MOV   TH0,#0DCH            ;T0初值 

                  MOV   TL0,#00H 

                  MOV   TS,#00H          ;时间赋初值 

                  MOV   TM,#00H 

                  MOV   TH,#00H 

                  CLR    EX0           ;外部中断0失效 

                  CLR    EX1           ;外部中断1失效 

                  CLR    ES            ;串行口中断失效 

                  SETB   ET0            ;开T0 

                  SETB   TR0           ;激活T0 

                  SETB   EA            ;开总中断 

                  MOV    K5,#00H       ;S5键状态赋0 

          mov    r5,#14H       ;预设值全部赋FFH,数码管显示95.95.95 

                  mov    r1,#K1ON  

kk:             mov    @r1,#OFF 

                  INC    R1 

                  DJNZ   r5,kk 

MAIN1:      MOV    R6,#50H         ;循环显示80次,消除按键抖动 

DISP:         MOV    KEYCODE,#00H 

                  MOV    R1,#TS        ;R1保存时间存储区的首地址 

        MOV    A,K5         ;K5为S5的状态,在设定预设值时则为增量 

        ADD    A,R1 

        MOV    R1,A 

        NOP 

        NOP 

        ACALL  DISPLY       ;调用显示子程序 

             DJNZ   R6,DISP 

        MOV    A,K5          ;S5按下时不进行比较 

        JNZ    PP2 

        NOP 

        NOP 

        ACALL  COMP             ;判断预设置是否与当前时间相等, 

PP2:           MOV     DPTR,#KEY        ;设置转移表增量 

                  MOV     A,KEYCODE            ;读键盘值 

                  JMP     @A+DPTR              ;按键值跳到相应处理程序 

KEY:           SJMP    MAIN1 

                  SJMP    KEY1             ;设置小时值 

                  SJMP    KEY2             ;设置分钟值 

                  SJMP    KEY3             ;设置秒钟值 

                  SJMP    KEY4             ;退出设置 

                  SJMP    KEY5             ;设定预设置 

KEY1:         MOV     A,K5        ;如果S5按下,则TR0不停止计数 

        JNZ     KEY12        ;在设定预设置值时时钟不停止 

        CLR     TR0    

KEY12:       MOV    A,@R1 

                  CLR    C 

                  INC    A          ;时计数器加1 

                  MOV    @R1,A 

                  SUBB   A,#24              ;24D 

                  JC    KEY11 

                  MOV   @R1,#00H 

KEY11:    SJMP   MAIN1 

                  NOP 

KEY2:         MOV    A,K5         ;如果S5按下,则TR0不停止计数 

        JNZ    KEY22 

        CLR    TR0      

KEY22:       DEC    R1 

        MOV    A,@R1 

               CLR    C 

               INC    A            ;分计数器加1 

               MOV   @R1,A 

               SUBB   A,#60                ;60D 

               JC     KEY21 

               MOV    @R1,#00H 

KEY21:    SJMP   MAIN1 

                  NOP 

KEY3:         MOV   A,K5        ;如果S5按下,则TR0不停止计数 

          JNZ   KEY32 

          CLR   TR0                     ;秒计数器加1 

KEY32:       DEC   R1 

          DEC   R1 

          MOV   A,@R1 

                  CLR   C 

                  INC   A 

                  MOV   @R1,A 

                  SUBB  A,#60            ;60D 

                  JC    KEY31 

                  MOV   @R1,#00H 

KEY31:    SJMP   MAIN1     

                  NOP 

KEY4:         MOV    K5,#00H        ;退出时将K5清0 

          MOV    TH0,#0DCH        ;退出校时状态 

                  MOV    TL0,#00H 

                  SETB   TR0 

                  SJMP   MAIN1 

KEY5:     MOV    A,K5          ;修改预设置 

          CLR    C 

        SUBB  A,#12H   ;判断S5按钮是否越过设定区,如果越过则将K5清0并退出设定 

        JZ  KEY51 

        MOV A,K5 

        ADD  A,#03H 

        MOV  K5,A 

        AJMP KEY52 

KEY51:     MOV  K5,#00H 

KEY52:     LJMP MAIN1          

  

;***********   键盘和显示子程序  ************* 

                  ORG    0200H                ;显示子程序 

DISPLY:   MOV    A,@R1               ;秒计数器调入A 

                  MOV    B,#0AH 

                  DIV    AB           ;秒计数值÷10(结果十位从A,个位存于B)  

                  SWAP   A 

                  ORL    A,#0FH              ;显示秒的十位 

                  MOV    P1,A 

                  MOV    A,P3         ;输出位选信号,以下相同 

                  ANL    A,#0FH 

                  ORL    A,#DPS1 

                  MOV    P3,A 

          NOP 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -