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

📄 ttn.asm

📁 带双通道功能的秒表 该代码可以实现 双通道的计时以及显示当前时间的功能 通过SW2 SW3 可以修改当前时间 通过SW1 进入计时状态 在按SW1开始计时 而 SW2 SW3 保存计时结果 最好
💻 ASM
字号:
;----------------------------------------------------------
;带计时功能秒表
;----------------------------------------------------------
 SDATA   BIT  P1.4   ;定义74LS164串行移位数据端
 SCLK    BIT  P1.5   ;定义74LS164串行移位时钟端
 DIS     EQU  P1
 SW1     EQU  P3.2   ;INT0口
 SW2     EQU  P3.3   ;INT1口
 SW3     EQU  P3.4   ;T0口
 SW4     EQU  P3.5   ;T1口
 FLAG    EQU  32H
 MU      EQU  33H    ;控制蜂鸣器发声速度
 MS      EQU  10H    ;定义50ms计数器
 Secs    EQU  11H    ;定义秒计数器
 Minute  EQU  12H    ;定义分钟计数器
 Hour    EQU  13H    ;定义时计数器
;----------------------------------------------------------
   ORG   0000H
   LJMP  Main

   ORG   000BH
   LJMP  INT_T0
;------------------主程序及初始化模块----------------------
Main: MOV    SP,#60H         ;设置堆栈指针
      MOV    IE,#10000010B   ;允许T0中断

      MOV    TMOD,#01H       ;T0定时方式1

      MOV    TL0,#0F0H       ;T0定时10ms
      MOV    TH0,#0D8H
      CLR    TR0

      MOV    MS,#100         ;100*10ms=1s
      MOV    Secs,#0
      MOV    Minute,#0 
      MOV    Hour,#12H

      MOV    44H,#10H        ;进入计时状态显示----
      MOV    45H,#10H
      MOV    46H,#10H
      MOV    47H,#10H

      MOV    MU,#5           ;控制蜂鸣器发声速度
      MOV    FLAG,#0

      MOV    R5,#12
      MOV    R1,#34H
      LCALL  Clear
      SETB   TR0
LOOP: MOV    R1,#Minute
      LCALL  Split           ;调用拆分子程序
      MOV    B,#14H
      LCALL  DISP 
      LCALL  Verify          ;校对时间
      LCALL  count
      LJMP   LOOP
;-------------------清除计时单元模块---------------------------  
Clear: PUSH  ACC
       CLR   A               ;清除计时单元以及计时结果单元
Clear1:MOV   @R1,A
       INC   R1
       DJNZ  R5,Clear1
       POP   ACC
       RET
;------------校时校分模块----------------------------------
Verify:JB     SW4,VLP3      ;判断是否需要校"分"
 
       CLR    TR0
VLP1:  MOV    A,Minute      ;SW4闭合时,对分钟加1
       ADD    A,#1
       DA     A
       MOV    Minute,A
       CJNE   A,#60H,VLP2
       MOV    Minute,#0
VLP2:  MOV    R6,#40
       MOV    R1,#Minute
       LCALL  Split
       MOV    B,#14H
       LCALL  DISP
       DJNZ   R6,$-3
       JNB    SW4,VLP1      ;SW4未释放,继续对分钟加1
       MOV    Secs,#0       ;校时期间,将秒清零
       
       SETB   TR0
       RET
;----------------------------------------------------------
VLP3:  JB     SW3,VExit     ;判断是否需要校"时"
      
       CLR    TR0
VLP4:  MOV    A,Hour        ;SW3闭合时,对小时加1
       ADD    A,#1
       DA     A
       MOV    Hour,A
       CJNE   A,#24H,VLP5
       MOV    Hour,#0
VLP5:  MOV    R6,#40
       MOV    R1,#Minute
       LCALL  Split
       MOV    B,#14H
       LCALL  DISP
       DJNZ   R6,$-3
       JNB    SW3,VLP4      ;SW3未释放,继续对小时加1
       MOV    Secs,#0       ;校时期间,将秒清零
       
       SETB   TR0
VExit: RET
;------------------split模块------------------------------
Split:MOV   R0,#14H          ;分个位显示缓冲单元
      MOV   A,@R1
      ANL   A,#0FH           ;取分个位
      MOV   @R0,A
      INC   R0               ;分十位显示缓冲单元
      MOV   A,@R1
      SWAP  A
      ANL   A,#0FH           ;取分十位
      MOV   @R0,A
      INC   R0               ;时个位显示缓冲单元
      INC   R1
      MOV   A,@R1
      ANL   A,#0FH           ;取时个位
      MOV   @R0,A
      INC   R0               ;时十位显示缓冲单元
      MOV   A,@R1   
      SWAP  A
      ANL   A,#0FH           ;取时十位
      MOV   @R0,A
      RET
;-------------------计时器模块------------------------------
count: JNB    SW1,CLP0
       RET
CLP0:  PUSH   B               ;将B寄存器进栈保护
CLP1:  MOV    B,#44H          ;SW1按下低电位到松开高电位延时处理
       LCALL  DISP
       JB     SW1,CLP2
       LJMP   CLP1
CLP2:  MOV    B,#44H          ;计时主模块
       LCALL  DISP
       LCALL  countdisp
       LCALL  jishi
       JNB    SW1,CExit
       LJMP   CLP2
CExit: POP   B
CLP3:  MOV    R1,#Minute      ;SW1按下低电位到松开高电位延时处理
       LCALL  Split
       LCALL  DISP
       JB     SW1,RExit
       LJMP   CLP3
RExit: RET
;-----------------------显示计时结果模块-------------------      
countdisp:   
          JB      SW3,LLP1     ;按下SW3显示第一组结果
          MOV     B,#38H
          LCALL   DISP
          JNB     SW3,$-3
          RET
    LLP1: JB      SW4,TTExit   ;按下SW4显示第二组结果
          MOV     B,#3CH
          LCALL   DISP
          JNB     SW4,$-3
  TTExit: RET
;--------------------计时模块--------------------------
jishi: JNB    SW2,Sjishi     ;SW1为高电位,直接返回
       RET
Sjishi:                      ;SW1为低电位,开始计时
       PUSH   PSW
           
       MOV    FLAG,#1

       CLR    PSW.1
       CLR    PSW.5
       
LP3:   MOV    B,#34H          ;动态显示计时数据
       LCALL  DISP
       JB     PSW.1,LP4
       JB     SW3,LP4
       SETB   PSW.1
       MOV    38H,34H         ;保存第一组计时结果
       MOV    39H,35H
       MOV    3AH,36H
       MOV    3BH,37H
       JNB    PSW.5,LP4
      
       MOV    R5,#4           ;清除计时单元
       MOV    R1,#34H
       LCALL  Clear

       MOV    FLAG,#0         ;*计时结果保存后,将计时标记清除*

       SETB   P3.7            ;关闭蜂鸣器
       SETB   SW3
       SETB   SW4
       CLR    PSW.1
       CLR    PSW.5
       POP    PSW
       RET
;----------------------------------------------------------
LP4:   JB     PSW.5,LP3
       JB     SW4,LP3
       SETB   PSW.5
       MOV    3CH,34H         ;保存第二组计时结果
       MOV    3DH,35H
       MOV    3EH,36H
       MOV    3FH,37H
       JNB    PSW.1,LP3
       
       MOV    R5,#4           ;清除计时单元
       MOV    R1,#34H
       LCALL  Clear

       MOV    FLAG,#0         ;*计时结果保存后,将计时标记清除*  

       SETB   P3.7            ;关闭蜂鸣器
       SETB   SW3
       SETB   SW4
       CLR    PSW.1
       CLR    PSW.5
       POP    PSW
       RET
;-----------------定时器1中断入口----------------------------
INT_T0:                         ;定时器中断1,计时加1
        PUSH   PSW
        PUSH   ACC

        SETB   RS0
        SETB   RS1

        MOV    TL0,#0F0H  
        MOV    TH0,#0D8H
       
        DJNZ   MS,T0_NEXT
        MOV    MS,#100
        MOV    A,Secs
        INC    A
        MOV    Secs,A
        CJNE   A,#60,$+3
        JC     T0_NEXT
        MOV    Secs,#0
        MOV    A,Minute
        ADD    A,#1
        DA     A
        MOV    Minute,A
        CJNE   A,#60H,$+3
        JC     T0_NEXT
        MOV    Minute,#0
        MOV    A,Hour
        ADD    A,#1
        DA     A
        MOV    Hour,A
        CJNE   A,#24H,$+3
        JC     T0_NEXT
        MOV    Hour,#0
T0_NEXT:MOV    A,FLAG    
        CJNE   A,#1,$+2
        JC     T0_EXIT

        DJNZ   MU,NNEXT
        MOV    MU,#5
        CPL    P3.7
NNEXT:  MOV    R4,#4
        MOV    R1,#34H
LOOP1:  MOV    A,@R1
        ADD    A,#1
        DA     A
        MOV    @R1,A
        CJNE   A,#10H,T0_EXIT
        MOV    @R1,#0
        INC    R1
        DJNZ   R4,LOOP1
T0_EXIT: 
        POP    ACC
        POP    PSW
        RETI 
;-----------------显示子程序-------------------------------
DISP: PUSH   00H                 
      MOV    R0,B                 ;显示缓冲区首地址
      MOV    R2,#11111110B        ;对应位的字位码
      MOV    DPTR,#WordTab        ;送字形表首地址
DISP1:ORL    DIS,#00001111B
      MOV    R3,#30
      DJNZ   R3,$                 ;延时40us
      MOV    A,@R0                ;取待显示数字
      MOVC   A,@A+DPTR            ;查字形
      MOV    20H,R2               ;取字位码
      JB     02H,WordOut          ;判断小数点位
      SETB   ACC.7
WordOut:MOV   R3,#8               ;传送字型码到74LS164
NEXTB:  RLC   A                   ;取待发送位
        MOV   SDATA,C             ;送数据到数据口
        SETB  SCLK                ;产生时钟
        CLR   SCLK
        DJNZ  R3,NEXTB            ;继续送下一位
        INC   R0
        MOV   A,R2                ;取字位码
        ANL   DIS,A
        LCALL DELAY
        MOV   A,R2                ;修改字位码
        RL    A
        MOV   R2,A
        JB    ACC.4,DISP1
        POP   00H
DExit:  RET
;----------------------------------------------------------
WordTab:DB  3FH,06H,5BH,4FH   ;"0","1","2","3"
        DB  66H,6DH,7DH,07H   ;"4","5","6","7"
        DB  7FH,6FH,77H,7CH   ;"8","9","A","B"
        DB  39H,5EH,79H,71H   ;"C","D","E","F"
        DB  40H,38H           ;"-","L"
;----------------------------------------------------------
DELAY:  MOV   R3,#5          ;延时1ms
        MOV   R4,#100
        DJNZ  R4,$
        DJNZ  R3,$-4
        RET
;----------------------------------------------------------
        END
;----------------------------------------------------- ----

⌨️ 快捷键说明

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