📄 gscm6.asm.asm
字号:
jmp @a+dptr; 转发送功能处理
;陷阱
nop
nop
lcall pc_out_error
;发送控制散转表
send_ctrl_lab: ljmp send_00; 发送结束
ljmp send_01
ljmp send_02
ljmp send_03
ljmp send_04
ljmp send_05
;解释,执行"命令"
send_00: clr p1.5; 485接收允许
setb ren; 数据包发送正常结束,允许接受
mov a,r6; 取执行动作代号
rl a
add a,r6
mov dptr,#doen_lab; 指向执行动作散转表
jmp @a+dptr
;"命令"执行散转表
doen_lab: ljmp uart_int_over; 不执行动作
ljmp cpu_reset; (30h)执行CPU复位
ljmp d_out_me; (33h)数字量输出(自定义)
ljmp d_out_nj; (03h)数字量输出(南京)
ljmp fog_reset; (04h)烟感复位
ljmp isp_ready; (40h)准备进入在系统编程
lcall doen_jmp_error
;执行命令
;执行cpu复位
cpu_reset: setb StarveDogFlag;停止喂狗好了
ljmp uart_int_over
;执行数字量输出(自定义)
d_out_me: mov r0,#SendDataBuffer33_03+2
mov a,@r0
cjne a,#03h,d_out_me_error
; "板槽"信息错,转
mov r0,#SendDataBuffer33_03+3
; 指向发送数据缓冲区的"通道"
mov a,@r0
clr c
subb a,#08d
jnc d_out_me_error
; "通道"大于7,错,转
mov a,@r0
jnz no_zero; 非0值,单通道控制,转
anl Do574Reg,#80h
; 清数字量输出通道,保留烟感复位专用通道值
mov r0,#SendDataBuffer33_03+4
mov a,@r0; 取"参数"
anl a,#7fh; 屏蔽bit7(对应烟感复位专用通道)
orl Do574Reg,a
sjmp and_fog_reset
no_zero: mov dptr,#d_out_me_bit_lab; 指向输出通道屏蔽字表
movc a,@a+dptr; 取通道屏蔽字
mov Reg0,a; 暂存之
inc r0; 指向发送数据缓冲区的"参数"
mov a,@r0
jz turn_off; 为0,关,转
mov a,Reg0
orl Do574Reg,a; 开该通道输出
sjmp and_fog_reset
turn_off: mov a,Reg0
cpl a
anl Do574Reg,a; 关该通道输出
and_fog_reset: mov a,Do574Reg
mov dptr,#DO574
movx @dptr,a; 数字量输出
mov dptr,#DS12887+10h
movx @dptr,a; 保存输出状态
d_out_me_error: ljmp uart_int_over
;数字量输出通道屏蔽字表
d_out_me_bit_lab: db 00h,01h,02h,04h; 第1个值00h恒不取,占位用
db 08h,10h,20h,40h
;执行数字量输出(南京)
d_out_nj: mov r1,#SendDataBuffer33_03+02h
mov a,@r1; 取"槽位"信息
cjne a,#03h,d_out_nj_channels_no36
anl Do574Reg,#0f0h
mov r1,#SendDataBuffer33_03+04h
mov a,@r1
jnb acc.0,d_out_nj_off0
setb Do574Reg.0
d_out_nj_off0: jnb acc.2,d_out_nj_off1
setb Do574Reg.1
d_out_nj_off1: jnb acc.4,d_out_nj_off2
setb Do574Reg.2
d_out_nj_off2: jnb acc.6,d_out_nj_off3
setb Do574Reg.3
d_out_nj_off3: ljmp d_out_nj_doing
d_out_nj_channels_no36: cjne a,#04h,d_out_nj_error
anl Do574Reg,#8fh
mov r1,#SendDataBuffer33_03+04h
mov a,@r1
jnb acc.0,d_out_nj_off4
setb Do574Reg.4
d_out_nj_off4: jnb acc.2,d_out_nj_off5
setb Do574Reg.5
d_out_nj_off5: jnb acc.4,d_out_nj_doing
setb Do574Reg.6
d_out_nj_doing: mov dptr,#DO574
mov a,Do574Reg
movx @dptr,a; 输出
mov dptr,#DS12887+10h
movx @dptr,a; 保存输出状态
d_out_nj_error: ljmp uart_int_over
;执行烟感复位
fog_reset: anl Do574Reg,#7fh
mov a,Do574Reg; 开烟感复位
mov dptr,#DO574
movx @dptr,a
mov dptr,#DS12887+10h
movx @dptr,a; 保存输出状态
mov FogResetCounter,#FOG_RESET_COUNTER_NUM
; 初始烟感复位计数器,实计990ms≤t≤1000ms
ljmp uart_int_over
;准备进入在系统编程
isp_ready: pop a; 丢弃串口中断断点
pop a
ljmp 0045h
;发送地址
send_01: mov sbuf,UartNoReg; 发送"地址"
mov r7,#02h; 写发送控制字
ljmp uart_int_over
;发送数据长度,分析接收的"命令"
send_02: mov r6,#00h; 执行动作寄存器复位(默认无动作)
jb p3.2,sys_good; 系统正常,转
mov r1,#SendDataBufferHitch; 维修应答
ljmp send_long
sys_good: mov r1,#ReceDataBuffer; 指向接收的"命令"
mov a,@r1
cjne a,#32h,order_no32
mov r1,#SendDataBuffer32; 上报数据(自定义)
ljmp send_long
order_no32: cjne a,#02h,order_no02
mov r1,#SendDataBuffer02; 上报数据(南京)
ljmp send_long
order_no02: cjne a,#33h,order_no33
mov r6,#04h; 计数4次
mov r1,#ReceDataBuffer-1
mov r0,#SendDataBuffer33_03
order33_move_loop: inc r1
inc r0
mov a,@r1
mov @r0,a
djnz r6,order33_move_loop
mov r6,#02h; 数字量输出(自定义)
mov r1,#SendDataBuffer33_03
ljmp send_long
order_no33: cjne a,#03h,order_no03
mov r6,#04h; 计数4次
mov r1,#ReceDataBuffer-1
mov r0,#SendDataBuffer33_03
order03_move_loop: inc r1
inc r0
mov a,@r1
mov @r0,a
djnz r6,order03_move_loop
mov r6,#03h; 数字量输出(南京)
mov r1,#SendDataBuffer33_03
ljmp send_long
order_no03: cjne a,#04h,order_no04
mov r6,#04h; 写执行动作寄存器,烟感复位
mov r1,#SendDataBuffer04
ljmp send_long
order_no04: cjne a,#31h,order_no31
mov r1,#SendDataBuffer31
; 上报板位信息(自定义)
ljmp send_long
order_no31: cjne a,#01h,order_no01
mov r1,#SendDataBuffer01
; 上报板位信息(南京)
ljmp send_long
order_no01: cjne a,#40h,order_no40
mov r6,#05h; 写执行动作寄存器,isp编程
mov r1,#SendDataBuffer40
ljmp send_long
order_no40: cjne a,#30h,order_error
mov r6,#01h; 写执行动作寄存器,cpu复位
mov r1,#SendDataBuffer30
ljmp send_long
;一个非法的"命令",原数据包返回(该命令留待以后扩展使用)
order_error: mov r0,#ReceDataBuffer
mov r1,#SendDataBufferError+1
mov a,@r0
mov @r1,a; 获得非法的"命令"
mov r1,#SendDataBufferError
;发送"长度"
send_long: mov a,@r1; 取发送数据长度
mov r5,a; 写发送长度
mov sbuf,a; 发送"长度"
inc r1; 指向"命令"
mov r7,#03h; 写发送控制字
mov r4,#00h; 复位发送部分校验和
ljmp uart_int_over
;发送"数据包"
send_03: mov a,@r1
mov sbuf,a; 发送数据
add a,r4; 校验和累加
mov r4,a
inc r1; 数据指针+1
dec r5; 发送长度-1
cjne r5,#00h,send_data_no_over; 数据未发完,转
mov r7,#04h; "数据包"发送完,写发送控制字
send_data_no_over: ljmp uart_int_over
;发送校验和
send_04: mov sbuf,r4
mov r7,#05h; 写发送控制字
ljmp uart_int_over
;发送包尾
send_05: mov sbuf,#0aah
mov r7,#00h; 写发送控制字
;
uart_int_over: pop dph
pop dpl
pop psw
pop acc
setb ea
reti
;串口中断程序结束
;==============================================================================
;==============================================================================
;定时器2中断程序开始
;控制ICL7109转换;读取,存储其直接结果;控制A/D转换指示灯
;定时器2计时,16位自重装方式,外部触发允许
;本中断程序使用工作寄存组3
;Aic574Reg[.3.2.1.0]—模拟量输入通道1/16选择
;r1—发送缓冲区数据指针(局部自动)
;
timer2_int: clr ea; 关中断
push acc
push psw
push dpl
push dph
orl psw,#00011000b; 使用工作寄存组3
jbc exf2,timer2_e; 转定时器2外部中断处理
jbc tf2,timer2_f; 转定时器2溢出处理
;外部引脚中断,转换结束
timer2_e: clr p3.5; 强制ICL7109结束退积分
setb p1.7; 关所有模拟量通道
mov a,Aic574Reg
anl a,#0fh; 做通道号
mov Reg0,a; 暂存
jb acc.3,ai1_data; 通道号大于7,转
clr p1.4; 开A/D转换指示灯
mov r1,#SendDataBuffer32+0bh; 指向AI0数据区首
sjmp a_data_move
ai1_data: setb p1.4; 关A/D转换指示灯
mov r1,#SendDataBuffer32+0ch; 指向AI1数据区首
a_data_move: rl a; ×2
add a,r1; +AI0/AI1基址
mov AiTaskWord,a; 模拟量任务字
mov r1,a; 指向AI0/1数据区
mov dptr,#ICL7109L
movx a,@dptr; 读取A/D转换结果低字节
mov @r1,a; 存转换结果低字节
inc r1
mov dptr,#ICL7109H; 指向ICL7109高字节
movx a,@dptr; 读取A/D转换结果高字节
mov @r1,a; 存转换结果高字节
mov a,Reg0
inc a; 指向下一通道
anl a,#0fh; 使0h至0fh间循环
anl Aic574Reg,#0f0h
orl Aic574Reg,a; 写通道号
mov a,Aic574Reg
mov dptr,#AIC
movx @dptr,a; 改变预选通道,未开通
setb p3.5; 启动ICL7109转换周期
setb Timer2GoFlag; 定时器2运行标记
ljmp timer2_int_over
;开通模拟量
timer2_f: clr p1.7; 开模拟量通道
;
timer2_int_over: pop dph
pop dpl
pop psw
pop acc
setb ea
reti
;定时器2中断程序结束
;==============================================================================
db 33h 0h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -