📄 gscm6.asm.asm
字号:
;==============================================================================
;本程序为CHS300—GSCM通用采控器(第6版)程序
;for: G:\gscm\program\gscm21.ddb
;拟用多任务方式编程
;fairy,2002.4.23
;==============================================================================
;==============================================================================
;伪定义开始
DS12887 equ 8000h
AIC equ 9000h
ICL7109L equ 0a002h
ICL7109H equ 0a001h
DI0 equ 0b000h
DO574 equ 0c000h
DO245 equ 0b003h
SP_NUM equ 28h; 堆栈指针初始值. 堆栈空间28h—3fh
TH0_NUM equ 0dch; 定时器0初值,10ms
TL0_NUM equ 00h
T1_NUM equ 0fdh; 定时器1初值,波特率19.2kbit/s
RCAP2H_NUM equ 0edh; 定时器2自重装初值
RCAP2L_NUM equ 0ffh;
sfcf equ 0f7h; MailBox设置寄存器
sfdt equ 0f8h; MailBox数据寄存器
sfal equ 0f9h; MailBox低位地址寄存器
sfah equ 0fah; MailBox高位地址寄存器
sfcm equ 0fbh; MailBox命令寄存器
Do574Reg equ 24h; <28h,影射do574.
TaskBitReg equ 25h; <28h
Reg0 equ 40h; <80h,自定义
FogResetCounter equ 41h; <80h,烟感复位延时计数器
FOG_RESET_COUNTER_NUM equ 100d; 烟感复位延时计数初值
; 延时FOG_RESET_COUNTER_NUM×10ms
CpuFlashCounter equ 42h; <80h,cpu闪烁计数器
CPU_FLASH_COUNTER_NUM equ 50d; cpu闪烁计数初值
UartFlashCounter equ 43h; <80h,串口闪烁计数器
UART_FLASH_COUNTER_NUM equ 40h; 每收或发20h个字节闪烁一次
UartOffCounter equ 44h; 串口灯关计数
UART_OFF_COUNTER_NUM equ 60d; 串口灯关计数初值
; 持续UART_OFF_COUNTER_NUM×10ms未收发,关
UartNoReg equ 45h; <80h,站号寄存器
Aic574Reg equ 46h; <80h,影射aic574
AiTaskWord equ 47h; <80h,模拟量部分任务字.0值,无任务
; 非0值,待变换结果数据指针
DoTaskWord equ 48h; <80h,数字量部分任务字.
; 0值,无任务;非0值,有任务
ReceDataBuffer equ 70h; 接收数据缓冲区
SendDataBuffer31 equ ReceDataBuffer+09h
; 发送数据缓冲区31,上报板位信息(自定义)
SendDataBuffer32 equ SendDataBuffer31+0ah
; 发送数据缓冲区32,上报所有数据(自定义)
SendDataBuffer33_03 equ SendDataBuffer32+2ch
; 发送数据缓冲区33h/03,dou输出(自定义/南京)
SendDataBuffer30 equ SendDataBuffer33_03+05h
; 发送数据缓冲区30,cpu复位
SendDataBuffer04 equ SendDataBuffer30+02h
; 发送数据缓冲区04,烟感复位
SendDataBuffer40 equ SendDataBuffer04+03h
; 发送数据缓冲区40,isp编程
SendDataBuffer01 equ SendDataBuffer40+02h
; 发送数据缓冲区01,上报板位信息(南京)
SendDataBuffer02 equ SendDataBuffer01+0ah
; 发送数据缓冲区02,上报所有数据(南京)
SendDataBufferError equ SendDataBuffer02+2eh
; 非法命令回送数据缓冲区
SendDataBufferHitch equ SendDataBufferError+02h
; 正在维修发送数据缓冲区
UartGoFlag equ 00h; 串口运行标记
OldUartGoFlag equ 01h; 串口在运行标记
Timer2GoFlag equ 02h; 定时器2运行标记,定时器2中断中置位
StarveDogFlag equ 03h; 饿狗标记,串口中断中执行CPU复位命令时置位
GoGoodFlag equ 04h; 正常运行标记
;伪定义结束
;==============================================================================
;==============================================================================
;中断程序定位开始
org 0000h
ljmp main
org 0003h
reti
org 000bh
ljmp timer0_int
org 0013h
reti
org 001bh
reti
org 0023h
ljmp uart_int
org 002bh
ljmp timer2_int
;中断程序定位结束
;==============================================================================
;==============================================================================
;主程序开始
;初始化中断,定时器,外围设备;读取串口站址;初始化数据区,堆栈指针;将模拟量由自定义
;格式转换成南京格式;将数字量输出反馈由自定义格式转换成南京格式
;本程序使用工作寄存组0
;初始化使用定时器0
org 0080h
main: mov psw,#00h
mov p0,#0ffh
mov p1,#0ffh
mov p2,#0ffh
mov p3,#0ffh
mov ip,#00h
mov ie,#00h
mov tmod,#00h
mov tcon,#00h
mov th0,#00h
mov tl0,#00h
mov th1,#00h
mov tl1,#00h
mov th2,#00h
mov tl2,#00h
mov rcap2h,#00h
mov rcap2l,#00h
mov t2con,#00h
mov scon,#00h
mov pcon,#00h
mov sp,#SP_NUM
;初始化定时器
mov th0,#TH0_NUM; 定时器0置初值,10ms
mov tl0,#TL0_NUM
mov tmod,#21h; 定时器0工作模式1,定时器1工作模式2
setb tr0; 启动定时器0
mov ie,#10000010b; 中断总开,定时器0开
;
clr p1.3; 开cpu运行指示灯
setb GoGoodFlag; 初始正常运行标记
clr StarveDogFlag; 复位饿狗标记
clr p3.3; 初始喂狗线低电平
mov AiTaskWord,#00h; 复位模拟量输入任务字
mov DoTaskWord,#00h; 复位数字量输出任务字
;关所有模拟量通道
setb p1.7
;7109保持
clr p3.5
;初始所有数字量通道
setb p3.4; 读DS12887,禁止数据总线
mov dptr,#DS12887+10h
movx a,@dptr; 读掉电前数字量输出值
mov Do574Reg,a; 初始数字量输出影射
clr p3.4; 数据总线使能
mov dptr,#DO574
movx @dptr,a; 初始数字量输出
mov 0fh,#00h; 工作寄存组1~r7初始,串口收发控制字
;初始上报板位信息(自定义)命令应答包
mov r1,#SendDataBuffer31
mov @r1,#09h; 初始"长度"
inc r1
mov @r1,#01h; 初始"命令"
inc r1
mov @r1,#04h
inc r1
mov @r1,#04h
inc r1
mov @r1,#04h
inc r1
mov @r1,#06h
inc r1
mov @r1,#02h
inc r1
mov @r1,#02h
inc r1
mov @r1,#0ffh
inc r1
mov @r1,#0ffh
;初始上报所有数据(自定义)命令应答包
mov r1,#SendDataBuffer32
mov @r1,#2bh
inc r1
mov @r1,#02h
inc r1
mov @r1,#04h
mov r1,#SendDataBuffer32+04h
mov @r1,#14h
mov r1,#SendDataBuffer32+06h
mov @r1,#24h
mov r1,#SendDataBuffer32+08h
mov @r1,#36h
mov r1,#SendDataBuffer32+0ah
mov @r1,#42h
mov r1,#SendDataBuffer32+1bh
mov @r1,#52h
;初始dou输出(自定义/南京)命令应答包
mov r1,#SendDataBuffer33_03
mov @r1,#04h
;初始cpu复位命令应答包
mov r1,#SendDataBuffer30
mov @r1,#01h
inc r1
mov @r1,#30h
;初始烟感复位命令应答包
mov r1,#SendDataBuffer04
mov @r1,#02h
inc r1
mov @r1,#04h
inc r1
mov @r1,#00h
;初始isp编程命令应答包
mov r1,#SendDataBuffer40
mov @r1,#01h; "长度"
inc r1
mov @r1,#40h; "命令"
;初始上报板位信息(南京)命令应答包
mov r1,#SendDataBuffer01
mov @r1,#09h
inc r1
mov @r1,#01h
inc r1
mov @r1,#04h
inc r1
mov @r1,#04h
inc r1
mov @r1,#04h
inc r1
mov @r1,#06h
inc r1
mov @r1,#06h
inc r1
mov @r1,#02h
inc r1
mov @r1,#02h
inc r1
mov @r1,#0ffh
;初始上报所有数据(南京)命令应答包
mov r1,#SendDataBuffer02
mov @r1,#2dh
inc r1
mov @r1,#02h
inc r1
mov @r1,#04h
mov r1,#SendDataBuffer02+04h
mov @r1,#14h
mov r1,#SendDataBuffer02+06h
mov @r1,#24h
mov r1,#SendDataBuffer02+08h
mov @r1,#36h
mov r1,#SendDataBuffer02+0ah
mov @r1,#46h
mov r1,#SendDataBuffer02+0ch
mov @r1,#52h
mov r1,#SendDataBuffer02+1dh
mov @r1,#62h
mov r1,#SendDataBuffer02+25h
DataBuffer02_move00: inc r1
mov @r1,#00h
cjne r1,#SendDataBuffer02+2dh,DataBuffer02_move00
;初始命令错误应答包
mov r1,#SendDataBufferError
mov @r1,#01h
;初始正在维修应答包
mov r1,#SendDataBufferHitch
mov @r1,#02h
inc r1
mov @r1,#70h
;读取串口通信地址
mov dptr,#DS12887
movc a,@a+dptr; a不必清0
cpl a
mov UartNoReg,a
;485总线接收允许
clr p1.5
;初始化串口
clr UartGoFlag
clr OldUartGoFlag
mov tl1,#T1_NUM; 波特率19200bit/s
mov th1,#T1_NUM
mov tmod,#21h
orl pcon,#80h; 波特率增倍
setb tr1
mov scon,#01000000b
setb ren; 允许接收
setb es
;初始定时器2,启动ICL7109转换
mov Aic574Reg,#00h; 初始通道及页面控制寄存器
mov th2,#00h; 最长定时周期
mov tl2,#00h
mov rcap2h,#RCAP2H_NUM; 定时器2自重装值1ms
mov rcap2l,#RCAP2L_NUM
mov dptr,#AIC
mov a,#00h
movx @dptr,a; 初始预选通0通道
clr p1.7; 开模拟量通道
setb p3.5; 启动0通道转换
mov t2con,#0ch; 外部允许,启动计时功能,自重装
;开放中断
main_loop: setb GoGoodFlag; 正常运行标记
anl psw,#11100111b; 使用寄存器工作组0.此条必须
mov ip,#10h; 串口中断高优先级
mov ie,#10110010b; 中断总开,定时器0/2,串口开
;主程序后台任务
mov a,AiTaskWord
jnz ai_task; 非0,转,模拟量部分作业
ljmp do_task_verify; 跳,判断模拟量部分任务有否
;模拟量输入格式转换部分作业
ai_task: mov r4,#00h; 清BCD码低字节寄存
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -