基于Proteus的单片机应用技术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 单片机应用系统汇编语言程序设计

在单片机应用系统设计中,应用程序设计是整个系统设计的重要工作。在早期单片机开发中,都是采用汇编语言。采用汇编语言编写应用程序,可直接面向系统硬件,从而可以编写出高质量的程序代码。因此,现在尽管用C语言编程已成为单片机程序设计主流,但用汇编语言进行程序设计仍是一些单片机爱好者乐于采用的方法。

1.3.1 顺序结构的程序设计方法

1.顺序结构

顺序结构程序是一种最简单、最基本的程序结构,其特点是按程序编写的顺序依次执行,程序流向不变。顺序结构是所有复杂程序的基础。

2.顺序程序设计

在进行顺序结构的程序设计时,先要根据题意,找到解决问题的方法,然后以指令为依据,将解决问题的方法用程序表达出来。

【例1-1】设有16位二进制数存放在R0、R1中(R0存放高位),试编写实现16位二进制数“取反加1”的操作程序。

程序流程图如图1.17所示,程序如下:

                  ORG   1000H
            START:MOV   A,R1
                  CPL   A
                  ADD   A,#01H
                  MOV   R1,A
                  MOV   A,R0
                  CPL   A
                  ADDC  A,  #00H
                  MOV   R0.A
                  END

图1.17 程序流程图

1.3.2 分支结构的程序设计方法

1.分支结构

分支结构是指程序中含有转移指令,程序的进程要根据程序要求无条件或有条件改变程序执行顺序,选择程序流向。分支结构有单分支、双分支、多分支3种形式,如图1.18所示。

2.分支结构程序设计方法

由于计算机具有逻辑判断能力,这是计算机实现分支程序的理论基础,依据条件转移指令和比较指令实现计算机分支。

(1)无条件转移程序设计

以无条件转移语句实现程序的无条件转移。

图1.18 单片机分支结构程序流程图

(2)条件转移程序设计方法

用条件判断语句对程序执行的条件进行分析,从而决定程序的流向。

【例1-2】警情从单片机的P1.0输入,当系统检测到有警情发生时,立即调用拨号子程序,试编制实现上述过程的程序。

分析:程序流程如图1.19所示,程序如下:

                     ORG  1000H
                     NAME:SETB  P1.0
                     MOV  C,P1.0
                     JNC  NAME
                     ……
                     END

图1.19 单片机分支结构程序流程图

值得注意的是,分支程序设计一定要先分析分支条件,然后采用合适的语句,从而达到分支的目的。

1.3.3 散转程序设计

散转实际上是多分支结构的一种特殊情况。我们知道,当分支较多时,如果采用连续判断的方法对条件逐个比较,会使程序显得太烦琐,且执行速度较慢。散转程序的设计思想是:在满足某种规律的情况下,用一条指令转移到指定的分支。与前面介绍的直接转移方式相比,散转程序属于间接转移方式。指令JMP@A+DPTR是实现散转的基础,用它来实现散转的方法有两种:一种是按照某种规律直接将转移地址编排成一个表,当执行散转指令时,程序转移到相应的地址;另一种是对偏移量作某种运算得到一个转移地址表。

在散转程序设计中,除了用JMP@A+DPTR指令实现散转外,还可以用RET指令实现。RET指令的作用是将堆栈顶部的一个16位数据赋值给PC,因此,用RET指令实现散转的要点是首先获得转移地址,然后用PUSH指令将地址压入堆栈(先压入低字节),然后用RET指令实现散转。

1.3.4 循环程序设计方法

1.循环结构

在程序设计中,经常会遇到需对大量数据进行重复处理的情况。此时,程序中的某些程序段需要多次重复执行。这种多次出现的程序结构叫循环结构。在汇编语言中,循环结构包括循环初始化和循环体两部分。循环初始化部分是为进入循环所做的准备工作,用来设置循环初始化状态,如地址指针、拟定的循环次数。循环体是重复执行的程序。循环结构如图1.20所示。

图1.20 循环结构程序流程

2.循环结构程序设计

循环程序设计的核心是循环控制。常用的循环控制方法有以下3种。

(1)计数控制法

对于循环次数已知的程序,或者在进入循环前可由某变量确定循环次数的程序,常采用计数控制循环。循环计数的方法有两种:一种方法是先将循环计数器清0,以后每执行一遍循环体,循环计数器加1,同时与规定的循环次数进行比较,次数未到,继续执行循环体;次数到,则结束循环。这种方法在高级语言中常用。另一种方法是将计数器的初值设置为循环次数,以后每执行一遍循环体,循环计数器减1,同时检测计数器是否为0,非0继续循环,为0则终止循环。汇编语言中常采用这种方法,它适用于DJNZ之类的指令编程。

(2)条件控制法

有些循环程序预先不能确定循环次数,而是在循环的过程中,当满足某个特定的条件时退出循环。这类通过测试特定条件来实现循环控制的方法称为条件控制法。条件控制的实现是通过条件判断语句达到目的的。

(3)逻辑尺控制法

有些循环程序,在循环的过程中分别要求完成不同的操作。例如,如这次循环完成两数的相加,下次循环完成两数的相减,这时可以采用“逻辑尺”控制法。它也是汇编语言独有的一种控制方法。