![水电站计算机监控技术(第二版)](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=1739355206-y6X23lgsjbXci8z5q7lTnMkJ3442RTEa-0-5e2623eb68c57c862b38a5fdaae995d9)
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_57_1.jpg?sign=1739355206-M1W4p6dVzE8FeQvNYfQiHT4KZudwd1Og-0-4694c40691bfa9f96be4ab79f40ae98c)
【例3-2】内部RAM 40H和41H单元中各有一无符号数,比较其大小,将大数存于内部RAM的GREATE地址单元,小数存于LESS地址单元,若两数相等,则分别送入这两个单元中。
解:用比较不等转移指令CJNE比较这两个无符号数,先确定它们是否相等,若不相等时再根据借位标志确定这两个数的大小。程序如下:
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_57_2.jpg?sign=1739355206-SwcJqrBWLsnCfqvFmRc2Mj6PZ9AYRgTy-0-4ef8ccc499c416ccfed5b62d948d3626)
二、分支程序设计
程序执行时,需要根据不同的条件做出不同的处理,把不同的处理方法编制成各自的处理程序段,运行时由计算机根据不同的条件做出选择。这样的程序段称为分支程序。
可实现分支程序转移的指令有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=1739355206-N89b3obHfpxlHuElKmWF55oTK1V3tzqd-0-00b4b8ad52195eb64d1c6224e15b9126)
解:因为X为带符号数,故不能用比较转移指令CJNE。程序中3个条件分两次判断,求出相应的函数值,程序流程图如图3-6所示,程序如下:
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_57_4.jpg?sign=1739355206-vki66XP6TTpteVhgJbx6j0BfJudSZ3Sl-0-6ae30ab6b7d906d2ea02d1f675540527)
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_57_5.jpg?sign=1739355206-1rYOnvCzz0Uai7NyGG0Mrr15NAnFiVw2-0-807f76a713d7d9eba87ecbd920de0137)
图 3-6 例3-3流程图
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_58_1.jpg?sign=1739355206-yGd5P3XVO7ezTDSe40IGLYGoR2oyXW95-0-00d02afb1dd1d6af539f2cfb3d85324d)
三、循环程序设计
在实际问题中,有些操作的重复执行可以用循环程序。循环程序主要包括初始化/循环体和控制变量的修改与循环次数的控制。
【例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=1739355206-BOC8sW5uco9tQx64FLO4MvnBH0BQRyk2-0-36422628bc96cd06812c8875ec720a26)
四、子程序调用程序设计
在较复杂的程序设计中,程序中往往有许多相同的运算或相同的操作。为了简化程序设计,提高编程效率,节省程序存储单元,可采用子程序的设计方法。子程序是指完成某一确定任务并能被其他程序反复调用的程序段。
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_58_3.jpg?sign=1739355206-wzE83mJQJGsf2k6He1UazvQ3VkP0jjTu-0-6f86660b24eaa6971d56457085b98f3e)
图 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=1739355206-wVjGNvafyNGcYRCk4MCHjq6mKAHZB2qm-0-93409a952998bcbe5108fee9721804bf)
![](https://epubservercos.yuewen.com/74B2BA/21277064801840006/epubprivate/OEBPS/Images/17030_59_1.jpg?sign=1739355206-ymVmerIXICjYWIUTFs4oGNivxqhPhTrC-0-8bfb9eea74eeffc36f95025be29f878d)