![水电站计算机监控技术(第二版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/280/40936280/b_40936280.jpg)
第三节 单片机程序设计
本节从应用的角度出发,介绍各种常用程序的设计方法。在进行程序设计时,应先确定所采用的算法,然后根据单片机的指令系统,按照尽可能节省数据存放单元、缩短程序长度和加快运算时间3个原则来编制程序。
从程序的结构上来看,程序有3种结构形式,即顺序结构、分支结构和循环结构,下面以这3种结构形式来讲述单片机基本程序设计。
一、顺序程序设计
顺序程序设计是程序设计中最简单基本的一种程序结构,其特点是从程序的第一条指令开始,按顺序执行,直到最后一条指令。
【例3-1】设有一个非压缩BCD数(0~9)存放在内部RAM的40H单元中,求其平方值并放入内部RAM 41H单元中。
解:求一个数的平方数可以用乘法运算,也可以用查表实现,但查表法运算速度快些。将BCD数0~9的平方数按顺序建立一平方表,放入程序存储器的一片连续区域内。0~9的平方数的最大值为81,用BCD数来建造,每个平方数均为一字节。所以平方表的首地址与任意BCD数之和正好是该BCD数的平方数的存放地址。程序段如下:
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_56_1.jpg?sign=1739377852-KuDOJyk42pNy6OtAJmPxIaEH0DJ0ZbJA-0-18dd629772fe90e1dc0033fb619a532e)
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_57_1.jpg?sign=1739377852-rDKtfXllB3DcNESoYB6TZsgqRkGCz0xN-0-e74847c8ed54de9c919d3f28eb896a2a)
【例3-2】内部RAM 40H和41H单元中各有一无符号数,比较其大小,将大数存于内部RAM的GREATE地址单元,小数存于LESS地址单元,若两数相等,则分别送入这两个单元中。
解:用比较不等转移指令CJNE比较这两个无符号数,先确定它们是否相等,若不相等时再根据借位标志确定这两个数的大小。程序如下:
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_57_2.jpg?sign=1739377852-61f5jBUiUf1AEUCN1BvuTD9rUzP3TOmU-0-eeb64956febdfa1ad03ae242aa2a902c)
二、分支程序设计
程序执行时,需要根据不同的条件做出不同的处理,把不同的处理方法编制成各自的处理程序段,运行时由计算机根据不同的条件做出选择。这样的程序段称为分支程序。
可实现分支程序转移的指令有JZ、JNZ、CJNZ和DJNZ等,此外还有以位状态作为条件进行程序分支的指令有JC、JNC、JB、JNB和JBC等。
【例3-3】编制计算函数Y=f(X)的程序。设X、Y均为带符号数,其函数关系如下:
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_57_3.jpg?sign=1739377852-9lkzfjw9zic784G55WU6DjA7HR0Nx3Rw-0-04261695bba77c02ecd69fb0c10b5ea3)
解:因为X为带符号数,故不能用比较转移指令CJNE。程序中3个条件分两次判断,求出相应的函数值,程序流程图如图3-6所示,程序如下:
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_57_4.jpg?sign=1739377852-UWRC0UVomjKyoyoCBDVUIQkR0h3FcW5w-0-66e5cff1deaf87fd60fbedf347bce962)
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_57_5.jpg?sign=1739377852-sx2yE1ORfkaKb7j8di9KR3Mn74bn5DEv-0-22adae04a887de51d3a22387932e979f)
图 3-6 例3-3流程图
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_58_1.jpg?sign=1739377852-WLy7kADAQjhDat7WMzcsPRb6l25Chv4u-0-e777063a12733eb1f2bcb75d45264cdb)
三、循环程序设计
在实际问题中,有些操作的重复执行可以用循环程序。循环程序主要包括初始化/循环体和控制变量的修改与循环次数的控制。
【例3-4】把内部RAM中起始地址为30H的字节数据串传送到外部RAM 3000H为首地址的区域,直到发现‘$’(其代码为24H)字符的ASCII为止。数据串的最大长度为32个字节。
解:这是计数(32个)和条件控制(‘$’)双重控制的循环程序。当计数到32或检测到‘$’字符都将结束循环。程序流程图如图3-7所示。
程序如下:
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_58_2.jpg?sign=1739377852-OuUInLxeTFsl0n1XaEymhqpv3TuxniQ7-0-b8bb50cbbc6b7bee0d1f5fcab6b38125)
四、子程序调用程序设计
在较复杂的程序设计中,程序中往往有许多相同的运算或相同的操作。为了简化程序设计,提高编程效率,节省程序存储单元,可采用子程序的设计方法。子程序是指完成某一确定任务并能被其他程序反复调用的程序段。
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_58_3.jpg?sign=1739377852-HiyEVNY3cpKqzZyaWIvDFviZpA9r1W7e-0-440dcaa04e4b6e56ece97d224d8f4ed8)
图 3-7 例3-4流程图
【例3-5】用程序实现C=A2+B2。设A、B均小于10,A存在21H单元,B存在22H单元,结果C存在20H单元。
解:因本题中两次用到求平方运算,故把求平方运算作为子程序。编写主程序和子程序如下:
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_58_4.jpg?sign=1739377852-X3UhpQbOIHpGz5GRZB0txqH1DBM4tors-0-a2da006c2c9d7cb3d4dffdb6d5b99fc3)
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_59_1.jpg?sign=1739377852-cSx1P9dxby8ExIleGYU6WyxGd5OA7GtQ-0-f62e1ad05d97e905d068e3d89f0abeb4)