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

📄 gscm6.asm.asm

📁 《单片机应用系统设计与产品开发》配套源码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
                        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 + -