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