您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 机械/模具设计 > 单片机技术及应用_第四章_MCS-51程序设计
单片机技术及应用单片机技术及应用第4章MCS-51程序设计单片机技术及应用教学提示•本章重、难点在于单片机MCS-51汇编语言程序的3种基本结构形式、常用汇编语言程序设计。教学目标•掌握汇编语言程序基本结构。•掌握程序设计的步骤和方法。•学会具体程序的应用。单片机技术及应用4.1三种基本程序结构•程序设计是为了解决某一个问题,将指令有序地组合在一起。程序有简有繁,有些复杂程序往往是由简单的基本程序所构成。本章将通过一些基本程序,介绍部分常用程序设计方法。•程序设计的过程大致可以分为以下几个步骤:(1)编制说明要解决问题的程序框图。(2)确定数据结构、算法、工作单元、变量设定。(3)根据所用计算机的指令系统,按照已编制的程序框图,用汇编语言编制出源程序。(4)将编制出的程序在计算机上调试,直至实现预定的功能。单片机技术及应用4.1.1顺序程序•顺序程序是指按顺序依次执行的程序,也称为简单程序或直线程序。计算机是按指令在存储器中存放的先后次序来顺序执行程序的。除非用特殊指令让它跳转,不然它会在PC控制下执行。顺序程序结构虽然比较简单,但也能完成一定的功能任务,是构成复杂程序的基础。单片机技术及应用【例4-1】已知16位二进制负数存放在R1、R0中,试求其补码,并将结果存放在R3、R2中。•解:二进制负数的求补方法可归结为“求反加1”,符号位不变。利用CPL指令实现求反;加1时,则应低8位先加1,高8位再加上低位的进位。注意这里不能用INC指令,因为INC指令不影响标志位。•程序如下:•CONT:MOVA,R0;读低8位•CPLA;取反•ADDA,#1;加1•MOVR2,A;存低8位•MOVA,R1;读高8位•CPLA;取反•ADDCA,#80H;加进位及符号位•MOVR3,A;存高8位•RET;返回单片机技术及应用•【例4-2】将两个半字节数合并成一个1字节数。•解:设内部RAM的40H、41H单元中分别存放着8位二进制数。•要求取出两个单元中的低半字节,合并成一个字节后,存放在42H单元中。•程序如下:•ORG0000H•START:MOVR1,#40H•MOVA,@R1•ANLA,#0FH;取第一个半字节•SWAPA•INCR1•XCHA,@R1;取第二字节•ANLA,#0FH;取第二个半字节•ORLA,@R1;拼字•INCR1•MOV@R1,A;存放结果•SJMP$•END单片机技术及应用•【例4-3】拆字程序。•ORG0000H•START:MOVR1,#40H•MOVA,@R1•MOVB,A;暂存B中•ANLA,#0FH;取第一个半字节•INCR1•MOV@R1,A;存放第一个半字节•MOVA,B•SWAPA•ANLA,#0FH;取第二个半字节•INCR1•MOV@R1,A;存放第二个半字节•SJMP$•END单片机技术及应用4.1.2分支程序•分支程序比顺序程序的结构复杂得多,其主要特点是程序的流向有两个或两个以上的出口,根据指定的条件进行选择确定。编程的关键是如何确定供判断或选择的条件以及选择合理的分支指令。•通常根据分支程序中出口的个数,分为单分支结构程序(两个出口)和多分支结构程序(3个或3个以上出口)。•在处理实际事务中,只用简单程序设计的方法是不够的,因为大部分程序总包含有判断、比较等情况。根据判断、比较的结果转向不同的分支。单片机技术及应用【例4-4】求单字节有符号二进制数的补码。•解:正数的补码是其本身,负数的补码是其反码加1。因此,程序首先判断被转换数的符号,负数进行转换,正数即为补码。设二进制数放在累加器A中,其补码放回到A中。程序如下:•ORG0000H•CMPT:JNBACC.7,NCH;(A)0,不需转换•CPLA•ADDA,#1•SETBACC.7;保存符号•NCH:SJMP$•END单片机技术及应用【例4-5】两个无符号数比较大小。•解:设两个连续外部RAM单元ST1和ST2中存放不带符号的二进制数,找出其中的大数存入ST3单元中。•程序如下:•ORG8000H•ST1EQU8040H•START1:CLRC;进位位清零•MOVDPTR,#ST1;设数据指针•MOVXA,@DPTR;取第一个数•MOVR2,A;暂存R2•INCDPTR•MOVXA,@DTPR;取第二个数•SUBBA,R2;两数比较•JNCBIG1•XCHA,R2;第一个数大•BIG0:INCDPTR•MOVX@DPTR,A;存大数•SJMP$•BIG1:MOVXA,@DPTR;第二个数大•SJMPBIG0•END单片机技术及应用4.1.3循环程序•在程序设计中,只有简单程序和分支程序是不够的。因为简单程序的每条指令只执行一次,而分支程序则根据条件的不同,会跳过一些指令,执行另一些指令。它们的特点是,每一条指令至多执行一次。在处理实际事务时,有时会遇到多次重复处理的问题,用循环程序的方法来解决就比较合适。循环程序中的某些指令可以反复执行多次。采用循环程序,可使程序缩短,从而节省存储单元。重复次数越多,循环程序的优越性就越明显。但是程序的执行时间并不节省。由于要有循环准备、结束判断等指令,其速度要比简单程序稍慢些。单片机技术及应用•循环程序一般由4个部分组成:(1)置循环初值,即确立循环开始时的状态。(2)循环体(工作部分),要求重复执行的部分。(3)循环修改,循环程序必须在一定条件下结束,否则就要变成死循环。(4)循环控制部分,根据循环结束条件,判断是否结束循环。•循环程序的结构一般有两种形式:(1)先进入处理部分,再控制循环。即至少执行一次循环体。(2)先控制循环,后进入处理部分。即先根据判断结果,控制循环的执行与否,有时可以不进入循环体就退出循环程序单片机技术及应用1.单循环程序【例4-6】多个单字节数据求和。•已知有10个单字节数据,依次存放在以内部RAM的50H单元开始的连续单元中。要求把计算结果存入R2、R3中(高位存R2,低位存R3)。单片机技术及应用•解:程序如下:•ORG8000H•SAD:MOVR0,#50H;设数据指针•MOVR5,#0AH;计数值0AH→R5•SAD1:MOVR2,#0;和的高8位清零•MOVR3,#0;和的低8位清零•LOOP:MOVA,R3;取加数•ADDA,@R0•MOVR3,A;存和的低8位•JNCLOP1•INCR2;有进位,和的高8位+1•LOP1:INCR0;指向下一个数据地址•DJNZR5,LOOP•SJMP$•END单片机技术及应用【例4-7】内部RAM单元清零。要求:将60H为起点的9个单元清“0”。•解:程序如下:•ORG0000H•CLEAR:CLRA;A清0•MOVR0,#60H;确定清0单元起始地址•MOVR6,#09;确定要清除的单元个数•LOOP:MOV@R0,A;清单元•INCR0;指向下一个单元•DJNZR6,LOOP;控制循环•SJMP$•END单片机技术及应用【例4-8】外部RAM单元清零。•要求:设有40个外部RAM单元要清“0”,即为循环次数存放在R2寄存器中,其首地址存放在DPTR中,设为3000H。•解:方法一:•程序如下:•ORG0000H•MOVDPTR,#3000H•CLEAR:CLRA•MOVR2,#28H;置计数值•LOOP:MOVX@DPTR,A•INCDPTR;修改地址指针•DJNZR2,LOOP;控制循环•END单片机技术及应用方法二:•此程序也可写成通用子程序的形式:•CLEAR:CLRA•LOOP:MOVX@DPTR,A•INCDPTR;修改地址指针•DJNZR2,LOOP;控制循环•RET•使用时只要给定入口参数及被清零单元个数,再调用此子程序即可:•ORG0000H•MOVDPTR,#3000H•MOVR2,#40•ACALLCLEAR•SJMP$•CLEAR:CLRA•LOOP:MOVX@DPTR,A•INCDPTR;修改地址指针•DJNZR2,LOOP;控制循环•RET•END单片机技术及应用2.多重循环程序•如果在一个循环体中又包含了其他的循环程序,即循环中还套着循环,这种程序称为多重循环程序。【例4-9】10秒延时程序。•延时程序与MCS-51执行指令的时间有关,如果使用6MHz晶振,一个机器周期为2μs,计算出执行一条指令以至一个循环所需要的时间,给出相应的循环次数,便能达到延时的目的。•程序如下:•DEL:MOVR5,#100•DEL0:MOVR6,#100•DEL1:MOVR7,#249•DEL2:DJNZR7,DEL2;248*2+4•DJNZR6,DEL1;(248*2+4)*200+4•DJNZR5,DEL0;(248*2+4)*200+4)*100+4•RET单片机技术及应用•使用多重循环程序时,必须注意以下几点:(1)循环嵌套,必须层次分明,不允许产生内外层循环交叉。(2)外循环可以一层层向内循环进入,结束时由里往外一层层退出。(3)内循环体可以直接转入外循环体,实现一个循环由多个条件控制的循环结构方式。单片机技术及应用4.2子程序和参数传递方法•在实际程序中,常常会多次进行一些相同的计算和操作,如数制转换、函数式计算等。如果每次都从头开始编制一段程序,不仅麻烦,而且浪费存储空间。因此对一些常用的程序段,以子程序的形式,事先存放在存储器的某一区域。当主程序运行过程中需要用子程序时,只要执行调用子程序的指令,使程序转至子程序即可。子程序处理完毕,返回主程序,继续进行以后的操作。•调用子程序有以下优点:•(1)避免对相同程序段的重复编制。•(2)简化程序的逻辑结构,同时也便于子程序调试。•(3)节省存储器空间。单片机技术及应用4.2.1工作寄存器或累加器传递参数•此方法是把入口参数或出口参数放在工作寄存器或累加器中的方法。使用这种方法可使程序最简单,运算速度也最高。它的缺点是:工作寄存器数量有限,不能传递太多的数据;主程序必须先把数据送到工作寄存器;参数个数固定,不能由主程序任意设定。单片机技术及应用【例4-10】请编出能把20H单元内两个BCD数变换成相应ASCII码放在21H(高位BCD数的ASCII码)和22H(低位BCD数的ASCII码)单元的程序。•解:根据ASCII字符表,0~9的BCD数和它们的ASCII码之间仅相差30H。因此,仅需把20H单元中两个BCD数拆开,分别和30H相加即可,可以编出程序如下:•ORG0000H•ASC1:MOVR0,#22H•MOV@R0,#00H•MOVA,20H•XCHDA,@R0•ORL22H,#30H•SWAPA•ORLA,#30H•MOV21H,A•SJMP$•END单片机技术及应用4.2.2用指针寄存器来传递参数•由于数据一般存放在存储器中,而不是工作寄存器中,故可用指针来指示数据的位置,这样可以大大节省传递数据的工作量,并可实现可变长度运算。一般如参数在内部RAM中,可用R0或R1作指针。进行可变长度运算时,可用一个寄存器来指出数据长度,也可在数据中指出其长度(如使用结束标记符)。单片机技术及应用4.2.3用堆栈来传递参数•堆栈可以用于传递参数。调用时,主程序可用PUSH指令把参数压入堆栈中。之后子程序可按栈指针访问堆栈中的参数,同时可把结果参数送回堆栈中。返回主程序后,可用POP指令得到这些结果参数。这种方法的优点是:简单;能传递大量参数;不必为特定的参数分配存储单元。使用这种方法时,由于参数在堆栈中,故大大简化了中断响应时的现场保护。•实际使用时,不同的调用程序可使用不同的技术来决定或处理这些参数。下面以几个简单的例子说明用堆栈来传递参数的方法。单片机技术及应用【例4-11】一位十六进制数转换为ASCII码子程序。•解:程序如下:•HASC:MOVR0,SP•DECR0•DECR0;R0为参数指针•XCHA,@R0;保护ACC,取出参数•ANLA,#0FH•ADDA,#2;加偏移量•MOVCA,@A+PC•XCHA,@R0;将查表结果放回堆栈中•RET•DB'0123456789';十六进制数的ASCII字符表•DB'
本文标题:单片机技术及应用_第四章_MCS-51程序设计
链接地址:https://www.777doc.com/doc-3599810 .html