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

📄 clock.asm

📁 基于51单片机的
💻 ASM
字号:
#include <def.inc>
      ORG  0000H
           LJMP   START

	  ORG  0003H				 ;恢复红灯开启时的初始状态
	       JMP    RESTART
       
      ORG  000BH                 ;1mS中断,动态扫描       
           JMP    INT_T0

      ORG  001BH				 ;10mS  中断,完成时钟计时
           JMP    INT_T1         

      ORG  0030H
START:   
;---------  重置堆栈  -------------  
           MOV   SP,         #60H    

;----------  端口初始化  -----------
	       MOV   P1,      #0FFH
	       MOV   P3,      #0FFH 
  
;---------  定时器设置  ------------
           MOV   TMOD,    #19h            ;设置C/T0 和 C/T1 工作在方式 1(16bit 定时)
           MOV   TL0,     #DATA_TL0       ;初值
           MOV   TH0,     #DATA_TH0   
           MOV   TL1,     #DATA_TL1      
           MOV   TH1,     #DATA_TH1
           SETB  TR0                      ;启动
           SETB  TR1

;---------  中断设置  -------------
           MOV   IP,    #00000001B     ; 外部中断0为高优先级
           MOV   IE,    #10001011B     ; 开放C/T0、C/T1、外部中断0中断 


;---------  变量初始化  ------------
           MOV   TIME_10mS,   #100       ;计时变量
           MOV   TIME_1S,     #9
           MOV   TIME_10S,    #1 
           
           MOV   CUR_DISP,    #0         ;显示位
	       MOV   LIGHT,       #11        ;显示空格“-”的值

MAINLOOP:  JMP   MAINLOOP                ;主循环


;--------  10mS中断,计时  ----------
INT_T1:    PUSH  PSW                      ;保护现场
           PUSH  ACC

           MOV   TL1,    #DATA_TL1        ;重置初值
           MOV   TH1,    #DATA_TH1  
      
           DJNZ  TIME_10mS,  EXIT_T1  

           MOV   TIME_10mS,   #100        ;每1S
           DEC   TIME_1S
           MOV   A,   TIME_1S
           CJNE  A,   #-1,   EXIT_T1

           MOV   TIME_1S,   #9            ;每10S
           DEC   TIME_10S
           MOV   A,     TIME_10S
           CJNE  A,    #-1,  EXIT_T1

		   
		   MOV   A,    LIGHT
		   CJNE  A,    #11, AAA
		   CJNE  A,    #10, BBB
AAA:       INC   LIGHT
           MOV   TIME_10S, #1
           JMP   EXIT_T1 
BBB:       DEC   LIGHT 
           MOV   TIME_10S, #2  

EXIT_T1:   POP   ACC                       ;恢复现场
           POP   PSW
           RETI

;--------  1mS中断,动态扫描  ----------                     
INT_T0:    PUSH  PSW                    ; 保护现场
           PUSH  ACC  
           PUSH  DPH
	       PUSH  DPL
           SETB  RS0                    ; 选择工作寄存器1 

           MOV   TL0,   #DATA_TL0       ; 重置 T0 初值
           MOV   TH0,   #DATA_TH0
 
	       MOV_BIT  POS_CONTL1,   CUR_DISP.0        ;输出位选     
           MOV_BIT  POS_CONTL2,   CUR_DISP.1
	   
           MOV    A,     CUR_DISP         ;输出段选
           MOV    DPTR,  #TAB_DIS         ;计算段显示内容的地址 
           MOVC   A,     @A+DPTR          ; A= 在该位上要显示内容的地址

           MOV    R0,    A
           MOV    A,     @R0              ; A= 在该位要显示内容的值

	       MOV    DPTR,  #TAB_CODE  
           MOVC   A,     @A+DPTR          ; A= 要显示内容的段码
           MOV    SEG_OUT,    A           ;段显输出

           INC    CUR_DISP                ;计算下次(1mS后)要显示的位 
           MOV    A,     CUR_DISP
	       CJNE   A,    #N_DISP,  EXIT_T0
	       MOV    CUR_DISP,  #0

EXIT_T0:   POP    DPL
           POP    DPH
           POP    ACC
           POP    PSW            ;恢复现场
           RETI

;----------- 复位  ------------ 
RESTART:   PUSH  PSW	         ;保护现场
           PUSH  ACC

           MOV   TIME_1S,     #9
           MOV   TIME_10S,    #1 
		   MOV   LIGHT,       #11      

		   POP    ACC			 ;恢复现场
           POP    PSW            
		   SETB   TR0
		   RETI

TAB_CODE:
DB      0C0H    ;0   0   0
DB      0F9H    ;1   1   1
DB      0A4H    ;2   2   2
DB      0B0H    ;3   3   3
DB      099H    ;4   4   4
DB      092H    ;5   5   5
DB      082H    ;6   6   6
DB      0F8H    ;7   7   7
DB      080H    ;8   8   8
DB      098H    ;9   9   9
DB      0FFH    ;绿灯   10 
DB      080H    ;红灯   11   

TAB_DIS:
DB      DIS0   
DB      DIS1 
DB      DIS2   
  
            END

⌨️ 快捷键说明

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