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

📄 1.asm

📁 具有关机记忆功能的定时器程序
💻 ASM
字号:
;具有关机记忆功能的计数器,本程序在MB300实验通过。(具体详见《电子报05年合订本上)
;P3.2掉电试验,P3.3电机运转控制,P3.4计数器清零,P3.5计数开关。
;说明:抗抖动干扰的时间取30ms,如干扰大也可取大一些。
;若高速计数,则取小一些。
	CNT0 EQU 30H;定义最低位计数单元
	CNT1 EQU 31H;---------------------------
	CNT2 EQU 32H;----------------------------
	CNT3 EQU 33H;------------------------------
	CNT4 EQU 34H;---------------------------
	CNT5 EQU 35H;----------------------------
	CNT6 EQU 36H;------------------------------
	CNT7 EQU 37H;定义最高位计数单元
	DISP_BIT EQU 38H;定义扫描显示标志
	FLAG_BIT BIT 00H;定义位标志,1代表继电器吸合,0代表继电器断开
;**************************************
	ORG 0000H
	AJMP MAIN
	ORG 0003H;INT0中断入口
	AJMP ZD0
	ORG 000BH;T0中断入口
	AJMP TIMER0
	;*****************************************
	ORG 0030H
MAIN:		MOV R0,#30;延时900Ms,等电源稳定
THERE:		ACALL DEL30MS
	DJNZ R0, THERE
	CLR FLAG_BIT;位标志清零
	MOV DISP_BIT,#00H; 扫描显示标志清零
	SETB IT0;INT0为边沿触发
	SETB EX0;INT0开中断
	SETB EA;开CPU中断
	MOV TMOD,#00H;定时器方式0
	MOV TH0,#0F0H;1mS定时初值
	MOV TL0,#0CH
	SETB ET0;T0开中断
	SETB TR0;启动T0
START:		SETB P3.5;置P3.1为高电平
	JB P3.5,NEXT1;查询P3.1
	ACALL DEL30MS
	JB P3.5,NEXT1
	ACALL COUNT;调用计数子程序
	;----------------------------
NEXT1:		SETB P3.3; 置P3.3为高电平
	JB P3.3,NEXT2; 查询P3.3
	ACALL DEL30MS
	JB P3.3,NEXT2
	ACALL CONTROL_MOTOR; 调用电机控制子程序
NEXT2:		JB FLAG_BIT,S1;若位标志为1转S1
	SETB P3.7;断开继电器
	SJMP S3
S1:			CLR P3.7;接通继电器
	;-----------------------------
S3:			SETB P3.4; 置P3.0为高电平
	JB P3.4,NEXT3; 查询P3.0
	ACALL DEL30MS
	JB P3.4,NEXT3
	ACALL COUNTER_CLR; 调用清除计数器子程序
NEXT3:		AJMP START
;**************** 清除计数器子程序******************
COUNTER_CLR:
	MOV CNT0,#00H;8个计数单元清零
	MOV CNT1,#00H;------------------------
	MOV CNT2,#00H;------------------------
	MOV CNT3,#00H;------------------------
	MOV CNT4,#00H;--------------------------
	MOV CNT5,#00H;------------------------
	MOV CNT6,#00H;------------------------
	MOV CNT7,#00H;--------------------------
	RET
;****************** 计数子程序**********************
COUNT :		INC CNT0;计数口有效则个位加1
	MOV A,CNT0;个位计数单元送A
	CJNE A,#0AH,DONE;若个位不为10退出
	MOV CNT0,#00H;若个位为10则个位计数单元清零
	;-----------------------------------------
	MOV A,CNT1;十位计数单元送A
	INC A; 十位计数单元加1
	MOV CNT1,A
	CJNE A,#0AH,DONE; 若十位不为10退出
	;------------------------------------------------------
	MOV CNT1,#00H; 若十位为10则十位计数单元清零
	MOV A,CNT2; 百位计数单元送A;以下类推
	INC A
	MOV CNT2,A
	CJNE A,#0AH,DONE
	;--------------------------------------------------------
	MOV CNT2,#00H
	MOV A,CNT3
	INC A
	MOV CNT3,A
	CJNE A,#0AH,DONE
	;-----------------------------------------------------------
	MOV CNT3,#00H
	MOV A,CNT4
	INC A
	MOV CNT4,A
	CJNE A,#0AH,DONE
	;------------------------------------------------------------
	MOV CNT4,#00H
	MOV A,CNT5
	INC A
	MOV CNT5,A
	CJNE A,#0AH,DONE
	;-----------------------------------------------------------
	MOV CNT5,#00H
	MOV A,CNT6
	INC A
	MOV CNT6,A
	CJNE A,#0AH,DONE
	;------------------------------------------------------------
	MOV CNT6,#00H
	MOV A,CNT7
	INC A
	MOV CNT7,A
	CJNE A,#0AH,DONE
	;------------------------------------------------------------
	MOV CNT7,#00H; 若最高位为10则最高位计数单元清零
DONE:		JNB P3.5,DONE;若P3.1仍为低电平则等待
	ACALL DEL30MS
	JNB P3.5,DONE
	RET
;***************** 电机控制子程序*******************
CONTROL_MOTOR:
	CPL FLAG_BIT;按键有效则位标志取反
S2:			JNB P3.3,S2; 若P3.3仍为低电平则等待
	ACALL DEL30MS
	JNB P3.5,S2	
	RET
;****************** INT0中断子程序***********************
ZD0:		JB P3.2,DONE1
	MOV P0,#0FFH;关闭显示器
	MOV P2,#0FFH
	MOV P3,#0FFH;断开马达
	MOV PCON,#02H;进入掉电状态,此时耗电仅50uA
	SJMP $
DONE1:		RETI
;********************定时器T0中断子程序**********************
TIMER0:		MOV TH0,#0F0H; 重装1mS定时初值
	MOV TL0,#0CH
	PUSH PSW;压栈
	PUSH ACC
	INC DISP_BIT; 扫描显示标志+1
	MOV A, DISP_BIT
	CJNE A,#08H,LX; 若扫描显示标志=8,则置0
	MOV A,#00H
	MOV DISP_BIT,#00H
LX:			RL A; 扫描显示标志x2
	MOV DPTR,#TAB1;TAB1首址送DPTR
	JMP @A+DPTR
TAB1: 		AJMP SCAN0;扫描个位
	AJMP SCAN1;----------
	AJMP SCAN2;-----------
	AJMP SCAN3;-----------
	AJMP SCAN4;----------
	AJMP SCAN5;-----------
	AJMP SCAN6;-----------
	AJMP SCAN7;扫描最高位
;-------------------------- 扫描个位--------------------------------
SCAN0:		MOV A,CNT0;个位计数内容送A
	MOV DPTR,#TAB;TAB首址送DPTR
	MOVC A,@A+DPTR;查表
	MOV P0,A;送P0口
	MOV P2,#7FH
	AJMP DONEX
;----------------------------- 扫描十位---------------------------
SCAN1:		MOV A,CNT1; 十位计数内容送A,以下类同
	MOV DPTR,#TAB
	MOVC A,@A+DPTR
	MOV P0,A
	MOV P2,#0BFH
	AJMP DONEX
	;------------------- 扫描百位-----------------
SCAN2:		MOV A,CNT2;百位计数内容送A
	MOV DPTR,#TAB
	MOVC A,@A+DPTR;查表
	MOV P0,A;送P0口
	MOV P2,#0DFH
	AJMP DONEX
;-------------------------- 扫描千位------------------------------
SCAN3:		MOV A,CNT3; 
	MOV DPTR,#TAB
	MOVC A,@A+DPTR
	MOV P0,A
	MOV P2,#0EFH
	AJMP DONEX
;---------------------------- 扫描万位---------------------------------
SCAN4:		MOV A,CNT4 
	MOV DPTR,#TAB
	MOVC A,@A+DPTR
	MOV P0,A
	MOV P2,#0F7H
	AJMP DONEX
;----------------------- 扫描十万位-------------------------
SCAN5:		MOV A,CNT5; 
	MOV DPTR,#TAB
	MOVC A,@A+DPTR
	MOV P0,A
	MOV P2,#0FBH
	AJMP DONEX
;------------------------ 扫描百万位--------------------------
SCAN6:		MOV A,CNT6; 
	MOV DPTR,#TAB
	MOVC A,@A+DPTR
	MOV P0,A
	MOV P2,#0FDH
	AJMP DONEX
;-------------------------- 扫描最高位---------------------------
SCAN7:		MOV A,CNT7; 
	MOV DPTR,#TAB
	MOVC A,@A+DPTR
	MOV P0,A
	MOV P2,#0FEH
DONEX:	POP ACC;出栈
	POP PSW
	RETI
;****************** 1ms延时子程序********************
DEL1MS:	MOV R3,#01H;1ms延时子程序
LOOP:		MOV R4,#0FAH
	DJNZ R4,$
	DJNZ R3,LOOP
	RET
;****************** 30ms延时子程序*********************
DEL30MS:
	MOV R7,#30;30ms延时子程序
L2:			MOV R6,#01H
L1:			MOV R5,#0FAH
	DJNZ R5,$
	DJNZ R6,L1
	DJNZ R7,L2
	RET
;******************* 0~9字形码*********************
TAB:		
    DB	0C0H
	DB	0F9H
	DB	0A4H
	DB	0B0H
	DB	099H
	DB	092H
	DB	082H
	DB	0F8H
	DB	080H
	DB	090H
	DB	0FFH
	END


⌨️ 快捷键说明

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