📄 pulse.asm
字号:
;-----------------------------------------
;脉冲采集中断程序
;-----------------------------------------
PULSE_ACQUIRE:
PUSH ACC
PUSH PSW
PUSH 00H
PUSH 01H
PUSH 02H
PUSH 03H
PUSH 04H
PUSH 05H
PUSH 06H
PUSH 07H
CLR TR0
MOV P0,#0FFH
CLR C245_E_0_7
NOP
NOP
MOV PULSE_STATE_0_7,P0
SETB C245_E_0_7
CLR C245_E_8_15
NOP
NOP
MOV PULSE_STATE_8_15,P0
SETB C245_E_8_15
MOV R7,#1 ;脉冲通道号1-16
CLR BIT_CHANNEL ;0:通道号=1-8,1:通道号=9-16
MOV A,R7 ;R5脉冲存储地址
DEC A
ADD A,#RAM_PULSES1_0
MOV R5,A
MOV R4,HIGH_PERSISTENCE_0_7 ;R4脉冲状态
MOV R3,PULSE_STATE_0_7 ;R3脉冲输入
MOV R2,#1 ;R2置位
MOV A,R7 ;R1高电平计数器地址
DEC A
ADD A,#HIGH_LEVEL_COUNT0
MOV R1,A
MOV A,R7 ;R0低电平计数器地址
DEC A
ADD A,#LOW_LEVEL_COUNT0
MOV R0,A
NEXT_CHANNEL_S:
MOV A,R4 ;读脉冲状态
RRC A
MOV R4,A
JC JUDGE_LOW ;高电平持续3*5ms到,则判低电平,否则继续判高电平
MOV A,R3 ;读脉冲输入
RRC A
MOV R3,A
JC INC_HIGH_COUNT
MOV @R1,#0 ;脉冲输入中有低电平,清高电平计数
SJMP NEXT_CHANNEL_E
INC_HIGH_COUNT:
INC @R1
MOV A,@R1
CJNE A,#12H,NEXT_CHANNEL_E ;18*1ms
MOV A,R2
JB BIT_CHANNEL,SET_HIGH
ORL HIGH_PERSISTENCE_0_7,A
SJMP SET_OVER
SET_HIGH:
ORL HIGH_PERSISTENCE_8_15,A
SET_OVER: MOV @R0,#0 ;清0低计数
SJMP NEXT_CHANNEL_E
JUDGE_LOW:
MOV A,R3 ;读脉冲输入
RRC A
MOV R3,A
JNC INC_LOW_COUNT
MOV @R0,#0 ;清0低计数
SJMP NEXT_CHANNEL_E
INC_LOW_COUNT:
INC @R0
MOV A,@R0
CJNE A,#12H,NEXT_CHANNEL_E ;--18*1ms
MOV A,R2
CPL A
JB BIT_CHANNEL,CLR_HIGH
ANL HIGH_PERSISTENCE_0_7,A
SJMP CLR_OVER
CLR_HIGH:
ANL HIGH_PERSISTENCE_8_15,A
CLR_OVER:
MOV R6,00H
MOV R0,05H
INC @R0
MOV R0,06H ;1-0跳变,脉冲数+1
SETB SAVE_PULSE_FLAG
MOV @R1,#0 ;清0高计数
MOV @R0,#0 ;清0低计数
NEXT_CHANNEL_E:
INC R7
MOV A,R7
CJNE A,#9,NEXT_CHANNEL_JUDGE
SETB BIT_CHANNEL ;0:通道号=1-8,1:通道号=9-16
MOV R4,HIGH_PERSISTENCE_8_15 ;R4脉冲状态
MOV R3,PULSE_STATE_8_15 ;R3脉冲输入
MOV R2,#1 ;R2置位
SJMP NEXT_CHANNEL_BEG0
NEXT_CHANNEL_JUDGE:
CJNE A,#17,NEXT_CHANNEL_BEG
LJMP RESET_TIMER
NEXT_CHANNEL_BEG:
MOV A,R2
RL A
MOV R2,A
NEXT_CHANNEL_BEG0:
INC R5 ;R5脉冲存储地址
INC R1 ;R1高电平计数器地址
INC R0 ;R0低电平计数器地址
LJMP NEXT_CHANNEL_S
RESET_TIMER:
MOV TH0,#0FCH ;--12MHZ重置T0初值1ms
MOV TL0,#18H
INC COUNTER_100
MOV A,COUNTER_100
CJNE A,#100,PULSE_INIT_BACK ;1.5s
MOV COUNTER_100,#00H
INC COUNTER_1S
MOV A,COUNTER_1S
CJNE A,#15,PULSE_INIT_20S ;2s
SETB SAVE_1S ;2S时间标志
SETB ZJQ_SEND_WAIT ;中继等待时间2S标志
MOV COUNTER_1S,#00H
JB INIT_ST7536_FLAG,PULSE_INIT_BACK ;30s初始化ST7536标志
PULSE_INIT_20S:
INC COUNTER_200
MOV A,COUNTER_200
CJNE A,#200,PULSE_INIT_BACK ;30s
SETB INIT_ST7536_FLAG
MOV COUNTER_200,#00H
PULSE_INIT_BACK:
SETB TR0 ;开定时器
POP 07H
POP 06H
POP 05H
POP 04H
POP 03H
POP 02H
POP 01H
POP 00H
POP PSW
POP ACC
RETI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -