资源描述
,单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第六章,监控主程序的设计,监控程序的任务是接受、分析和执行,来自键盘和,GP-IB,接口的命令,。,第六章 监控主程序的设计,监控程序可分为:,(1)监控主程序,其任务是识别按键、解释命令并获得相应的处理子程序的入口地址。,(2)接口管理主程序,接受和分析来处,GP-IB,接口的命令,把控制转到相应的命令处理子程序的入口。,(3)命令处理子程序,其任务是具体执行命令、完成命令所规定的各项实际动作。,第六章 监控主程序的设计,命令处理子程序随智能仪器不同而异,即使在同一智能仪器中,也随命令不同而异。但监控主程序在不同智能仪器中却有相同的结构和通用的设计方法,本章介绍监控主程序的两种设计方法。,6.1,直接分析法,6.2,状态变量法,第六章 监控主程序的设计,6.1,直接分析法,所谓直接分析法,就是只需根据当前按键的编码,把控制直接分支到相应的处理子程序的入口,而无需知道在此之前的按键情况。这种方法适用于一键一义的情况。,具体设计时可用选择结构,也可用转移表。,一、用选择结构法设计监控主序,这种方法适用于比较简单的场合。在单片机应用系统中,键盘接口提供了被按键读数,即有键按下时,CPU,可得到被按键的读数(即键值),监控主程序根据键读数把控制转到相应的处理子程序入口 。,一、用选择结构法设计监控主序,按键,数字键,命令键,主功能命令,非主功能命令,通常智能仪器键盘上按键分两大类:,用选择结构法设计的监控主程序的流程图如图,6-1,所示:,一、用选择结构法设计监控主序,一、用选择结构法设计监控主序,若某智能仪器键值,K,为,09,是数字键,为,AF,是命令键,设均为主功能命令,且暂不设主功能标志,分别对应于命令处理子程序1、26,键值暂存于寄存器,B,中。汇编程序如下:,一、用选择结构法设计监控主序,汇编程序如下:,MOV A, B,CLR C,SUBB A, #0AH,JC DIG,CJNE A, #00H, 02H,AJMP addr11.1,CJNE A, #01H, 02H,AJMP addr11.2,CJNE A, #05H, 02H,AJMP addr11.6,DIG: ,一、用选择结构法设计监控主序,一、用选择结构法设计监控主序,其中,addr11.1、addr11.2、addr11.6,分别为各处理子程序入口地址的低11位。这样转移的范围不超过2,K,字节。也可用,LJMP,指令,子程序便可在64,K,范围内任意安排。,二、用转移表法设计监控主程序,这种方法的核心是建立一张一维的转移表。,转移表: 就是顺序登记了各命令处理子程序的入口地址(或转移指令)的数据表格。,二、用转移表法设计监控主程序,a),用子程序入口地址构成的转移表。,b),用转移指令构成的转移表。,对于前例,若用转移表法设计监控主程序,就是根据当前按键的编码,查阅转移表,便可获得相应命令处理子程序的入口。所设计的监控主程序流程如图,6-3,所示。,二、用转移表法设计监控主程序,二、用转移表法设计监控主程序,对于,6-2(a),所示的转移表,,监控主程序如下:,MOV DPTR, #TABL,MOV A, B ;,取键值,CLR C,SUBB A, #0AH ;,是数字键吗?,JC DIG,RLC A,MOV R3, A,MOVC A, A+DPTR,二、用转移表法设计监控主程序,MOV R2,A,INC DPTR,MOV A,R3,MOVC A,A+DPTR,MOV DPH,A,MOV DPL,R2,CLR A,JMP A+DPTR,TABL:ADSUB1,ADSUB2,DIG: ,a),用子程序入口地址,构成的转移表,二、用转移表法设计监控主程序,对于图,6-2(b),所示的转移表,,监控主程序如下:,MOV A,B,CLR C,SUBB A,#0AH,JC DIG,RLC A,MOV DPTR,#TABL,JMP A+DPTR,TABL:AJMP addr11.1,AJMP addr11.2,DIG: ,b),用转移指令构成的转移表,二、用转移表法设计监控主程序,在一键多义的情况下,一个命令是由一个按键序列所组成,因此对于一键多义的监控程序,首先要判断一个按键序列是否已经构成命令,若已构成合法命令、则执行命令,否则等待新的按键输入。,二、用转移表法设计监控主程序,一键多义的监控程序仍可采用转移表法进行设计,但要用多张转移表,前面几张起着引导作用,最后一张可找到命令处理子程序的入口。,二、用转移表法设计监控主程序,例:某电压频率计面板上有,A、B、C、D、GATE、SET、OFS、RESET,等八个键、按,RESET,键使仪器初始化并启动测量,初始化后直接按,A,或,B、C、D,键,分别进行测频或测周期、测时间间隔、测电压等,按,GATE,键后再按,A,或,B、C、D,键,则输入一个常数(偏移),若按奇数次,OFS,键,进入偏移工作方式,按偶数次,OFS,键,则为正常工作方式。,二、用转移表法设计监控主程序,采用转移表法所设计的监控程序如图,6-4,。该程序内包含了三张转移表。,GATE、SET,键分别把控制引向转移表2与3,以区别,A、B、C、D,键的三种含义。每执行完一个命令,微处理器继续扫描键盘,等待新的命令输入。,二、用转移表法设计监控主程序,二、用转移表法设计监控主程序,以查询方式处理键盘接口的方法在智能仪器中有时会遇到困难。因为在智能仪器中,当接到某些命令后,通常要反复执行这些命令,直到接收新的主功能命令为止,这样微处理器就无时间询问并扫描键盘。这时宜采用中断方式处理键盘接口较好。,二、用转移表法设计监控主程序,此外,智能仪器监控程序具有实时性,一旦出现按键中断后,通常应该作废正在进行的一次测量;当中断服务程序完成后,重新启动一次测量,而不回到程序中断点处恢复原来进行的测量多半是一次错误的测量。考虑到这些因素。上例监控程序可设计成图,6-5,所示的形式。,二、用转移表法设计监控主程序,二、用转移表法设计监控主程序,上述这些监控程序的特点是命令的识别与处理子程序的执行交织在一起,相互牵连,结构复杂而凌乱无序,不易修改、阅读与调试。当按键较多、复用次数较多时,这一矛盾尤为突出。在一键多义的情况下,用状态变量法设计监控主程序可以克服这些缺点。,6.2,状态变量法,一、状态变量法的实质,二、状态变量法设计步骤,三、设计状态图和状态表的原则与技巧,四、用状态变量法设计监控主程序实例,6.2,状态变量法,所谓状态变量法就是将仪器工作的整个过程划分为若干个状态,在任一状态下,每个按键都有一个准确的含义。即状态与按键的每一种组合均应执行一个子程序并变迁到下一个状态(称为次态,用,NEXST,表示)。这可用一个矩阵来表示,称状态矩阵或状态表 ,如表,6-1,所示:,一、状态变量法的实质,按键状态,K,1,K,2,K,n,ST,0,SUB,01,NEXST,01,SUB,02,NEXST,02,SUB,0,n,NEXST,0,n,ST,1,SUB,11,NEXST,11,SUB,12,NEXST,12,SUB,1,n,NEXST,1,n,ST,m,SUB,m,1,NEXST,m,1,SUB,m,2,NEXST,m,2,SUB,mn,NEXST,mn,一、状态变量法的实质,这样智能仪器内部,CPU,只要记住仪器当前的状态即现态,当有键入时,根据当前按键和现态这两个关键字查阅状态表,便可确定按键的含义,这就是状态变量法的实质。,一、状态变量法的实质,上述状态表中表示仪器有,n,个按键、,m+1,个状态。若,在,ST,i,(0 i m),态按,K,j,(1 j n),键,则将执行,SUB,i,子程序(,i,为子程序号数或首址),并变迁到,NEXSTr,态(0,r m)。,一、状态变量法的实质,表,6-1,是一个稀疏矩阵,若直接利用则占用内存量大,程序运行速度也慢。因而必须进行压缩,将那些无效组合集中起来进行处理,稍微改变排列,就成为表,6-2,所示形式。,一、状态变量法的实质,一、状态变量法的实质,表中“*”号表示各无意义按键的集合。这一状态表明确规定了仪器在每个状态下接受各种按键时所应进行的实际动作,也规定了状态的变迁,因而是监控程序的“大纲”。,一、状态变量法的实质,用状态变量法设计监控主程序是将仪器工作的整个过程划分为若干个“状态”,在任一状态下,每个按键都有一个确定的含义,即执行另一个子程序且变迁到另一个状态(次态),把这种状态与按键对应关系的组合列成一张表 状态表,存入存储器中。仪器现在所处的状态即现态专门用一个存储单元来记忆,监控主程序就根据现态和当前按键这两个关键字查阅状态表,便可确定按键的确切含义。,二、状态变量法设计步骤,下面举例来说明设计步骤。设某电压频率计的键盘安排如图,6-6,所示。,二、状态变量法设计步骤,其中,F、T、TA-B,及,V,键规定了仪器的测量功能,,SET,键规定数字键09及小数点键作输入常数或自诊断用,,GATE,键规定数字键作闸门时间或电压量程用。若按,OFS,键奇数次,则进入偏移工作方式,按,OFS,键偶数次,为正常工作方式,按,CHS,键改变常数符号,负数为负偏移方式,正数为正偏移方式。,第一步画出键盘状态图,本例可设计成如图,6-7,的键盘状态图。,二、状态变量法设计步骤,二、状态变量法设计步骤,二、状态变量法设计步骤,第二步画出与状态图对应的状态表,1、先画符号形式的状态表,如表,6-3,所示。,1,DIG,CHS,SET,RESET,*,1,1,3,5,0,7,8,0,6,0,2,DIG,RESET,*,5,5,0,9,6,0,3,DIG,RESET,*,3,4,0,10,0,0,4,RESET,*,5,4,6,11,5,*,0,0,状 态,按 键,次 态,子 程 序,0,F,T,T,A-B,V,SET,GATE,OFS,*,5,5,5,5,1,2,5,5,1,2,3,4,0,0,5,0,二、状态变量法设计步骤,在符号形式状态表中,各按键是用符号表示的,显然这是不能存到存贮器的,必须用键码代替。在键盘接口中已经可以获得键码了,但为了压缩状态表,通常对按键进行重新编码,将键码分为,FNKY,和,NUMB,两个部分:对于数字键,令,FNKY=1,对于命令键,令,NUMB=0。,列出表,6-4,所示的键码表。,2、画出机器码形式的状态表。,键,名,键 码,FNKY,NUMB,键 名,键 码,FNKY,NUMB,0,1,2,3,4,5,6,7,8,9,00,01,02,03,04,05,06,07,08,09,01,01,01,01,01,01,01,01,01,01,00,01,02,03,04,05,06,07,08,09,F,T,T,A-B,V,SET,GATE,OFS,CHS,RESET,0A,0B,0C,0D,0E,0F,10,11,12,13,01,02,03,04,05,06,07,08,09,0A,0A,00,00,00,00,00,00,00,00,00,二、状态变量法设计步骤,2、画出机器码形式的状态表。,这样我们便可以把符号形式的状态表转换为机器码形式的状态表,如表,6-5,。,二、状态变量法设计步骤,2、画出机器码形式的状态表。,ST,FNKYT,NEXST,SUB,0,02,03,04,05,06,07,08,00,05,05,05,05,01,02,05,05,01,02,03,04,00,00,05,00,1,01,09,06,01,01,03,07,08,00,二、状态变量法设计步骤,ST,FNKYT,NEXST,SUB,1,0A,00,05,00,06,00,2,01,0A,00,05,05,00,09,06,00,3,01,0A,00,03,04,00,10,00,00,4,0A,00,05,04,06,11,5,00,00,00,二、状态变量法设计步骤,第三步 编写程序,1.画出程序流程图,本例流程图如图,6-8,所示:,二、状态变量法设计步骤,说明:,(1)为了避免不必要的两 次按键,,通常将“,0”,态设计成不稳定态。程序中当判明取来的,NEXST,为“0”时,就自动再查一次状态表,便可脱离“0”,迁移到另一个状态。,二、状态变量法设计步骤,(2)若输入的是主功能命令键,则 把相应的标志置入,MAINFN,单元,并连续执行其测量程序,若输入的是非主功能命令键,则当完成中断服务程序后,或等待,或恢复原来的测量功能。,二、状态变量法设计步骤,(3)状态表中每一栏的最后一行用“*”号(符号形式)或00(16进制数形 式)表示各无意义按键的集合,所以在程序中如本栏查完了,还找不到,FNKYT=FNKY,,则该按键一定为无意义的按键,就应该把最后一行的,NEXST,和,SUB,取出来用。,二、状态变量法设计步骤,2、用汇编语言来编写程序。,三、设计状态图和状态表的原则与技巧,设计状态图和状态表是用状态变量法设计监控主程序的关键技术,下面讨论设计状态图和状态表的一些原则与技巧。,三、设计状态图和状态表的原则与技巧,1.在一个状态每个按键只能有一个含义;所有按键中只要有一个按键具有两个含义,就必须设立两个状态加以区别。如图,6-9,中的1态和2态不能合并。,三、设计状态图和状态表的原则与技巧,2.若在两个或两个以上状态中所有按键含义都相同,则不论它们由何态、何键迁移而来,均可合并。如图,6-10,所示,三、设计状态图和状态表的原则与技巧,3.状态变量法与标志的结合应用,虽然单独利用状态变量法能设计各种智能仪器的监控程序,但有时以状态表为主体结合采用其它一些编程技术能有效地提高程序质量。如图,6-7,中使用标志配合,否则相应部分必须改成图,6-11,所示。,三、设计状态图和状态表的原则与技巧,三、设计状态图和状态表的原则与技巧,4.状态变量法与转移表的结合使用,先用状态变量法区分多义键,在键的意义子集确定后,再用转移表法分支到确定的处理子程序。,如图,6-7,中,在状态3,各数字键起着命令键的作用,但在状态图中仅用一根流线(状态表内列一项)表示,另用一张转移表根据数字键的,NUMB,值进行分支,这样效果较好。,三、设计状态图和状态表的原则与技巧,5.不稳态0态的设立不仅如前所述避免了不必要的两次按键,而且大大减少了状态间流线的互连,也就大大精简了状态表。如图,6-12,所示,设了不稳定态后流线大大减少。,三、设计状态图和状态表的原则与技巧,6.状态图必须具有循环性。,7.状态表的安排和查找。,状态表的每个记录包含,ST、FNKYT、NEXST、SUB,四个数据项。由于状态表是按,ST,递增次序排列的,所以,ST,可以不出现,而,FNKYT,在满足表示范围的情况下,位数越少越好。,三、设计状态图和状态表的原则与技巧,下面讨论对,NEXST、SUB,两项的处理:,(1),NEXST,项的处理,有两种方法可供处理,NEXST,项:,a),把下态子表首址放入记录,每次只 要查找子表,速度快,但占用内存空间多。,b),把状态序号放入记录,占用内存少, 但每次都要查总表,速度慢。,三、设计状态图和状态表的原则与技巧,较好的方法是把状态用序号装入状态表,另设一张索引表,既可缩小存贮空间,又可提高查找速度。如图,6-13,所示:,三、设计状态图和状态表的原则与技巧,(2),SUB,项的处理,有两种方法可供处理,SUB,项:,a),把子程序入口地址直接记入状态表。,b),把子程序号数记入状态表,另用一张转移表登记子程序的入口地址。,哪种方法好,应根据具体情况分析。,三、设计状态图和状态表的原则与技巧,(3)为节省内存,,FNKYT、NEXST、SUB,三项应组装起来。如图,6-14,所示状态表内的记录:,四、用状态变量法设计监控主程序实例,试按图,6-7,所示的键盘状态图要求设计仪器的监控主程序,状态表已列于表,6-5,,但为节省空间,对该表作进一步处理,把,FNKYT,和,NEXST,两项组装成一个字节,如“0”态子表的第一个记录这两项组装后结果如图,6-15,所示。,四、用状态变量法设计监控主程序实例,图,6-16,所示为对子程序两种处理方法的状态表。,四、用状态变量法设计监控主程序实例,我们选取,6-16 b),的状态表为加快查找速度,又设计了一张索引表,如图,6-17,所示。,四、用状态变量法设计监控主程序实例,下面的监控主程序首先根据现态,PREST,查找索引表,获得子表首地址,然后由此开始,根据键码逐个记录查找状态表,可以实现按键的功能定义。,四、用状态变量法设计监控主程序实例,程序清单如下:,MOV A , B,;取按键信息,CLR C,SUBB A , #0BH,;判断按键是功能键还是数字键,JC DIG,;为数字键,转,DIG,SUBB A , #03H,;判断是否为主功能键,JNC NMFN,;非主功能键,转,NMFN,SETB FO,;置主功能标志位,FO,为,1,NMFN,:,ACALL FUN,;调用功能键处理子程序,AJMP START,四、用状态变量法设计监控主程序实例,DIG,:,MOV 30H,,,#01H,;,FNKY,值放在,30H,单元中,MOV 31H,,,B,;,NUMB,值放在,31H,单元中,START,:,MOV DPTR , #PREST,MOVX A , DPTR,;取得现态,CLR C,RLC A,;,(A)2,TAB0,:,MOV R3,,,A,MOV DPTR , #0080H,;查索引表,MOVC A , A+DPTR,;取得子表首址低字节,MOV R2 , A,;暂存于,R2,四、用状态变量法设计监控主程序实例,MOV A,,,R3,INC A,MOVC A , A+DPTR,;取高位地址,MOV DPH,,,A,MOV DPL , R2,;,DPTR,指到子表的首址,TAB1,:,CLR A,MOVC A , A+DPTR,;取出记录的第一字节,MOV B,,,A,PUSH DPL,PUSH DPH,四、用状态变量法设计监控主程序实例,RL A,SWAP A,ANL A , #0FH,;,(A)=FNKYT,JZ OK,;,FNKYT=0,查到子表的最后一个记录,MOV 04H , A,;,(04H)FNKYT,MOV DPTR,,,#MFNKY,MOVX A , DPTR,;,(A)= FNKY,,取得当前,;按键读数的,FNKY,CJNE A , 04H , NEXT,;,FNKYFNKYT,转,四、用状态变量法设计监控主程序实例,OK,:,MOV A , B,;查找成功,记录的第一个,;字节回送,A,ANL A , #07H,;取出下态,MOV DPTR,,,#PREST,MOVX DPTR , A,;下态送,PREST,单元,POP DPH,;调用,SUB,POP DPL,INC DPTR,CLR A,MOVC A,,,A+DPTR,MOV R2,,,A,CLR A,INC DPTR,MOVC A,,,A+DPTR,MOV DPH,,,A,MOV DPL,,,R2,CLR A,JMP A+DPTR,;转处理子程序,CHOST,:,MOV DPTR , #PREST,;现态是否为,0,MOVX A,,,DPTR,JNZ TAB2,;现态不为,0,,转,AJMP TAB0,;现态为,0,,再查一次状态表,TAB2,:,AJMP SCAN,;等待新命令或查询,MAINFN,NEXT,:,POP DPH,;转下一条子表记录,,;一条记录占用,3,个字节,POP DPL,INC DPTR,INC DPTR,INC DPTR,AJMP TAB1,FUN,:,MOV A,,,B,;功能键处理子程序,CLR C,SUBB A,,,#09H,MOV 30H,,,A,MOV 31H,,,#00H,RET,四、用状态变量法设计监控主程序实例,注意:,按上述方法处理,各处理子程序后面用指令,LJMP CHOST,回到本程序的,CHOST,处,判断现态是否为,0,。,总之,状态变量法设计键盘监控程序具有下列优点:,(1)应用一张状态表,统一处理任何一组按键状态的组合,使复杂的按键序列的编译过程变得简洁、直观、容易优化,设计的程序易懂、易读。,四、用状态变量法设计监控主程序实例,(2)翻译、解释按键序列与执行子程序完全分离,因此键盘监控程序的设计不受其它程序的影响,可单独进行,避免两者纠缠交叉。,四、用状态变量法设计监控主程序实例,(3)若仪器功能发生改变,监控程序的结构不变,仅需改变状态表。,(4)设计任务越复杂,按键复用次数越多,此方法的效率越高。对于复杂的仪器仅是状态表规模大些,监控程序的设计方法完全一样。,
展开阅读全文