第四章 程序设计.ppt
文本预览下载声明
4.1 概 述 4.2 简单程序设计 例4.1题意分析示意图 例4.2题意分析示意图 4.3 分支程序设计 两数比较流程图 例4.5硬件原理图 指令转移表的存储格式 图4.12(a)表示当条件满足时执行分支程序1,否则执 行分支程序2,例4.3就是这样的一种结构。 图4.12(b)表示当条件满足时跳过程序段2,从程序段 3往下执行,否则顺序执行程序段2和3。 另外,分支结构程序允许嵌套,即一个分支接一个分 支,形成树形多级分支结构程序,例4.4就是这样的结构。 2. 散转程序 在实际应用中,常常需要从两个以上的出口中选一个,称为多分支程序或散转程序。MCS-51单片机指令系统中专门提供了散转指令,使得散转程序的编制更加简洁。 例4.5中采用转移地址表法实现散转程序,转移表是由双字节短转移指令“AJMP”组成的,各转移指令地址依次相差两个字节,所以累加器A中变址值必须作乘2修正。若转移表是由三字节长转移指令“LJMP”组成,则累加器A中变址值必须乘3。当修正值有进位时,则应将进位先加在数据指针高位字节DPH上。 此外,转移表中使用“AJMP”指令,这就限制了转移的入口地址ONE、TWO、THREE、FOUR必须和散转表首地址TABLE位于同一个2 KB范围内。为了克服上述局限性,除了可以使用“LJMP”指令组成跳转表外,还可采用双字节的寄存器存放散转值,并利用对DPTR进行加法运算的方法,直接修改DPTR,然后再用散转指令实现散转。 散转程序除了转移指令表法之外,还可以采用地址偏移量表法、转向地址表法及利用“RET”指令(子程序返回指令)实现散转程序等。 4.4 循环程序设计 例4.6初步设想的程序流程图 执行上面程序后,结果是8个灯全部被点亮,跟预想的结果不符,为什么呢?这是因为程序执行得很快,逐一点亮LED的间隔太短,在我们看来就是同时点亮了,因此,必须在点亮一个LED后加一段延时程序,使该显示状态稍事停顿,人眼才能区别开来。 (2) 汇编语言源程序。 由于程序设计中经常会出现如图所示的次数控制循 环程序结构,为了编程方便,单片机指令系统中专门提供了 循环指令DJNZ,以适用于上述结构的编程。 DJNZ R2,NEXT ;R2中存放控制次数, ;R2-1→R2,R2≠0,转移到NEXT继续循环, ;否则执行下面指令 2.双重循环程序设计——延时程序设计 在上例中使用了延时程序段之后,我们才能看到正确 的显示结果。延时程序在单片机汇编语言程序设计中使用 非常广泛,例如,键盘接口程序设计中的软件消除抖动、 动态LED显示程序设计、LCD接口程序设计、串行通信接 口程序设计等。所谓延时,就是让CPU做一些与主程序功 能无关的操作(例如将一个数字逐次减1直到为0)来消耗 掉CPU的时间。由于我们知道CPU执行每条指令的准确时 间,因此执行整个延时程序的时间也可以精确计算出来。 也就是说,我们可以写出延时长度任意而且精度相当高的 延时程序。 例4.7 设计一个延时1 s的程序,设单片机时钟晶振频 率为fosc=6 MHz。 (1) 题意分析。 设计延时程序的关键是计算延时时间。延时程序一般采用循环程序结构编程,通过确定循环程序中的循环次数和循环程序段两个因素来确定延时时间。对于循环程序段来讲,必须知道每一条指令的执行时间,这里涉及到几个非常重要的概念——时钟周期、机器周期和指令周期。 时钟周期T时钟是计算机基本时间单位,同单片机使用的晶振频率有关。题目给定fosc=6 MHz,那么T时钟=1/fosc=1/6 M=166.7 ns。 机器周期T机器是指CPU完成一个基本操作所需要的时 间,如取指操作、读数据操作等,机器周期的计算方法: T机器=12T时钟=166.7 ns×12=2 μs。 指令周期是指执行一条指令所需要的时间。由于指令 汇编后有单字节指令、双字节指令和三字节指令,因此指 令周期没有确定值,一般为1~4个T机器。在附录2的指令表 中给出了每条指令所需的机器周期数,可以计算每一条指 令的指令周期。 现在,我们可以来计算一下实训4程序3中延时程序段 的延时时间。延时程序段如下: DELAY1: MOV R3,#0FFH DEL2: MOV R4,#0FFH DEL1: NOP
显示全部