特点:程序中含有可以重复执行的程序段(循环体),采用循环程序可以有效地缩短程序,减少程序占用的内存空间,使程序的结构紧凑、可读性好。
组成:循环程序一般由下面4部分组成。
1)循环初始化。位于循环程序开头,用于完成循环前的准备工作,如设置各工作单元的初始值及循环次数。
2)循环体。循环程序的主体,位于循环体内,是循环程序的工作程序,在执行中会被多次重复使用。要求编写得尽可能简练,以提高程序的执行速度。
3)循环控制。位于循环体内,一般由循环次数修改、循环修改和条件语句等组成,用于控制循环次数和修改每次循环时的参数。
图3-9 循环程序的结构
a)先处理后控制 b)先控制后处理
4)循环结束。用于存放执行循环程序所得的结果,以及恢复各工作单元的初值。
循环程序的结构:
1)先循环处理,后循环控制(即先处理后控制),如图3-9a所示。
2)先循环控制,后循环处理(即先控制后处理),如图3-9b所示。
循环程序按结构形式,可分为单重循环与多重循环。
1.单重循环程序
定义:循环体内部不包括其他循环的程序称为单重循环程序。
【例3-5】 已知片内ram30h~3fh单元中存放了16个二进制无符号数,编制程序求它们的累加和,并将其和数存放在r4,r5中。
解:每次求和的过程相同,可以用循环程序实现。16个二进制无符号数求和,循环程序的循环次数应为16次(存放在r2中),它们的和放在r4,r5中(r4存高8位,r5存低8位)。程序流程如图3-10所示。
16字节加法程序如下:
【例3-6】 编制程序将片内ram的30h~4fh单元中的内容传送至片外ram的2000h开始的单元中。
解:每次传送数据的的过程相同,可以用循环程序实现。30h~4fh共32个单元,循环次数应为16次(保存在r2中),为了方便每次传送数据时地址的修改,送片内ram数据区首地址送r0,片外ram数据区首地址送dptr。程序流程如图311所示。
图3-10 例程序流程
图3-11 例3-6程序流程
片内外20h字节数据传送程序如下:
(www.xing528.com)
2.多重循环程序
定义:若循环中还包括循环,称为多重循环(或循环嵌套)。
【例3-7】 设计50ms延时程序。
解:延时程序与mcs51指令执行时间(机器周期数)和晶体振荡频率fosc有直接的关系。当fosc=12mhz时,机器周期为1μs,执行一条djnz指令需要2个机器周期,时间为2μs。50ms/2μs>255,因此单重循环程序无法实现,可采用双重循环的方法编写50ms延时程序。
程序如下:
3.设计循环程序时应注意的问题
1)循环程序是一个有始有终的整体,它的执行是有条件的,所以要避免从循环体外直接转到循环体内部。
2)多重循环程序是从外层向内层一层一层进入,循环结束时是由内层到外层一层一层退出的。在多重循环中,只允许外重循环嵌套内重循环,不允许循环相互交叉,也不允许从循环程序的外部跳入循环程序的内部。
3)编写循环程序时,首先要确定程序结构,处理好逻辑关系。一般情况下,一个循环体的设计可以从第一次执行情况入手,先画出重复执行的程序框图,然后再加上循环控制和置循环初值部分,使其成为一个完整的循环程序。
4)循环体是循环程序中重复执行的部分,应仔细推敲、合理安排,应从改进算法、选择合适的指令入手对其进行优化,以达到缩短程序执行时间的目的。
4.排序程序设计(冒泡法)
【例3-8】 设mcs-51系列单片机内部ram起始地址为30h的数据块中共存有64个无符号数,编制程序使它们按从小到大的顺序排列。
解:设64个无符号数在数据块中的顺序为:e64,e63,…,e2,e1,使他们从小到大顺序排列的方法很多,现以冒泡法为例进行介绍。
冒泡法又称两两比较法。它先使e64和e63比较,若e64>e63,则两个存储单元中的内容交换,否则就不交换。然后使e63和e62比较,按同样的原则决定是否交换。一直比较下去,最后完成e2和e1的比较及交换,经过n-1=63次比较(常用内循环63次来实现)后,e1的位置上必然得到数组中的最大值,犹如一个气泡从水低冒出来一样,如图3-12所示(图中只画出了6个数的比较过程)。
图3-12 冒泡排序
第二次冒泡过程和第一次完全相同,比较次数也可以是63次(其实只需要62次,因为e1的位置上是数据块中的最大数,不需要再比较),冒泡后在e2的位置上得到数组中的次大数,如图3-12所示。如此冒泡(即大循环)共63次(内循环63×63次)便可完成64个数的排序。
实际编程时,可通过设置“交换标志”来控制是否再需要冒泡,若刚刚进行完的冒泡中发生过数据交换(即排序尚未完成),应继续进行冒泡;若进行完的冒泡中未发生过数据交换(即排序已经完成),冒泡应该停止。例如:对于一个已经排好序的数组:1,2,3,…,63,64,排序程序只要进行一次循环便可根据“交换标志”的状态而结束排序程序的再执行,这自然可以减少63-1=62次的冒泡时间。
冒泡法程序流程如图313所示。
程序如下:
图3-13 冒泡法程序流程
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。