在8031单片计算机工控应用系统中,抗干扰能力是影响控制系统稳定运行的主要因素。工业现场的干扰类型是多种多样的,干扰的后果也相差很大。一种情况是:对于传感器、A/D转换器等模拟量的干扰可以采用采样N点排序去极值再求平均值来实现软件抗干扰;另一种情况是:干扰过大,将程序寄存器的地址打乱同时也把一部分寄存器及存储器的内容破坏,这时计算机不能正常工作,甚至失控,从而隐入死循环状态。对于破坏寄存器及存储器内容的后果,我们可以采用系统实时自诊断方法来解决。8031单片机寻址范围可达64k EPROM和64k RAM及I/O设备。一般情况下,用户仅把程序芯片的多余字节用LJMP××××H来填满,这里××××为返回的入口地址。这种方法只解决了突然产生的干扰使PC指针打乱后落在非用户区(但在芯片范围内)不形成死循环的问题。对PC指针打乱后落在全地址区则无能为力,同时也不能从程序在发生故障时刻运行的位置开始复执而只是从头卷回。本文主要就程序寄存器的地址打乱论述一种实用的软硬件结合的程序卷回抗干扰方法。
硬件电路及工作原理
如图所示,扫描输入可借用定时器/计数器的中断输出,也可以在系统中设置专门扫描清“0”输入信号。

这里Ф取32kHz石英晶体谐振器。4060为14级分频器,它的输出可根据不同用户需要而设置,以Q14输出为例,最大范围可在250ms左右计满输出。设实际运行的用户程序(或称为子程序)所需工作周期为T,分频器计满时间设为T′,T′>T。如果系统正常工作,则分频器永无计满输出信号。一旦工作不正常(飞程序或锁程序)分频器R端得不到定时扫描输入信号,则分频器计满输出一脉冲信号复位CPU。为了高质量修复程序,可以使一个被强干扰打乱或“锁死”的程序恢复到受干扰前正在执行的任务上,仿佛什么也未发生,从而大大提高了系统实时运行的可靠性。
软件设计
初始化中设标志单元A=B=C=#00H,A,B,C间隔一定地址,目的是若程序打乱或锁死,则在A,B,C3个单元数值都一样时进入对应子程序入口的修复程序(高质量修复程序),反之进入从头卷回(即从头执行)程序。
各段用户程序设置A,B,C单元数值为:
主程序(初始化):A=B=C=#00H
用户程序1:A=B=C=#01H
用户程序2:A=B=C=#02H
用户程序 M:A=B=C=#MH
M≤255,M为最后执行(包括中断、嵌套)的用户程序,最后一个用户程序返主程序时,重置A=B=C=#00H。
系统打乱后由前叙电路置PC(程序计数器)为0000H,这时先进入判别子程序,根据A,B,C值转相应用户程序或顺序执行(当A=B=C=#00H时)。
程序:设A单元,B单元,C单元分别为10H,30H,70H。
ORG 0000H
LJMP MAIN
……
MAIN:MOV A,10H
CJNE A,# 00H0
MOV A,30H
CJNE A,#00H0
MOV A,70H
CJNE A,#00H0
MA00:LJMP MPG(主程序)
MA0: CLR C
MOV A,10H
SUBB A,30H
JZ MA1
LJMP MA00
MA1: CLR C
MOV A,10H
SUBB A,70H
JZ MA2
LJMP MA00
MA2: MOV A,10H
CJNE A,#01H,MA3
MOV A,30H
CJNE A,#01H,MA3
MOV A,70H
CJNE A,#01H,MA3
LJMP SP1(用户程序1)
MA3: MOV A,10H
CJNE A,#02H,MA4
MOV A,30H
CJNE A,#02H,MA4
MOV A,70H
CJNE A,#02H,MA4
LJMP SP2(用户程序2)
MA4: ……
MAM: MOV A,10H
CJNE A,#MH,MAN
MOV A,30H
CJNE A,#MH,MAN
MOV A,70H
CJNE A,#MH,MAN
LJMP ASPM(用户程序M)
MAN: LJMP MA00
(何俊)