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

📄 13.asm

📁 单片机实验程序-13种-17.4M-pdf.zip
💻 ASM
📖 第 1 页 / 共 2 页
字号:
                ;******************;
                ;    定时器程序    ;
                ;    采用89c2051   ;
                ;    2001.10       ;
                ;******************;
	    ;
            ;******************
	    ;      伪定义     ;
	    ;******************
	    SL     EQU   30H       	   ;SL存放秒的个位数
	    SH	   EQU   31H       	   ;SH存放秒的十位数
	    ML    EQU   32H       		   ;ML存放分的个位数
	    MH	   EQU   33H       	   ;MH存放分的十位数
	    HL     EQU   34H       	   ;HL存放时的个位数
	    HH	   EQU   35H    	       ;HH存放时的十位数
	    ;
	    L0     EQU   36H       	   ;L0~L3:显示数据存储器
            L1	   EQU   37H
	    L2     EQU   38H
	    L3	   EQU   39H
	    DSPLYP    EQU   3AH         ;显示数据指针(DISPLAY-POINT)
	    PLYTS     EQU   3BH         ;显示次数计数器(DISPLAY-TIMES)
	    ;
	    LPLMOD   BIT   39H          ;低两位显示方式(LOW-PLAY-MOD)
	    HPLMOD   BIT   3AH         ;高两位显示方式(HIGH-PLAY-MOD)
	    BRIGHT    BIT   3BH         ;DISPLAY子程序参数:亮灭指示位
        ;
        TCOUNT   EQU   3CH         ;时间计数器(TIME-COUNT)
        ;
        ADDRES	 EQU   3DH           ;加1子程序参数
        MAX     EQU   3EH           ;加1子程序参数
	    IFDEC    BIT   20H            ;BCD加法子程序参数
            ;
        R_MOD  EQU   3FH          ;响铃方式参数
	    ;
	    LED4     BIT   30H            ;发光管状态位
	    BELL     BIT   P1.7           ;蜂鸣器
	    SWITCH  BIT   P3.7           ;继电器
	    FKEY     BIT   P3.0           ;功能键 (S1)
	    MKEY    BIT   P3.1           ;修改键 (S2)
	    ;
	    WORKIN BIT   38H           	;工作状态指示位
	    ;

            ;******************
            ;     中断入口    ;
	        ;******************
		    ORG  	 0000H
            START:  LJMP	 MAIN         		; 0000H  引向主程序
		    LJMP	 ERR          		; 0003H
		    NOP
		    NOP
		    LJMP 	ERR          		; 引向出错处理程序
		    LJMP 	PGT0         		; 000BH  引向中断处理程序PGT0
		    NOP
		    NOP
		    LJMP 	ERR          		; 引向出错处理程序
		    LJMP 	ERR          		; 0013H  INT1
		    NOP
		    NOP
		    LJMP 	ERR
		    LJMP 	ERR          		; 001BH  T1
		    NOP
		    NOP
		    LJMP 	ERR
		    LJMP 	ERR          		; 0023H
		    NOP
		    NOP
                    LJMP 	ERR
	            LJMP 	ERR          		; 002BH
		    NOP
		    NOP
	        ;
                ;************
                ;   主程序  ;
	    	;************
	       MAIN:   MOV   IE,  #00H            ;关中断
                    MOV   SP,  #57H            ;设置堆栈指针
                    MOV   PSW,  #00H          ;选用寄存器组0
                    MOV   TMOD, #11H          ;设定中断工作方式为T0和T1
            ;
                    MOV   A, 56H
                    CJNE  A, #0AAH, CSTART     ;判上电复位标志,无标志转冷启动
                    MOV   A, 57H
                    CJNE  A, #55H,  CSTART      ; 无标志转冷启动
                    AJMP  HSTART               ;有上电复位标志转热启动
                    NOP
		    NOP
                    LJMP 	ERR                  ;软件陷阱,引向出错处理程序
            CSTART: MOV   P1, #0FFH             ;冷启动,全面初始化
                    MOV   P3, #0FFH
                    MOV   TCON,  #00H          ;计时停止
                    MOV   TL0, #0B0H            ;赋中断T0初值
                    MOV   TH0, #3CH
                    MOV   TCOUNT, #0AH          ;赋定时器初值
                    MOV   R5, #00H              ;R5为一空单元(备用)
                    MOV   R4, #00H              ; R4 为工作模式选择寄存器
		    MOV   SL, #00H              ;定时单元清零
                    MOV   SH, #00H              ;秒
                    MOV   ML, #00H             ;
                    MOV   MH, #00H             ;分
                    MOV   HL, #00H             ;
                    MOV   HH, #00H             ;时
		    MOV   PLYTS,  #64H        	;赋显示次数初值为100次
		    MOV   DSPLYP,  #L0		;显示指针指向显存单元
                    MOV   L0,  #0AH           ;送显示数据"-----"
                    MOV   L1,  #0AH
                    MOV   L2,  #0AH
                    MOV   L3,  #04H
                    SETB   LED4                 ;LED4为数码管之间的发光二极管
                    SETB   LPLMOD              ;设定显示方式为闪烁
                    SETB   HPLMOD              ;
                    SETB   BRIGHT               ;允许显示
		    CLR	   WORKIN	             ;清工作标志 , 待命
                    AJMP  SETUP                ;转开始工作
                    NOP
		    NOP
                    LJMP 	ERR          ;软件陷阱
         HSTART:    MOV   SCON, #00H    ; 有上电标志,热启动,清串行口控制寄存器
                    MOV   IP,  #00H      ; 清中断优先控制寄存器
                    SETB   FKEY           ;重设按键
                    SETB   MKEY
                    SETB   EA              ;开中断
                    AJMP  BEGIN           ;转向继续工作
                    NOP
		    NOP
                    LJMP	  ERR            ;软件陷阱
            SETUP:  SETB  EA               ;开中断
            ;
	      MAIN1:   ACALL  DISPLY          ;调用显示
        	    	JB	   FKEY,  JUDGE    ;按键扫描
		    	ACALL  KEYDLY        ;延时消抖动
		    	JB	   FKEY,  JUDGE    ;无键按下转向判断是否到点
		    	CLR   ET0              ;功能键被按下,则
		    	CLR   TR0		        ;暂停计时
            	        ACALL MENU           ; 调用菜单设置程序
               BEGIN:  SETB  WORKIN          ;置工作标志位,开始工作
            		SETB  ET0              ;开中断
			SETB  TR0              ;开始计时
			MOV   A, R4            ;移入工作模式选择
			RL    A 		        ;指针放大
            	        MOV   DPTR,  #M_TAB
		    	JMP   @A+DPTR        ;根据工作模式跳转到相应程序段
                M_TAB:  AJMP  WORK1
		    	AJMP  WORK2
		    	AJMP  WORK3
            		AJMP  WORK4
            		NOP
            		NOP
            		LJMP  ERR               ;软件陷阱
WORK1:  ;
  WORK2:  CLR   SWITCH            ;工作方式1和2:开继电器
          AJMP  MAIN2
          NOP
	  NOP
          LJMP 	ERR                ;软件陷阱
  WORK3:  ;
WORK4:  SETB  SWITCH             ;工作方式3和4:不开继电器
  MAIN2:  CLR   BELL                 ;蜂鸣器短鸣一声,以示开始工作
           ACALL  DL05S
           SETB  BELL
   JUDGE:  JNB WORKIN, MAIN1           ;判断是否在定时之中
            MOV   A, SL                  ;判断秒是否为零
            JNZ   MAIN1
            MOV   A, SH                ;判断秒是否为零
            JNZ   MAIN1
            MOV   A, ML                ;判断分是否为零
            JNZ   MAIN1
            MOV   A, MH                ;判断分是否为零
            JNZ   MAIN1
            MOV   A, HL                ;判断时是否为零
            JNZ   MAIN1
            MOV   A, HH                ;判断时是否为零
            JNZ   MAIN1                ;若时分秒全为零则
            CLR   ET0                  ; 停止计时
            CLR   TR0                  ;
            ACALL ACTION              ; 调用到点工作子程序
            AJMP  MAIN                ; 返回
            NOP
	    NOP
            LJMP ERR                   ;软件陷阱
	    ;
        ;******************
	    ;    倒计时程序   ;
	    ;******************
            PGT0:   CLR   EA            		 ;关中断
                    PUSH  ACC		      		 ;保护现场
		    PUSH  PSW
		    PUSH  DPL
		    PUSH  DPH
		    MOV   PSW, #08H	      	 ;选用寄存器组1
		    CLR   TR0                	 ;暂停计时
		    MOV   A,#0B7H           	 ;中断同步修正
		    ADD   A,TL0
		    MOV   TL0,A
		    MOV   A,#3CH
		    ADD   A,TH0
		    MOV   TH0,A
                    SETB  TR0                	 ;恢复计时
                    DEC   TCOUNT             	 ;定时器T0每50 000毫秒溢出一次,则
		    MOV   A,  TCOUNT         	 ; 溢出10次为0.5秒
	            JNZ   OUTT0	          	 ;判断是否到半秒
		    MOV   TCOUNT, #0AH       	 ;
		    CPL   LED4		           	 ; 若到半秒LED取反
		    JNB   LED4, OUTT0         ;LED每闪烁一次是一秒
		    MOV   R0, #SH             ;移入秒位的地址
		    SETB  IFDEC                ;BCD子程序参数,使其做减法
		    ACALL ADDBCD            ;调用BCD子程序, 秒减1
		    CJNE  R3, #99H, OUTT0      ;判断秒要否借位
                    MOV   SH, #05H            ;要借位则
                    MOV   SL, #09H            ; 送数据59(否则显示99)
		    MOV   R0, #MH             ;移入分位的地址
		    ACALL ADDBCD	           ;分减1
		    CJNE  R3, #99H, OUTT0     ;判断分要否借位
                    MOV   MH, #05H
                    MOV   ML, #09H
		    MOV   R0, #HH
		    ACALL ADDBCD
            OUTT0:  POP   DPH		       		;恢复现场
		    POP   DPL
		    POP   PSW
		    POP   ACC
		    SETB  EA
		    RETI                  		;中断返回
                    NOP
		    NOP
                    LJMP ERR                    ;软件陷阱
	;
	;
            ;**************************
	    ;   BCD子程序(加1或减1 )  ;
            ;**************************
   ADDBCD: MOV   A, @R0           ;移入被操作数的高位
	    DEC   R0                ;指针减一
	    SWAP  A
	    ORL   A, @R0            ;移入被操作数的低位
            MOV   B, #01H           ;B寄存器送立即数#01H
            MOV   C, IFDEC          ;若 减法标志位为1,则
            MOV   B.3,  C           ;
            MOV   B.4,  C           ; B寄存器的值被改为#99H
            MOV   B.7,  C           ;
	    ADD   A, B              ; 对一个压缩的BCD码加#99H等于对其减一
	    DA    A                 ;BCD码调整
	    MOV   R3, A             ;暂存结果
	    ANL   A, #0FH           ;取低位码
	    MOV   @R0, A           ;存数
	    MOV   A, R3             ;取回结果
	    INC   R0                ;指针加一
	    SWAP  A                ;交换
	    ANL   A, #0FH          ;取结果数的高位
	    MOV   @R0, A          ;存数
	    RET
            NOP
	    NOP
            LJMP 	ERR             ;软件陷阱
	    ;
        ;**************
	;   加1程序   ;
        ;**************
	ADDONE: MOV  R0, ADDRES   ;移入被加数单元的地址
	         CLR   IFDEC         ;设定BCD子程序做加法
		 ACALL ADDBCD      ;调用BCD子程序
         	 CLR   C             ;判断被加数是否大于
            	 MOV   A,  R3       ;最大值"MAX"
	 	 CJNE  A,  MAX, JGOVER
         JGOVER: JC    ENDADO
	         CLR   A            ;若大于"MAX",则清零
                  MOV   @R0, A
                  DEC   R0
                  MOV   @R0, A
	     ENDADO: RET
                  NOP
		  NOP
                  LJMP 		ERR       ;软件陷阱
	    ;
        ;******************
	    ;   调时快进程序  ;
        ;******************
        QUICK:   CLR   LPLMOD	   ;设定显示方式不闪烁
		  CLR   HPLMOD
                  ACALL ADDONE      ;调用加1子程序
                  MOV   L0,  R4       ;将工作模式选择数移入显存
                  INC   L0             ;加1转化成显示值
                  ACALL KEYDLY       ;延时
                  ACALL DL100
                  JNB   MKEY, QUICK      ;判断键是否松开
                  SETB  LPLMOD          ;若松开则恢复闪烁显示方式
		  CJNE  R6, #02H, ENDQUK
	          SETB  HPLMOD
                  CLR   LPLMOD
         ENDQUK: RET
                  NOP
		  NOP
                  LJMP ERR             ;软件陷阱
	    ;
;
        ;******************
	    ;   功能菜单程序  ;
	    ;******************
	    MENU: MOV   R6,  #00H	        ; 初始化;  R6 计功能键按键次数
	       MOV   ADDRES,  #05H   ; 将 R5 的地址送入,以便于改变 R4 的值
               MOV   MAX, #04H        ; 定义工作模式选择寄存器R4 的最大值
               MOV   DSPLYP, #L0       ;定义显示指针指向显存
               SETB  LPLMOD	    		;设定低两位数闪烁
	       CLR   HPLMOD
               MOV   L0,  R4          	;送显示数据"F-0X"
               INC    L0
               MOV   L1,  #00H
               MOV   L2,  #0BH
               MOV   L3,  #00H
               SETB  LED4
            ;
       WAITFK: ACALL DISPLY              ;等待F键释放
	       JNB   FKEY,  WAITFK
       MENU1:  ACALL DISPLY
                JB    MKEY,  JGFKEY       ;M键扫描
                ACALL KEYDLY             ;延时消抖动
                JB    MKEY,  JGFKEY       ; 未按下则转F键扫描
                CJNE  R6, #00H, NEXT1      ;
                MOV   SL, #00H            ;若中途改变定时方式,则清除原计时数据
                MOV   SH, #00H
                MOV   ML, #00H
                MOV   MH, #00H
                MOV   HL, #00H
                MOV   HH, #00H
       NEXT1:  MOV   R2,  #00H            ;R2用于判断按键时间是否超过0.5秒
       NEXT2:  ACALL ADDONE             ;调用加1程序

⌨️ 快捷键说明

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