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

📄 time_02.asm

📁 一个很好的单片机控制时间程序
💻 ASM
字号:
       org 0000h
       ljmp start 
       org 0003h
       ljmp ex_int0
       org 000bh
       ljmp intt0
       org 0013h
       ljmp set_time
       org 0050h
   
   ;中断服务程序;
   
   ;;;;;;;;;;;;;;;;;;;;;;;
   ;;;1s计时程序
   ;;;;;;;;;;;;;;;;;;;;;;;;
 intt0: push  acc           ;累加器入栈保护
        push  psw           ;状态字入栈保护
        clr   et0           ;关t0中断允许
        clr   tr0           ;关闭定时器t0
        mov   a,#0b7h       ;中断响应时间同步修正
        add   a,tl0         ;低8位初值修正
        mov   tl0,a         ;重装初值(低8位修正值)
        mov   a,#3ch        ;高8位初值修正
        addc  a,th0         ;
        mov   th0,a         ;重装初值(高8位修正值)
        setb  tr0           ;开启定时器t0
        djnz  r4, outt0     ;20次中断未到中断退出
addss:  mov   r4,#14h       ;20次中断到(1秒)重赋初值
        mov   r0,#71h       ;指向秒计时单元(71h-72h)
        acall add1          ;调用加1程序(加1秒操作)
        mov   a,r3          ;秒数据放入a(r3为2位十进制数组合)
        clr   c             ;清进位标志
        cjne  a,#60h,addmm  ;
        addmm:  jc    outt0         ;小于60秒时中断退出
        acall clr0          ;大于或等于60秒时对秒计时单元清0
        mov   r0,#77h       ;指向分计时单元(76h-77h)
        acall add1          ;分计时单元加1分钟
        mov   a,r3          ;分数据放入a
        clr   c             ;清进位标志
        cjne  a,#60h,addhh  ;
addhh: jc    outt0         ;小于60分时中断退出
       acall clr0          ;大于或等于60分时分计时单元清0
       mov   r0,#79h       ;指向小时计时单元(78h-79h)
       acall add1          ;小时计时单元加1小时
       setb p3.7
       lcall dl1s
       lcall dl1s
       lcall dl1s
       lcall dl1s
       clr p3.7
       mov   a,r3          ;时数据放入a
       clr   c             ;清进位标志
       cjne  a,#24h,hour   ;
 hour: jc    outt0         ;小于24小时中断退出
       acall clr0          ;大于或等于24小时小时计时单元清0
outt0: mov   72h,76h       ;中断退出时将分、时计时单元数据移
       mov   73h,77h       ;入对应显示单元
       mov   74h,78h       ;
       mov   75h,79h       ;
       pop   psw           ;恢复状态字(出栈)
       pop   acc           ;恢复累加器
       setb  et0           ;开放t0中断
       reti                ;中断返回

;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 时间调整中断服务程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;

set_time:            push  acc           ;累加器入栈保护
                  push  psw           ;状态字入栈保护     
                clr   ET0            ;关定时器T0中断
                 clr   TR0            ;关闭定时器T0
                 LCALL DL01S           ;调用1秒延时程序
		 jb p3.0,set_m
		  mov a,#79h
		  mov r0,a
		  lcall add1
		  ;LCALL DISPLAY
 		  ;lcall DL01S
		  mov a,r3
		  clr c
		  cjne a,#24h,next
	next:	  jc  out
	          mov r3,#79h
	          lcall clr0
                  ljmp out
	set_m :   jb p3.1,set_s
	          mov a,#77h
                  mov r0,a
		  lcall add1
		 ; lcall DL01S
		  ;LCALL DISPLAY 
                  mov a,r3
		  clr c
		  cjne a,#60h,next1
	next1:	  jc  out
	          mov r3,#77h
	          lcall clr0
                  ljmp out
		 
        set_s :   jb p3.5,out
	          mov a,#71h
                  mov r0,a
		  lcall add1
                  mov a,r3
		  clr c
		  cjne a,#60h,next2
	next2:	  jc  out
	          mov r3,#71h
	          lcall clr0

		  ;lcall DL01S
                  ;LCALL DISPLAY 
	out:    MOV     72H,76H       ;
                MOV     73H,77H       ;
                MOV     74H,78H       ;
                MOV     75H,79H       ;
	          setb   ET0            ;开定时器T0中断
                  setb   TR0            ;开定时器T0
                  pop   psw           ;恢复状态字(出栈)
                   pop   acc           ;恢复累加器
		   reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;闹钟设置程序;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ex_int0:   push  acc           ;累加器入栈保护
           push  psw           ;状态字入栈保护 
           clr et0
	   clr tr0
           ljmp $



           setb et0
	   setb tr0
           pop   psw           ;恢复状态字(出栈)
           pop   acc           ;恢复累加器
           reti

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

start :	clr p3.7              ;蜂鸣器不叫
         MOV   R0,#70H        ;清70H-7AH共11个内存单元
         MOV   R7,#0BH      
CLEARD:  MOV   @R0,#00H       ;
         INC   R0             ;
         DJNZ  R7,CLEARD      ;
         MOV   20H,#00H       ;清20H(标志用)mov r2,#20
	 mov   tmod,#11h      ;设t0、t1为16位定时器
         mov   tl0,#0b0h      ;50ms定时初值(t0计时用)
         mov   th0,#3ch       ;50ms定时初值
            setb  ea             ;总中断开放
	 setb  ex1
         setb  et0            ;允许t0中断
         setb  tr0            ;开启t0定时器
         mov   r4,#20         ;20*50ms
 START1: LCALL DISPLAY        ;调用显示子程序
         JNB   P3.4,start    ;P3.5口为0时转时间调整程序

         SJMP  START1         ;P3.5口为1时跳回START1
 set_time1: LJMP  set_time         ;转到时间调整程序SETMM






 ;子程序

; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P1口输出段码数据,P3口作
; 扫描控制,每个LED数码管亮1MS时间再逐位循环。
          DISPLAY: MOV   R1,#70H        ;指向显示数据首址
                   MOV   R5,#0FEH       ;扫描控制字初值
             PLAY: MOV   A,R5           ;扫描字放入A
                   MOV   P2,A           ;从P2口输出
                   MOV   A,@R1          ;取显示数据到A
                   MOV   DPTR,#TAB      ;取段码表地址
                   MOVC  A,@A+DPTR      ;查显示数据对应段码
                   MOV   P1,A           ;段码放入P1口
                   LCALL DL1MS          ;显示1MS
                   INC   R1             ;指向下一地址
                   MOV   A,R5           ;扫描控制字放入A
                   JNB   ACC.5,ENDOUT   ;ACC.5=0时一次显示结束
                   RL    A              ;A中数据循环左移
                   MOV   R5,A           ;放回R5内
                   AJMP  PLAY           ;跳回PLAY循环
           ENDOUT: SETB  P2.5           ;一次显示结束,P3口复位
                   MOV   P0,#0FFH       ;P1口复位
                   RET                  ;子程序返回
             tab: db 00111111b, 00000110b, 01011011b, 01001111b, 01100110b, 01101101b, 01111101b, 00000111b, 01111111b, 01101111b
;共阴显示         "0""  1""  2" " 3" "4" "5" "6"  "7" "8" "9""不亮"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           加1子 程 序              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
             add1: mov   a,@r0       ;取当前计时单元数据到a
                   dec   r0          ;指向前一地址
                   swap  a           ;a中数据高四位与低四位交换
                   orl   a,@r0       ;前一地址中数据放入a中低四位
                   add   a,#01h      ;a加1操作
                   da    a           ;十进制调整
                   mov   r3,a        ;移入r3寄存器
                   anl   a,#0fh      ;高四位变0
                   mov   @r0,a       ;放回前一地址单元
                   mov   a,r3        ;取回r3中暂存数据
                   inc   r0          ;指向当前地址单元
                   swap  a           ;a中数据高四位与低四位交换
                   anl   a,#0fh      ;高四位变0
                   mov   @r0,a       ;数据放入当削地址单元中
                   ret              ;子程序返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           清零程序                  ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;对计时单元复零用
             CLR0: CLR   A           ;清累加器
                   MOV   @R0,A       ;清当前地址单元
                   DEC   R0          ;指向前一地址
                   MOV   @R0,A       ;前一地址单元清0
                   RET               ;子程序返回


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           延时程序                  ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;1MS延时程序,LED显示程序用
            DL1MS: MOV  R6,#14H
            DL1:   MOV  R7,#19H
            DL2:   DJNZ  R7,DL2
                   DJNZ  R6,DL1
                   RET
;延时0.1s程序
           dl01s:   MOV        R3,#10H     
          dl01:  LCALL      DISPLAY
                   DJNZ       R3,dl01
                   RET

;延时程序,用作按键时间的长短判断
           DL1S:   LCALL      DL05S
                   LCALL      DL05S
                   RET
          DL05S:   MOV        R3,#20H      ;8毫秒*32=0.196秒
          DL05S1:  LCALL      DISPLAY
                   DJNZ       R3,DL05S1
                   RET


 	 end

⌨️ 快捷键说明

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