📄 毕业设计.asm
字号:
In0 BIT P0.0
In1 BIT P0.1
In2 BIT P0.2
In3 BIT P0.3
InMap0 BIT 20H.0 ;输入映像存储区
InMap1 BIT 20H.1
InMap2 BIT 20H.2
InMap3 BIT 20H.3
Out0 BIT P1.0
Out1 BIT P1.1
Out2 BIT P1.2
Out3 BIT P1.3
OutMap0 BIT 20H.4 ;输出映像存储区
OutMap1 BIT 20H.5
OutMap2 BIT 20H.6
OutMap3 BIT 20H.7
/***************************************************************************************************/
//定义10个定时器
//每个定时器由四部分组成:溢出标志位(逻辑位)DTn,触发启动标志位STn,计数器TCn_L和TCn_H,初值Kn_L和Kn_H
DT0 BIT 21H.0
DT1 BIT 21H.1
DT2 BIT 21H.2
DT3 BIT 21H.3
DT4 BIT 21H.4
DT5 BIT 21H.5
DT6 BIT 21H.6
DT7 BIT 21H.7
DT8 BIT 22H.0
DT9 BIT 22H.1
ST0 BIT 22H.2
ST1 BIT 22H.3
ST2 BIT 22H.4
ST3 BIT 22H.5
ST4 BIT 22H.6
ST5 BIT 22H.7
ST6 BIT 23H.0
ST7 BIT 23H.1
ST8 BIT 23H.2
ST9 BIT 23H.3
TC0_L EQU 28H
TC0_H EQU 29H
TC1_L EQU 2AH
TC1_H EQU 2BH
TC2_L EQU 2CH
TC2_H EQU 2DH
TC3_L EQU 2EH
TC3_H EQU 2FH
TC4_L EQU 30H
TC4_H EQU 31H
TC5_L EQU 32H
TC5_H EQU 33H
TC6_L EQU 34H
TC6_H EQU 35H
TC7_L EQU 36H
TC7_H EQU 37H
TC8_L EQU 38H
TC8_H EQU 39H
TC9_L EQU 3AH
TC9_H EQU 3BH ;每个计数器占两个字节
K0_L EQU 3CH
K0_H EQU 3DH
K1_L EQU 3EH
K1_H EQU 3FH
K2_L EQU 40H
K2_H EQU 41H
K3_L EQU 42H
K3_H EQU 43H
K4_L EQU 44H
K4_H EQU 45H
K5_L EQU 46H
K5_H EQU 47H
K6_L EQU 48H
K6_H EQU 49H
K7_L EQU 4AH
K7_H EQU 4BH
K8_L EQU 4CH
K8_H EQU 4DH
K9_L EQU 4EH
K9_H EQU 4FH ;每个占两个字节
/***************************************************************************************************/
//定义10个计数器
//每个定时器由四部分组成:逻辑位Cn, 复位标志位RSTn,计数器有Cn_L和Cn_H两两部分
C0 BIT 23H.4
C1 BIT 23H.5
C2 BIT 23H.6
C3 BIT 23H.7
C4 BIT 24H.0
C5 BIT 24H.1
C6 BIT 24H.2
C7 BIT 24H.3
C8 BIT 24H.4
C9 BIT 24H.5
RST0 BIT 24H.6 ;复位标志
RST1 BIT 24H.7
RST2 BIT 25H.0
RST3 BIT 25H.1
RST4 BIT 25H.2
RST5 BIT 25H.3
RST6 BIT 25H.4
RST7 BIT 25H.5
RST8 BIT 25H.6
RST9 BIT 25H.7
C0_L EQU 50H
C0_H EQU 51H
C1_L EQU 52H
C1_H EQU 53H
C2_L EQU 54H
C2_H EQU 55H
C3_L EQU 56H
C3_H EQU 57H
C4_L EQU 58H
C4_H EQU 59H
C5_L EQU 5AH
C5_H EQU 5BH
C6_L EQU 5CH
C6_H EQU 5DH
C7_L EQU 5EH
C7_H EQU 5FH
C8_L EQU 60H
C8_H EQU 61H
C9_L EQU 62H
C9_H EQU 63H ;每个计数器占两个字节
PV0_L EQU 64H
PV0_H EQU 65H
PV1_L EQU 66H
PV1_H EQU 67H
PV2_L EQU 68H
PV2_H EQU 69H
PV3_L EQU 6AH
PV3_H EQU 6BH
PV4_L EQU 6CH
PV4_H EQU 6DH
PV5_L EQU 6EH
PV5_H EQU 6FH
PV6_L EQU 70H
PV6_H EQU 71H
PV7_L EQU 72H
PV7_H EQU 73H
PV8_L EQU 74H
PV8_H EQU 75H
PV9_L EQU 76H
PV9_H EQU 77H ;每个占两个字节
/***************************************************************************************************/
ORG 0000H
AJMP Main
ORG 000BH
AJMP IT0Int ;T0中断
ORG 0030H
Main:
ACALL Initi ;初始化
Loop: ACALL GetIn ;输入采样
LCALL Process ;程序处理
ACALL GetOut ;输出控制
SJMP Loop
/***************************************************************************************************/
/*初始化*/
Initi:
MOV SP, #78H
MOV P0, #00H ;输入初始化
MOV P1, #0FFH ;输出初始化,输出是负逻辑
MOV TMOD, #01H ;定时器0工作在方式1。12MHz晶振
MOV TH0, #3CH
MOV TL0, #0B0H ;定时50000us(设0.05s为所有计时器的时间基)
SETB EA
SETB ET0
LCALL Initi_Timer
LCALL Initi_Counter
SETB TR0
RET
;=====================================================
/*输入采样*/
GetIn:
CLR InMap0
CLR InMap1
CLR InMap2
CLR InMap3
JNB In0, CHK1
ACALL KT10MS ;调用10ms的时间延时,躲过开关抖动
JNB In0, CHK1
SETB InMap0
CHK1: JNB In1, CHK2
ACALL KT10MS
JNB In1, CHK2
SETB InMap1
CHK2: JNB In2, CHK3
ACALL KT10MS
JNB In2, CHK3
SETB InMap2
CHK3: JNB In3, EndCHK
ACALL KT10MS
JNB In3, EndCHK
SETB InMap3
EndCHK:RET
;=====================================================
;时间继电器
KT10MS:
MOV R5,#0BH
F1: MOV R7,#02H
F2: MOV R6,#0FFH
F3: DJNZ R6,F3
DJNZ R7,F2
DJNZ R5,F1
RET
;=====================================================
/*输出控制*/
GetOut:
MOV C, OutMap0
CPL C ;程序处理时时正逻辑,输出时是负逻辑
MOV Out0, C ;从输出映像输出
MOV C, OutMap1
CPL C
MOV Out1, C
MOV C, OutMap2
CPL C
MOV Out2, C
MOV C, OutMap3
CPL C
MOV Out3, C
RET
/***************************************************************************************************/
/*定时中断程序*/
IT0Int: CLR TR0
PUSH PSW
PUSH ACC
MOV TH0, #3CH
MOV TL0, #0B0H
;依次查询计时器的状态标志S是否打开,即计时器是否启动,若启动,计数器加1
JNB ST0, Next1
INC TC0_L
MOV A , TC0_L ;低位加1后为0,则高位加1
JNZ Next1
INC TC0_H
Next1: JNB ST1, Next2
INC TC1_L
MOV A , TC1_L
JNZ Next2
INC TC1_H
Next2: JNB ST2, Next3
INC TC2_H
MOV A , TC2_L
JNZ Next3
INC TC2_L
Next3: JNB ST3, Next4
INC TC3_L
MOV A , TC3_L
JNZ Next4
INC TC3_H
Next4: JNB ST4, Next5
INC TC4_L
MOV A , TC4_L
JNZ Next5
INC TC4_H
Next5: JNB ST5, Next6
INC TC5_L
MOV A , TC5_L
JNZ Next6
INC TC5_H
Next6: JNB ST6, Next7
INC TC6_L
MOV A , TC6_L
JNZ Next7
INC TC6_H
Next7: JNB ST7, Next8
INC TC7_L
MOV A , TC7_L
JNZ Next8
INC TC7_H
Next8: JNB ST8, Next9
INC TC8_L
MOV A , TC8_L
JNZ Next9
INC TC8_H
Next9: JNB ST9, EndInt
INC TC9_L
MOV A , TC9_L
JNZ EndInt
INC TC9_H
EndInt: POP ACC
POP PSW
SETB TR0
RETI
;=====================================================
/*定时器程序*/
;当前逻辑运算值在位累加器C中
Tim0: JNC Off0
JNB ST0, Open0
MOV A, TC0_L //当输入逻辑为1时,如果定时器已经启动,则需要检测定时器是否溢出
CJNE A, K0_L, Exit0
MOV A, TC0_H
CJNE A, K0_H, Exit0
SETB DT0 //一旦检测到定时器溢出,置定时器逻辑标志位,同时关闭定时器
SJMP Rest0
Open0: JB ST0, Exit0
JB DT0, Exit0
SETB ST0 //当输入逻辑为1时,如果定时器没有启动,也没有溢出,则启动该定时器
RET
Off0: CLR DT0
Rest0: CLR ST0
MOV TC0_H, #00H
MOV TC0_L, #00H
Exit0: RET
;=====================================================
Tim1: JNC Off1
JNB ST1, Open1
MOV A, TC1_L
CJNE A, K1_L, Exit1
MOV A, TC1_H
CJNE A, K1_H, Exit1
SETB DT1
SJMP Rest1
Open1: JB ST1, Exit1
JB DT1, Exit1
SETB ST1
RET
Off1: CLR DT1
Rest1: CLR ST1
MOV TC1_H, #00H
MOV TC1_L, #00H
Exit1: RET
;=====================================================
Tim2: JNC Off2
JNB ST2, Open2
MOV A, TC2_L
CJNE A, K2_L, Exit2
MOV A, TC2_H
CJNE A, K2_H, Exit2
SETB DT2
SJMP Rest2
Open2: JB ST2, Exit2
JB DT2, Exit2
SETB ST2
RET
Off2: CLR DT2
Rest2: CLR ST2
MOV TC2_H, #00H
MOV TC2_L, #00H
Exit2: RET
;=====================================================
Tim3: JNC Off3
JNB ST3, Open3
MOV A, TC3_L
CJNE A, K3_L, Exit3
MOV A, TC3_H
CJNE A, K3_H, Exit3
SETB DT3
SJMP Rest3
Open3: JB ST3, Exit3
JB DT3, Exit3
SETB ST3
RET
Off3: CLR DT3
Rest3: CLR ST3
MOV TC3_H, #00H
MOV TC3_L, #00H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -