三、循环程序设计
循环程序是一段可以反复执行的程序。
在程序设计中,经常遇到要反复执行某一段程序,这时可用循环程序结构,有助于缩短程序,提高程序的质量。
一个循环结构由以下三部分组成:
(1)循环体:就是要求重复执行的某一段程序段。
(2)循环结束条件:在循环程序中必须给出循环结束条件,常见的循环结束条件是计数循环,循环了一定次数后就结束循环。
(3)循环初值。
【例4-14】50ms延时程序。
解:延时程序与MCS-51指令执行时间有很大的关系。在使用12MHz晶振时,一个机器周期为1μs,执行一条DJNZ指令的时间为2μs,这时,可用双重循环方法写出如下程序:
以上延时程序不太精确,它没有考虑到除DJNZ R6、DEL2指令外的其他指令的执行时间,如把其他指令的执行时间计算在内,它的延时时间为:(250+1+2)×200+1=50.301ms。如果要求比较精确的延时,可修改程序如下:
它的实际延迟时间为50.001ms。但要注意,用软件实现延时程序,不允许有中断,否则将严重影响定时的准确性。
【例4-15】将40 H开始的5个单元内容全部清0。程序框图如图4-14所示。
图4-14 [例4-15]流程图
【例4-16】数据块移动。将内部数据存储器30H~7FH单元的内容传送到外部数据存储器以1000 H开始的连续单元中去。程序框图如图4-15所示。
图4-15 [例4-16]流程图
解:程序清单如下:
串行通信时,通常需要检验收到的字符串是否正确,可以用下面的数据块比较程序完成。
【例4-17】比较数据区与程序区的数据共32个字节。
解:程序清单如下:
【例4-18】设在外部RAM放有一个ASCII字符串,它的首地址在DPTR中,字符串以空字符(0)结尾。要求用80C51的串行口把它发送出去。在串行口已经初始化的条件下,该功能可用图4-16所示流程来实现。
图4-16 [例4-18]程序流程图
程序清单如下:
【例4-19】设MCS-51片内RAM从50H开始的单元中,分别存放单字节数X1,X2,…,X n。数的个数n放在R2中,现要求出这n个数的和(双字节)放在R3R4中。
程序清单如下:
这个程序的循环结束条件采用了计数方法,即用一个寄存器作为循环次数计数器,每循环一次后加1或减1,达到终止数值后停止。计数方法只有在循环次数已知的情况下才适用。对循环次数未知的问题,不能用循环次数来控制。例如,在近似运算中,是用误差小于给定值这一条件来控制循环的结束。
【例4-20】多字节无符号数相加。
解:设被加数与加数分别在以ADR1与ADR2为初址的片内RAM区域中,自低字节起,由低到高依次存放;它们的字节数为L,要求将和放回被加数的单元。流程框图如图4-17所示。
参考程序清单如下:
图4-17 [例4-20]流程图