📄 1.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 + -