您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 单片机原理及应用04第四章程序设计
4.1概述4.2简单程序设计4.3分支程序设计4.4循环程序设计4.5查表程序4.6子程序设计与堆栈技术4.7实用汇编子程序举例04第四章程序设计4.1概述单片机程序设计语言主要有三类:机器语言、汇编语言和高级语言。机器语言(MachineLanguage)是指直接用机器码编写程序、能够为计算机直接执行的机器级语言。机器码是一串由二进制代码“0”和“1”组成的二进制数据,其执行速度快,但是可读性极差。机器语言一般只在简单的开发装置中使用,程序的设计、输入、修改和调试都很麻烦,在实训1和实训3中直接固化或输入的程序都是机器语言程序。汇编语言(AssemblyLanguage)是指用指令助记符代替机器码的编程语言。汇编语言程序结构简单,执行速度快,程序易优化,编译后占用存储空间小,是单片机应用系统开发中最常用的程序设计语言。汇编语言的缺点是可读性比较差,只有熟悉单片机的指令系统,并具有一定的程序设计经验,才能研制出功能复杂的应用程序,实训4中的3个程序都是用汇编语言设计的。高级语言(High-LevelLanguage)是在汇编语言的基础上用自然语言的语句来编写程序,例如PL/M-51、FranklinC51、MBASIC51等,程序可读性强,通用性好,适用于不熟悉单片机指令系统的的用户。高级语言编写程序的缺点是实时性不高,结构不紧凑,编译后占用存储空间比较大,这一点在存储器有限的单片机应用系统中没有优势。目前,大多数用户仍然使用汇编语言进行单片机应用系统的软件设计,本章将介绍MCS-51单片机汇编语言的程序设计方法。单片机汇编语言程序设计的基本步骤如下:(1)题意分析。熟悉并了解汇编语言指令的基本格式和主要特点,明确被控对象对软件的要求,设计出算法等。(2)画出程序流程图。编写较复杂的程序,画出程序流程图是十分必要的。程序流程图也称为程序框图,是根据控制流程设计的,它可以使程序清晰,结构合理,便于调试。(3)分配内存工作区及有关端口地址。分配内存工作区,要根据程序区、数据区、暂存区、堆栈区等预计所占空间大小,对片内外存储区进行合理分配并确定每个区域的首地址,便于编程使用。(4)编制汇编源程序。(5)仿真、调试程序。(6)固化程序。4.2简单程序设计简单程序也就是顺序程序,实训4中的程序1就是顺序程序结构,它是最简单、最基本的程序结构,其特点是按指令的排列顺序一条条地执行,直到全部指令执行完毕为止。不管多么复杂的程序,总是由若干顺序程序段所组成的。本节通过实例介绍简单程序的设计方法。例4.14字节(双字)加法。将内部RAM30H开始的4个单元中存放的4字节十六进制数和内部RAM40H单元开始的4个单元中存放的4字节十六进制数相加,结果存放到40H开始的单元中。例4.1题意分析示意图(1)题意分析。题目的要求如图所示。30H31H33H32H43H42H41H40H4FH23HABHA0H7BH56H80HE8H加数1存放处加数2存放处43H42H41H40HCAH79H2BH89H相加结果存放处+A0AB234FE880567B892B79CA1ORG0000HMOVA,30HADDA,40HMOV40H,A;最低字节加法并送结果MOVA,31HADDCA,41HMOV41H,A;第二字节加法并送结果(2)汇编语言源程序。按照双字节加法的思路,实现4字节加法的源程序如下:MOVA,32HADDCA,42HMOV42H,A;第三字节加法并送结果MOVA,33HADDCA,43HMOV43H,A;第四字节加法并送结果,进位位在CY中END显然,上面程序中,每一步加法的步骤很相似,因此我们可以采用循环的方法来编程,使得源程序更加简洁,结构更加紧凑。用循环方法编制的源程序见习题4.3题。例4.2数据拼拆程序。将内部RAM30H单元中存放的BCD码十进制数拆开并变成相应的ASCII码,分别存放到31H和32H单元中。(1)题意分析。题目要求如图所示。例4.2题意分析示意图3545十进制数45的BCD码3432H4的ASCII码5的ASCII码31H30H本题中,首先必须将两个数拆开,然后再拼装成两个ASCII码。数字与ASCII码之间的关系是:高4位为0011H,低4位即为该数字的8421码。(2)汇编语言源程序。源程序如下:ORG0000HMOVR0,#30HMOVA,#30HXCHDA,@R0;A的低4位与30H单元的低4位交换MOV32H,A;A中的数值为低位的ASCII码MOVA,@R0SWAPA;将高位数据换到低位ORLA,#30H;与30H拼装成ASCII码MOV31H,AEND4.3分支程序设计4.3.1分支程序实例1.两分支程序设计例4.3两个无符号数比较(两分支)。内部RAM的20H单元和30H单元各存放了一个8位无符号数,请比较这两个数的大小,比较结果显示在实训的实验板上:若(20H)≥(30H),则P1.0管脚连接的LED发光;若(20H)(30H),则P1.1管脚连接的LED发光。(1)题意分析。本例是典型的分支程序,根据两个无符号数的比较结果(判断条件),程序可以选择两个流向之中的某一个,分别点亮相应的LED。比较两个无符号数常用的方法是将两个数相减,然后判断有否借位CY。若CY=0,无借位,则X≥Y;若CY=1,有借位,则XY。程序的流程图如图所示。两数比较流程图X-Y开始结束X>=Y,P1.0灯亮CY=1X<Y,P1.1灯亮YN(2)汇编语言源程序。源程序如下:XDATA20H;数据地址赋值伪指令DATAYDATA30HORG0000HMOVA,X;(X)→ACLRC;CY=0SUBBA,Y;带借位减法,A-(Y)-CY→AJCL1;CY=1,转移到L1CLRP1.0;CY=0,(20H)≥(30H),点亮P1.0连接的LEDSJMPFINISH;直接跳转到结束等待L1:CLRP1.1;(20H)(30H),点亮P1.1连接的LEDFINISH:SJMP$END(3)执行结果。执行该程序之前,利用单片机开发系统先往内部RAM的20H和30H单元存放两个无符号数(可以任意设定),执行后观察点亮的LED是否和存放的数据大小相一致。2.三分支程序设计例4.4两个有符号数比较(三分支程序)。内部RAM的20H单元和30H单元各存放了一个8位有符号数,请比较这两个数的大小,比较结果显示在实训实验板上:若(20H)=(30H),则P1.0管脚连接的LED发光;若(20H)(30H),则P1.1管脚连接的LED发光;若(20H)(30H),则P1.2管脚连接的LED发光。(1)题意分析。有符号数在计算机中的表示方式与无符号数是不相同的:正数以原码形式表示,负数以补码形式表示,8位二进制数的补码所能表示的数值范围为+127~-128。计算机本身无法区分一串二进制码组成的数字是有符号数或无符号数,也无法区分它是程序指令还是一个数据。编程员必须对程序中出现的每一个数据的含义非常清楚,并按此选择相应的操作。例如,数据FEH看作无符号数其值为254,看作有符号数为-2。比较两个有符号数X和Y大小要比无符号数麻烦得多。这里提供一种比较思路:先判别两个有符号数X和Y的符号,如果X、Y两数符号相反,则非负数大;如果X、Y两数符号相同,将两数相减,然后根据借位标志CY进行判断。这一比较过程如图所示。比较两个有符号数X、Y的流程图开始X、Y符号相同X-YNCY=1X=Y点P1.1连接的灯X>Y点P1.1连接的灯X<Y点P1.2连接的灯结束X<Y点P1.2连接的灯X>Y点P1.1连接的灯X>=0X=YYYNNYNY(2)汇编语言源程序。源程序如下:XDATA20HYDATA30HORG0000HMOVA,XXRLA,Y;(X)与(Y)进行异或操作JBACC.7,NEXT1;累加器A的第7位为1,两数符号不同,转移到NEXT1MOVA,XCJNEA,Y,NEQUAL;(X)≠(Y),转移到NEQUALCLRP1.0;(X)=(Y),点亮P1.0连接的LEDSJMPFINISHNEQUAL:JCXXY;(X)(Y),转移到XXYSJMPXDY;否则,(X)(Y),转移到XDYNEXT1:MOVA,XJNBACC.7,XDY;判断(X)的最高位D7,以确定其正负XXY:CLRP1.2;(X)(Y),点亮P1.2连接的LEDSJMPFINISHXDY:CLRP1.1;(X)(Y),点亮P1.1连接的LEDFINISH:SJMP$END(3)程序说明。①判断两个有符号数符号异同的方法。本例中使用逻辑异或指令,将(X)与(Y)进行异或操作,那么,(X)的符号位(X)7与(Y)的符号位(Y)7异或的结果如下:若(X)7与(Y)7相同,则(X)7(Y)7=0;若(X)7与(Y)7不相同,则(X)7(Y)7=1。本例中,(X)与(Y)的异或结果存放在累加器A中,因此判断ACC.7是否为零即可知道两个数的符号相同与否。②比较两个有符号数的其它方法。除了本例中使用的比较两个有符号数的方法之外,我们还可以利用溢出标志OV的状态来判断两个有符号数的大小。具体算法如下:若X-Y为正数,则OV=0时XY;OV=1时XY。若X-Y为负数,则OV=0时XY;OV=1时XY。采用这种比较方式的汇编语言源程序自己编写。3.散转程序散转程序是指经过某个条件判断之后,程序有多个流向(三个以上)。在后面的键盘接口程序设计中经常会用到散转功能——根据不同的键码跳转到相应的程序段。例4.5在实训4程序2的基础之上,先设计两个开关,使CPU可以察知两个开关组合出的4种不同状态。然后对应每种状态,使8个LED显示出不同的亮灭模式。(1)硬件设计。在实训1的电路中,我们使用单片机的并行口P1的输出功能来控制8个LED的显示。现在我们使用其P3口的输入功能来设计两个输入开关,硬件原理图如图所示。例4.5硬件原理图8031+5V4.7kP3.5S0S11214.7kP3.4如图4.9所示,当开关S0接通2时,P3.4管脚接地,P3.4=0;当S0接通1时,P3.4接+5V,P3.4=1。同样,当开关S1接通2时,P3.5管脚接地,P3.5=0;当S1接通1时,P3.5接+5V,P3.5=1。假设要求P3口的开关状态对应的P1口的8个LED的显示方式如下:P3.5P3.4显示方式00全亮01交叉亮10低4位连接的灯亮,高4位灭11低4位连接的灯灭,高4位亮(2)软件设计。①程序设计思想。散转程序的特点是利用散转指令实现向各分支程序的转移,程序流程图如图4.10所示。散转程序流程图开始读P3口的引脚状态→A修正A的值,A×2→A转移指令表基地址→DPTR结束散转指令显示方式2屏蔽掉A中无关位,并将相应位移到最低位显示方式1显示方式3显示方式4结束结束结束②汇编语言源程序。ORG0000HMOVP3,#00110000B;使P3口锁存器相应位置位MOVA,P3;读P3口相应引脚线信号ANLA,#00110000B;“逻辑与”操作,屏蔽掉无关位SWAPA;将相应位移位到低位RLA;循环左移一位,A*2→AMOVDPTR,#TABLE;转移指令表的基地址送数据指针DPTRJMP@A+DPTR;散转指令ONE:MOVP1,#00H;第一种显示方式,S0接地,S1接地SJMP$TWO:MOVP1,#55H;第二种显示方式,S0接+5V,S1接地SJMP$THREE:MOVP1,#0FH;第三种显示方式,S0接地,S1接+5VSJMP$FOUR:MOVP1,#0F0H;第四种显示方式,S0接+5V,S1接地SJMP$TABLE:AJMPONE;转移指令表AJMPTWOAJMPTHREEAJMPFOUREND(3)程序说明。①读P3口的管脚状态。MCS-51的4个I/O端口共有三种操作方式:输出数据方式,读端口数据方式和读端口引脚方式。输出数据方式举例:MOVP1,#00H;输出数据00H→P1端口锁存器→P1引脚读端口数据方式举例:MOVA,P3;A←P3端口锁存器读
本文标题:单片机原理及应用04第四章程序设计
链接地址:https://www.777doc.com/doc-581091 .html