理论教育 循环程序设计|单片机原理及接口技术

循环程序设计|单片机原理及接口技术

时间:2023-11-05 理论教育 版权反馈
【摘要】:循环程序一般由以下4部分组成:1)置循环初值。即循环的工作部分,完成主要的计算或操作任务,是重复执行的程序段。图4-4循环程序框图先执行后判断;先判断后执行图4-4结构是“先执行后判断”,适用于循环次数已知的情况。设用R4作加数指针,R5作循环次数计数器,R6作和数高位字节寄存器,n存于内部RAM 23H中,和的高低位字节分别存入23H和24 H中。编写无符号数排序程序。图4-9冒泡法排序程序流程图程序清单如下:

循环程序设计|单片机原理及接口技术

在很多实际程序中会遇到需多次重复执行某段程序的情况,这时可把这段程序设计为循环程序,这有助于缩短程序,同时也节省了程序的存储空间,提高程序的质量。

循环程序一般由以下4部分组成:

1)置循环初值。即设置循环过程中有关工作单元的初始值,如置循环次数、地址指针及工作单元清零等。

2)循环体。即循环的工作部分,完成主要的计算或操作任务,是重复执行的程序段。这部分程序应特别注意,因为它要重复执行许多次,若能少写一条指令,实际上就是少执行某条指令若干次,因此,应注意优化程序。

3)循环修改。每循环一次,就要修改循环次数、数据及地址指针等。

4)循环控制。根据循环结束条件,判断是否结束循环。

如果在循环程序的循环体中不再包含循环程序,即为单重循环程序。如果在循环体中还包含有循环程序,这种现象就称为循环嵌套,这样的程序就称为二重循环程序或三重以至多重循环程序。在多重循环程序中,只允许外重循环嵌套内重循环程序,而不允许循环体互相交叉,也不允许从循环程序的外部跳入循环程序的内部。

循环程序结构框图有两种,如图4-4所示。

图4-4 循环程序框图

(a)先执行后判断;(b)先判断后执行

图4-4(a)结构是“先执行后判断”,适用于循环次数已知的情况。其特点是一进入循环,先执行循环处理部分,然后根据循环次数判断是否结束循环。

图4-4(b)结构是“先判断后执行”,适用于循环次数未知的情况。其特点是将循环控制部分放在循环的入口处,先根据循环控制条件判断是否结束循环,若不结束,则执行循环操作;若结束,则退出循环。

下面通过一些实际的例子,说明如何编制循环程序。

【例4-7】 求1,2,3,…,n的和(设n<256)

解 这是一个重复相加的问题。设用R4作加数指针,R5作循环次数计数器,R6作和数高位字节寄存器,n存于内部RAM 23H中,和的高低位字节分别存入23H和24 H中。程序流程图如图4-5所示。

图4-5 例题4-7流程图

程序清单如下:

【例4-8】 编写多字节无符号数加法程序。设有两个多字节无符号数分别存放在内部RAM的DATl和DAT2开始的区域中(低字节先存),字节个数存放在R2中,求它们的和,并将结果存放在DATl开始的区域中。

解 多字节首地址已知,宜采用间接寻址方式,多字节的求和,应采用循环程序,流程图如图4-6所示。

程序如下:

图4-6 多字节无符号数加法程序流程图

图4-7 最大值查找程序流程图

【例4-9】 编写查找最大值程序。假设从内部RAM 30H单元开始存放着10个无符号数,找出其中的最大值送入内部RAM的MAX单元。(www.daowen.com)

解 寻找最大值的方法很多,最基本的方法是比较和交换依次进行的方法,即先取第一个数和第二个数比较,并把前一个数作为基准,若比较结果基准数大,则不做交换,再取下一个数来做比较;若比较结果基准数较小,则用较大的数来代替原有的基准数,即做一次交换。然后再以基准数和下一个数做比较。总之,要保持基准数是到目前为止最大的数,比较结束时,基准数就是所求的最大值,流程图如图4-7所示。

【例4-10】 编写数据检索程序。假设从内部RAM60 H单元开始存放着32个数据,查找是否有“$”符号(其ASCII码为24 H)。如果找到就将数据序号送入2FH单元,否则将FFH送入2FH单元。

解 数据检索就是在指定数据区中查找关键字。比如在考勤系统中,有时需要查找某个职工上下班情况,或磁卡就餐系统中将某个磁卡挂失或销户等就属于这类问题。

实现数据检索的算法有很多,如顺序检索、对分检索等。对分检索需要先对数据排序;顺序检索是把关键字与数据区中的数据从前向后逐个比较,判断是否相等。

本例题采用顺序检索进行编程,流程图如图4-8所示。

图4-8 数据检索程序流程图

程序如下:

【例4-11】 编写50ms软件延时程序。

解 软件延时程序一般都是由DJNZ Rn,rel指令构成。执行一条DJNZ指令需要两个机器周期。由此可知,软件延时程序的延时时间主要与机器周期和延时程序中的循环次数有关,在使用12MHz晶振时,一个机器周期为1μs,执行一条DJNZ指令需要两个机器周期,即2μs。延时50ms需用双重循环。

程序清单如下:

该延时程序的第一条指令是置外循环的初值,下面的指令为循环体,指令“DJNZ R7,DEL1”为外循环的控制部分;第二条指令是置内循环初值,“DJNZ R6,DEL2”既是内循环体,也是内循环的控制部分。

以上延时时间是粗略的计算,不精确,它没有考虑到除DJNZ R6,DEL2指令外其他指令的执行时间,如把其他指令的执行时间计算在内,它的延时时间为:

(400+1+2)×125+1=50.375(ms)

如果应用系统中对延时时间的要求不是十分严格,可按粗略计算的方法进行计算和编程,如果系统要求比较精确的延时,可按如下修改:

上述程序延时时间为50.001ms。

应注意,用软件实现延时的系统,不允许有中断,否则将严重影响定时的准确性。对于更长时间的延时,可采用更多重的循环。

【例4-12】 编写无符号数排序程序。假设在片内RAM中,起始地址为40 H的10个单元中存放有10个无符号数。试进行升序排序。

解 数据排序常用方法是冒泡排序法。这种方法的过程类似水中气泡上浮,故称冒泡法。执行时从前向后进行相邻数的比较,如数据的大小次序与要求的顺序不符就将这两个数互换,否则不互换。对于升序排序,通过这种相邻数的互换,使小数向前移动,大数向后移动;从前向后进行一次冒泡(相邻数的互换),就会把最大的数换到最后;再进行一次冒泡,就会把次大的数排在倒数第二的位置。依此类推,完成由小到大的排序。

编程中选用R7做比较次数计数器,初始值为09H,位地址00H作为冒泡过程中是否有数据互换的标志位,若(00 H)=0,表明无互换发生,已排序完毕。(00H)=1,表明有互换发生。流程图如图4-9所示。

图4-9 冒泡法排序程序流程图

程序清单如下:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈