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 StaveDogFlag ;复位饿狗标记
clr p3.3 ;初始喂狗线低电平
move AiTaskWord,#00h ;复位模拟量输入任务字
move 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,#SendDateBuffer31
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,#SendDateBuffer32
mov @r1,#2bh
inc r1
mov @r1,#02h
mov r1,#SendDateBuffer32+04h
mov @r1,#14h
mov r1,#SendDateBuffer32+06h
mov @r1,#24h
mov r1,#SendDateBuffer32+08h
mov @r1,#36h
mov r1,#SendDateBuffer32+0ah
mov @r1,#42h
mov r1,#SendDateBuffer32+1bh
mov @r1,#52h
完成上报所有数据命令的答应包初始化,主程序继续初始DOU输出命令答应包、CPU复位命令答应包、烟感复位命令答应包和ISP编程命令答应包。
;DOU输出命令答应包
mov r1,#SendDateBuffer33_03
mov @r1,#04h
;CPU复位命令答应包
mov r1,#SendDateBuffer30
mov @r1,#01h
Inc r1
mov @r1,#30h
;烟感复位命令答应包
mov r1,#SendDateBuffer04
mov @r1,#02h
Inc r1
mov @r1,#04h
Inc r1
mov @r1,#00h
;ISP编程命令答应包
mov r1,#SendDateBuffer40
mov @r1,#01h ;“长度”
Inc r1
mov @r1,#40h ;“命令”
接下来仍然是上报板位信息命令答应包的初始化过程。
mov r1,#SendDateBuffer01
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,#SendDateBuffer02
mov @r1,#2dh
Inc r1
mov @r1,#02h
Inc r1
mov @r1,#04h
mov r1,#SendDateBuffer02+04h
mov @r1,#14h
mov r1,#SendDateBuffer02+06h
mov @r1,#24h
mov r1,#SendDateBuffer02+08h
mov @r1,#36h
mov r1,#SendDateBuffer02+0ah
mov @r1,#46h
mov r1,#SendDateBuffer02+0ch
mov @r1,#52h
mov r1,#SendDateBuffer02+1dh
mov @r1,#62h
mov r1,#SendDateBuffer02+25h
DateBuffer02_move00: inc r1
mov @r1,#00h
cjne r1,SendDateBuffer02+2dh,DateBuffer02_move00
完成通信协议的初始化过程。
;初始命令错误答应包
mov r1,#SendDateBufferError
mov @r1,#01h
;初始正在维修答应包
mov r1,#SendDateBufferHitch
mov @r1,#02h
inc r1
mov @r1,#70h
接下来主程序将初始化串口地址、定时器,并启动ICL7109。
;读取串口通信地址
mov dptr,#DS12887
movc a,@a+dptr ;a不必清零
cpl a
mov UartNoReg,a
;485总线接受允许
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码低字节寄存
mov r5,#00h ;清BCD码高字节寄存
mov dptr,#ai_task_bin_bcd_lab
mov r6,#00h ;复位b表指针
mov r1,AiTaskWord
mov a,@r1
mov r3,a ;r3—移位寄存器
ai_task_bin_bcd_loop:
mov a,r3
rrc a
mov r3,a
jnc ai_task_bit_is0 ;该位为0,转
mov a,r6
movc a,@a+dptr ;取权低位
add a,r4 ; BCD码低位和
da a
mov r4,a
inc r6 ;ai_task_bin_bcd_lab表指针+1
mov a,r6
movc a,@a+dptr ;取权高位
addc a,r5 ; BCD码高位和
da a
mov r5,a
inc r6 ;ai_task_bin_bcd_lab表指针+1
sjmp ai_task_byte_ok_ma
ai_task_bit_is0:
inc r6 ;ai_task_bin_bcd_lab表指针+2
inc r6
ai_task_byte_ok_ma:
cjne r6,#16d,ai_task_this_byte ;字节未完,转
inc r1
mov a,@r1
mov r3,a ;高字节bin码进移位寄存器
ai_task_this_byte:
cjne r6,#24d,ai_task_bin_bcd_loop :12位未完,转
;bin—BCD转换结束
mov a,#SendDateBuffer02-SendDateBuffer32+02h
add a,AiTaskWord
mov r0,a ;指向SendDateBuffer02中模拟量的值
clr ea ;关中断,更新同步
mov a,r4
mov @r0,a ;更新上报模拟量数据
inc r0
mov a,r5
mov @r0,a
setb ea
mov AiTaskWord,#00h ;清除任务标记
ljmp do_task_verify
;二进制权值表
;每行4个压缩bcd码依次为个_十_千_百
ai_task_bin_bcd_lab:
db 01h,00h
db 02h,00h
db 04h,00h
db 08h,00h
db 16h,00h
db 32h,00h
db 64h,00h
db 28h,01h
db 56h,02h
db 12h,05h
db 24h,10h
db 48h,20h
;数字量输出反馈的格式转换部分作业
do_task_verify:
mov a, DoTaskWord
jb acc.7,do_task ;数字量部分作业
limp go_to_sleep
do_task:
mov r1,#SendDateBuffer32+03h
mov r0,#SendDateBuffer02+03h
do_task_move_loop:
mov a,@r1
mov @r0,a ;更新上报DI数据
inc r1
inc r1
inc r0
inc r0
cjne r1,#SendDateBuffer32+09h,do_task_move_loop
mov TaskBit Reg,#00h
mov a,#r1 ;取数字量输出反馈值
jnb acc.0,do_task_off0
setb TaskBit Reg.0
do_task_off0:
jnb acc.1,do_task_off1
setb TaskBit Reg.2
do_task_off1:
jnb acc.2,do_task_off2
setb TaskBit Reg.4
do_task_off2:
jnb acc.3,do_task_off3
setb TaskBit Reg.6
do_task_off3:
mov r0,#SendDateBuffer02+09h
mov @r0,TaskBitReg ;更新上报DO0数据
mov TaskBitReg,#00h
mov a,@r1
jnb acc.4,do_task_off4
setb TaskBit Reg.0
do_task_off4:
jnb acc.5,do_task_off5
setb TaskBit Reg.2
do_task_off5:
jnb acc.6,do_task_off6
setb TaskBit Reg.4
do_task_off6:
jnb acc.7,do_task_off7
setb TaskBit Reg.6
do_task_off7:
mov r0,#SendDateBuffer02+0bh
mov @r0,TaskBitReg ;更新上报DO1数据
mov DoTaskWord,#00h ;清除任务标记
;时时更新串口通信地址
mov dptr,#DS12887
movc a,@a+dptr ;a不必清0
cpl a
mov UartNoReg,a
go_to_sleep:
orl pcon,#01h ;CPU进入空闲方式
nop
ljmp main_loop
;陷阱
nop
nop
call pc_out_erro
附录3:
Rece:
mov a,r7 ;r7=rece_ctrl
Rl a
Add a,r7 ;*3
Mov dptr, #rece_ctrl_lab
Jmp @a+dptr ;转接收功能处理
;陷阱
Nop
Nop
Lcall pc_out_error
;接收控制散转表
Rece_ctrl_lab:
Limp rece_00
Limp rece_01
Limp rece_02
Limp rece_03
Limp rece_04
Limp rece_05
rece_00:
Mov a,sbuf
Cjne a,#55h,rece_no_head
Mov r7,#01h ;包头,写接收控制字01h
Rece_no_head:
Ljmp uart_int_over
rece_01:
Mov a,sbuf
;地址不符合,转
Cjne a,uartnoreg,address_no
;地址符合,写接收控制字02h,准备接受“长度”
Mov r7,#02h
Ljmp uart_int_over
;地址不符合,写接收控制字,复位接收“包头”
Address_no:
Mov r0,#00h
Ljmp uart_int_over
Rece_02:
Mov a,sbuf
Anl a,#07h ;限制“数据长度”<8
Jinz rece_02_good
Mov r7,#00h
;“数据长度”=0,复位接收控制
Ljmp uart_int_over
Rece_02_good:
Mov r6,a ;存“长度”
Mov r5,#00h ;已接收数据长度复位00h
Mov r4,#00h ;初始已接收部分校验和
;初始数据接收指针
Mov r1,#recedatabuffer
Mov r7,#03h ;写接收控制字,准备接受“数据包”
Ljmp uart_int_over
Rece_03:
Mov a,sbuf
Mov @r1,a ;存接收数据
Inc r1 ;指向下一单元
Add a,r4 ;接收部分校验和累加
Mov r4,a ;存校验和
Inc r5 ;已接收数据长度+1
Mov a,r5
Mov reg0,r6
Cjne a,reg0,rece_data_no_over
Mov r7,#04h
;已接收控制字,准备接收校验和
Rece_data_no_over:
Ljmp uart_int_over
Rece04:
Mov a,sbuf
Mov reg0,r4
Cjne a,reg0,recechecksum_error ;比较校验和,错,转
Mov r7,#05h ;写接收控制字,准备接收包尾
Ljmp uart_int_over
Recechecksum_error:
Mov r7,#00h ;写接收控制字,复位接收包头
Ljmp uart_int_over
Rece_05:
Mov a,sbuf
Cjne a,#0aah,rece_over_error
;非正常结果包尾,转
Clr ren ;回应中禁止接收
Setb p1.5 ;485发送允许
Mov sbuf,#55h ;发送“包头(55h)”
Mov r7,#01h ;写发送控制字,准备发送地址
Ljmp uart_int_over
Rece_over_error:
Mov r7,#00h ;复位接收控制字,准备接受包头
Ljmp uart_int_over
附录4:
Send:
Mov a,r7
Rl a
Add a,r7 ;*3
Mov dptr,#send_ctrl_lab
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_error ;不执行动作
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
jmp and_fog_reset
;指向输出通道屏蔽字表
No_zero:
Move 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 ;第一个值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.2,d_out_nj_off2
Setb do574reg.2
D_out_nj_off2:
Jnb acc.2,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 fog_reset_counter,#fog_reset_counter_num
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 ;计数四次
Mov r1,#senddatabuffer33_03
Order33_move_loop:
Inc r1
Inc r0
Mov a,@r1
Mov @r0,a
Djnz r6,Order33_move_loop
Ljmp r6,#02h ;数字量输出
Mov r1,#senddatabuffer33_03
Ljmp send_long
Order_no33:
Cjne a,#03h,Order_no03
Mov r6,#04h ;计数四次
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
Inc r5 ;发送长度-1
Cjne r5,#00h,send_data_no_over ;数据未完成,转
Mov r7,#04h ;数据包发送完,写发送控制字
Send_data_no_over:
Ljmp uart_int_over
;发送校验和
Send_04:
Move 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
|