第四章 MCS-51应用程序设计.ppt_第1页
第四章 MCS-51应用程序设计.ppt_第2页
第四章 MCS-51应用程序设计.ppt_第3页
第四章 MCS-51应用程序设计.ppt_第4页
第四章 MCS-51应用程序设计.ppt_第5页
已阅读5页,还剩98页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章MCS-51应用程序设计,第一节伪指令在利用汇编语言进行编写程序时,除了使用其指令系统规定的指令外,还要用到一些伪指令。伪指令与指令的概念不同,指令指示计算机完成某种操作,在汇编过程中要生成可执行的目标代码。而伪指令则不同,它并不生成可执行的目标代码,只是对汇编过程进行某种控制或提供某些汇编信息。,1、定位伪指令ORG格式:标号:ORG地址表达式功能:规定程序块或数据块存放的起始位置。ORG8000HSTART:MOVA,020H规定第一条指令从地址8000H单元开始存放,标号START的值为8000H。一般来说,在一个汇编语言源程序的开始,都安置一条ORG伪指令来指出该程序在存储器中存放的起始位置。若省略ORG,则表示该程序段从地址为0000H单元开始存放。在一个源程序中可以多次使用ORG伪指令,以规定不同程序段或数据段存放的起始位置。,2定义字节数据伪指令DB格式:标号DB字节数据表其中字节数据表可以是一个或多个字节数据、字符串、或表达式。它表示将字节数据表中的数据按从左到右的顺序依次存放在指定的存储单元中,一个数据占用一个存储单元。例如ORG2000HTAB:DB02BH,030H,08H如果DB伪指令定义的数据为字符串,则在指定的存储单元中以ASCII码的形式存储。例ORG1000HDATA:DBA,5,$,3、定义字数据伪指令DW该伪指令功能与DB伪指令类似,也是给数据表中的数据分配存储单元。所不同的是DB伪指令定义的数据为字节,而DW伪指令定义的数据为字,即两个字节。对于一个字数据占用两个连续的存储单元,先将高8位数据存入低地址单元,后将低8位数据存入高地址单元。例如:ORG1500HDATA:DW0324AH,03CH,4、定义空间伪指令DS格式;标号:DS表达式这条伪指令用来定义从指定的地址开始,需要保留多少个存储单元作为备用的空间,并均填充零值。例如:ORG3000HBUF:DS50从地址3000H开始保留50个存储单元作为备用。,5、符号定义伪指令EQU或=格式:符号名EQU表达式或符号名=表达式这条伪指令表示将表达式的值或特定的某个汇编符号定义一个指定的符号名。一旦由EQU或伪指令定义过的符号名可以在本程序段的任意位置上引用。6汇编结束伪指令END格式:标号:ENDEND伪指令是汇编语言源程序的结束标志。在一个源程序结束未尾都要写上END,当汇编程序汇编到END时,自动结束对本程序的处理。,7、位地址符号定义伪指令BIT格式:符号名BIT位地址表达式其中位地址可以是绝对地址或位符号名称,该伪指令的功能是将位地址赋给所定义的符号名。例如:STBITP2.0将P2.0的位地址赋给符号名ST,在其后的编程中可以用ST代替P2.0使用。8、字节地址符号定义伪指令XDATA和DATA格式:符号名XDATA字节地址表达式符号名DATA字节地址表达式XDATA伪指令是用来给外部存储单元地址定义符号名,DATA伪指令是用来给内部存储单元地址定义符号名。,第二节MCS-51汇编语言格式MCS-51汇编语言格式与其它汇编语言格式类似,通常由标号、操作码、操作数和注释四项内容组成,其表示格式为:标号:操作码操作数;注释1、标号MCS-51汇编语言中使用的标号由1-8个字符组成,且第一个字符必须是字母。标号中允许使用的字符是:26个英文字母(A-Z),10个阿拉伯数字(0-9)和下划线()。除第一个字符必须是字母外,其它字符可以是字母、数字或下划线。如:TD、X_Y、P24都为合法的标号。,标号是可供选择的项。也就是说不要求每条指令前都加上标号,而是根据需要来设置。若在某指令前面赋予某个标号,则在汇编过程中将给出该标号的实际地址,并且可以由其它指令引用此标号,以便实现控制程序的转移或寻址。使用标号应遵循下列规则:(1)标号后面必须加上冒号;(2)标号不能使用在汇编语言中已经定义过的符号名,如指令助记符、寄存器名等;(3)标号只在本程序中有效,并且在同一个程序中不能使用相同的标号。,2、操作码操作码是语句中不可缺少的部分,用于规定该语句执行的操作功能。它由指令助记符或伪指令助记符表示。3、操作数操作数给出参与操作的数据或地址。它可以是3个、2个、1个或没有,若有2个或以上的操作数时,它们之间用逗号分隔,操作码与操作数之间用空格符分隔。4、注释注释项用于对指令功能或程序段功能做简要标记和说明。该项内容计算机不予处理仅是为了便于阅读程序,因此可有可无,若有时,用分号与操作数分隔。,MCS-51汇编语言使用的数据格式:1、二进制数:由数字0、1组成,数据末尾带字母B。如:10110101B。2、十进制数:由数字0-9组成,数据末尾带字母D或省略。如:78D。3、十六进制数:由数字0-9和字母A、B、C、D、E、F组成,数据末尾带字母H。如:2CH、30H。如果十六进制数是以字母A-F开头,为了区别于其它符号名,需在其前面加上数字“0”。如:0FFFFH、0B2H。4、ASCII码:当操作数为任意的ASCII码字符串时,必须把字符串用单引号括起来,以便防止与其它符号名相混淆。如;AB、1234。,MCS-51应用程序框架ORG0000HLJMPSTARTORG0003HLJMPEX0_PROCORG000BHLJMPCT0_PROCORG0013HLJMPEX1_PROCORG001BHLJMPCT1_PROCORG0023HLJMPUART_PROC,ORGXXXXHSTART:ORGXXXXHEX0_PROC:RETIORGXXXXHCTO_PROC:RETI,ORGXXXXHEX1_PROC:RETIORGXXXXHCT1_PROC:RETIORGXXXXHUART_PROC:RETIEND,第三节简单程序设计简单程序是指一种无分支、无循环、无跳转的程序结构,其执行流程是按照指令在存储器中存放的先后顺序进行的。例:将两个8位无符号数求和。设:两个8位无符号数分别存放在内部RAM、20H、21H单元中,所求结果存放在22H单元。,ORG8000HMOVR0,#20H;置数据指针MOVA,R0;取第一个数INCR0;修改指针ADDA,R0;取第二个数,求和INCR0;修改指针MOVR0,A;存和END;结束,例将16位二进制数求补。设:16位二进制数存放在R1、R0中(低8位在R0),求补后的结果存放在R3、R2中。,ORG8000HMOVA,R0;取低8位CPLA;低8位求反ADDA,#1;加1MOVR2,A;结果低8位送R2MOVA,R1;取高8位CPLA;高8位求反ADDCA,#0;加进位MOVR3,A;结果高8位送R3END,第四节查表程序设计在单片机应用系统中、查表程序是一种常用的程序、使用它可以完成数据补偿、修正、计算、转换等各种功能,具有程序简单、执行速度快等优点。查表就是根据变量X,在表格中寻找Y,使Y=f(X)对于MCS-51单片机,表格一般存放于程序存储器内,单片机用PSEN脉冲读出,MCS-51的指令系统中,给用户提供了两条极有用途的查表指令。,(1)MOVCA,A+DPTR这条指令完成把A中的内容作为一个无符号数与DPTR中的内容相加,所得结果为某一程序存储单元的地址,然后把该地址单元中的内容送到累加器A中。DPTR作为个基址寄存器,执行完这条指令后,DPTR的内容不变,即仍为执行加法以前的内容。(2)MOVCA,A+PC这条指令以PC作为基址寄存器,PC的内容和A的内容作为无符号数,相加后所得的数作为某一程序存储器单元的地址,根据地址取出程序存储器相应单元中的内容送到累加器A,这条指令执行完以后PC的内容不发生变化,仍指向查表指令的下一条指令。,例:根据累加器A中的数(0-9)查平方表,求出相应的结果。SQR:INCAMOVCA,A+PCRETDB00,01,04,09,16DB25,36,49,64,81,SQR:PUSHDPHPUSHDPLMOVDPTR,#SQR_TABMOVCA,A+DPTRPOPDPLPOPDPHRETSQR_TAB:DB00,01,04,09,16DB25,36,49,64,81,例:在一个温度控制器中,测出的电压与温度为非线性关系,需对它进行线性化补偿。测得的电压已由AD转换为10位二进制数。采用如下算法。即测出不同温度下的输入值,然后用测得的数据构成一个表,表中放温度值y,x为电压值。设测量输人值x放入R2R3中、可用如下程序把它转换成线性温度值,仍放人R2R3中:,MOVDPTR,#TABMOVA,R3;乘2CLRCRLCAMOVR3,AXCHA,R2RLCAXCHA,R2ADDA,DPL;加DPTRMOVDPL,AMOVA,DPHADDCA,R2MOVDPH,ACLRA;查表,MOVCA,A+DPTRMOVR2,ACLRAINCDPTRMOVCA,A+DPTRMOVR3,ARETTAB:DW,例:设有一个MCS-51的控制系统,需按照从键盘输入的命令执行不同的操作。输人命令为ASCII字符串形式,放在由(R0)指示的内部RAM中。命令共有RESET、BEGIN、STOP、SEND、CHANNEL、CHANGE等六种,分别称为0、1、2、3、4、5号命令。现要求按(R0)指示的字串,找出对应的命令号,放到R2中。MOVR2,#0FFHMOVDPTR,#TABLT4A:MOVA,R0MOVR1,A;恢复输入字符串指针LT4B:INCR2;命令号计数MOVA,R1,MOVB,ACLRAMOVCA,A+DPTRCLRF0JBCA.7,LT4C;命令结尾字节标记SETBF0;没查完一个命令LT4C:JZLEND;表格结束标记CJNEA,B,LT4DJNBF0,LYESINCR1INCDPTRSJMPLT4B;继续比较,LT4D:INCDPTR;不相等处理LT4E:JNBF0,LT4A;F0=0,查完一个命令CLRA;F00,没查完一个命令MOVCA,A+DPTRINCDPTR;跳过剩余命令字符CLRF0JBCA.7,LT4A;到最后转LT4A继续查SETBF0SJMPLT4ELYES:;找到处理,(R2)为命令号LEND:;找不到处理,TAB:DBRESET,0D4HDBBEGIN,0CEHDBSTOP,0D0HDBSEND,0C4HDBCHANNEL,0CCHDBCHAGE,0C5HDB0,第五节分支程序设计一、分支程序的基本结构一般情况下,程序按顺序方式执行,但根据实际需要也可以改变程序的执行顺序,这就需要设计分支程序。分支程序是根据判断给出的条件满足与否执行不同的走向,其基本结构有单分支、双分支和多分支。在MCS-51汇编语言分支程序设计中,通常是通过条件转移指令来实现分支选择。分支程序是基本程序设计技术之一,普遍应用于各种程序中。,单分支结构双分支结构,多分支结构,例:比较两个无符号数的大小设:两个8位无符号数分别存放在外部RAMDATA1和DATA2单元中,将找出的较大数存放在DATA3单元中(DATA1,DATA2,DATA3为三个连续的存储单元)。ORG8000HCLRC;C=0MOVDPTR,#DATA1;置数据指针MOVXA,DPTR;取第一个数MOVR3,A;第一个数暂存于R3INCDPTR;修改指针MOVXA,DPTR;取第二个数,SUBBA,R3;两数比较JNCBIG2;第二个数大XCHA,R3;第一个数大SJMPBIG1BIG2:MOVXA,DPTRBIG1:INCDPTR;修改指针MOVXDPTR,A;存较大数END,散转程序有各种实现方法。一般常用逐次比较法,就是把所有不同的情况一个一个的进行比较,发现符合就转向对应的处理程序。这种方法的主要缺点是程序太长,有n种可能的情况,就需有n个判断和转移。对于MCS-51来说,由于它具有间接转移指令:JMPA+DPTR故可以很容易的实现散转功能;指令JMPA+DPTR只是按程序运行时决定的地址执行间接转移的指令。该指令把累加器的8位无符号数内容与16位数据指针寄存器的内容相加,得到的和装入程序计数器,用作取后继指令的地址。在执行本指令时,即不改变累加器也不改变数据指针的内容。,使用转移指令表的散转程序在不少应用场合,需根据某一单元的内容是0,1,n,分别转向处理程序0,处理程序1,处理程序n,对于这种情况,可用直接转移指令(AJMP或LJMP指令)组成一个转移表,然后把标志单元的内容读人累加器A,转移表首地址放入DPTR中,再利用指令:JMPA+DPTR实现散转。例:根据寄存R2的内容,转向各个处理程序(R2)0转PROC0(R2)1转PROC1:(R2)n转PROCn,MOVDPTR,#J_TABMOVA,R2ADDA,R2JNCNADDINCDPHNADD:JMPA+DPTRJ_TAB:AJMPPROC0AJMPPROC1:AJMPPROCn,这个散转程序有些局限,即它只能使用AJMP指令,所以所有的处理程序人口PROC0、PROC1、PROCn和散转表J_TAB都必须与AJMP指令在同一个2K范围内,对于在一个2K内放不下所有处理程序的情况,可以把一些比较长的处理程序放于其它地方,而在2K内用LJMP指令转向这些处理程序。例如,PROC1与PROC5放于其它区域内,它们的人口分别为XPROC1与XPROC5,可用如下指令来转向入口。PROC1:LJMPXPROC1PROC5:LJMPXPROC5另外,也可直接用LJMP指令组成转移表。,对散转点超过256个时,寄存器R2一个单元放不下这个散转数,必须用两个字节来存放它,并利用对DPTR进行加法运算的方法,直接修改DPTR,然后再用指令JMPA+DPTR来执行散转。例:根据(R3,R2)转向不同处理程序MOVDPTR,#J_TABMOVA,R3MOVB,#3MULABADDA,DPHXCHA,DPH,MOVA,R2MOVB,#3MULABXCHA,BADDA,DPHXCHA,DPHMOVA,BJMPA+DPTRJ_TAB:LJMPPROC0LJMPPROC1:LJMPPROCN,使用地址偏移量表的散转程序上面介绍的转移表,每项至少为两个字节(AJMP表),有的为三个字节(LJMP表)。如果转向的程序均在向一页(256字节)时,可以使用地址偏移量来实现散转。例:按R2的内容转向6个处理程序。MOVA,R2MOVDPTR,#J_TABMOVCA,A+DPTRJMPA+DPTR,J_TAB:DB#PROC0-#J_TABDB#PROC1-#J_TABDB#PROC2-#J_TABDB#PROC3-#J_TABDB#PROC4-#J_TABDB#PROC5-#J_TABPROC0:PROC1:PROC2:PROC3:PROC4:PROC5:,使用转向地址表的散转程序由于前面介绍的地址偏移量表转向限制在一页范围内,故使用受到一定的限制。在转向范围较大时,可以直接使用转向地址表,它的各个项目表为各个转向程序的人口。散转时使用查表指令,按某个单元的内容查表找到对应的转向地址,把它装入DPTR中,然后对累加器A清零,再用JMPA+DPTR指令直接转向各个处理程序。例:根据寄存器R2的内容,转向各个处理程序。设转向入口为PROC0PROCn,MOVDPTR,#J_TABMOVA,R2ADDA,R2JNCNADDINCDPHNADD:MOVR3,AMOVCA,A+DPTRXCHA,R3INCAMOVCA,A+DPTR,MOVDPL,AMOVDPH,R3CLRAJMPA+DPTRJ_TAB:DW#PROCODW#PROC1:DW#PROCN,利用RET指令实现的散转程序前面介绍的几种方法,均是采用JMPA+DPTR指令来实现散转功能。实际上,在使用转向地址表时,还可用RET指令来实现散转。即在上例中,找到转向地址后,不是把它装人DPH和DPL,而是把它压入堆栈(先为低位字节,后为高位字节,即模仿调用指令)。然后通过执行RET指令来把该地址退栈到PC中,这样也把栈指针调整为以前的值。,第六节循环程序设计一、循环程序的基本结构在程序设计中,控制一部分指令重复执行若干次,以便用简短的程序完成大量的处理任务,这种按某种控制规律重复执行的程序,称为循环程序。循环程序有先执行后判断和先判断后执行两种基本结构。1先执行后判断结构其特点是一进入循环,先执行循环处理部分,然后根据循环控制条件判断是否结束循环,若不结束,则继续执行循环操作;若结束,则退出循环。,先执行后判断结构,2先判断后执行结构这种结构的特点是把对循环的控制条件放在循环入口处,一进入循环先判断循环控制条件是否结束循环,若结束,则退出循环,否则继续执行循环操作。,先判断后执行结构,无论哪一种循环结构,循环程序由以下四个基本部分组成:(1)置循环初值。设置循环开始的初始状态,为循环做准备。如设计数器,工作单元初值。(2)循环处理。循环程序中重复执行的内容。(3)循环修改。修改循环参数,为执行下一次循环做准备。(4)循环控制。判断是否结束循环。循环程序又可分为循环次数已知和未知的、单重和多重的结构。,二、循环次数已知的循环程序对于循环次数已知的情况,通常采用“计数法”来控制循环,选择“先执行,后判断”循环结构。例:计算n个数据的和。,如果xi均为单字节数,并按i的顺序存放在MCS-51内部RAM从50H开始的单元中,要求x1xn的和(双字节),放在R3R4中,n放在R2中,则可编制出程序。,ADD1:MOVR3,#0MOVR4,#0MOVR0,#50HLOOP:MOVA,R4ADDA,R0MOVR4,AINCR0CLRAADDCA,R3MOVR3,ADJNZR2,LOOP,三、循环次数未知的循环程序在有些问题中,循环次数事先无法确定,但循环执行次数与问题中的某些条件有关,而且这些条件可以测试到,在这种情况下选挥“先判断、后执行”的循环结构为宜。例:把内部RAM中起始地址为data的数据串传送到外部RAM中起始地址为buffer的存储区内,直到发现$字符,停止传送。,MOVR0,#dataMOVDPTR,#bufferLOOP0:MOVA,R0CJNEA,#24h,LOOP1SJMPLOOP2LOOP1:MOVXDPTR,AINCR0INCDPTRSJMPLOOP0LOOP2:RET,四、多重循环程序例:将给定数据块中的数据排序设:N个数据依次存放在内部RAMLIST地址开始的存储区域中,将N个数比较大小之后,使它们按从小到大(或从大到小)的次序排列,仍存放在原存储区域中。排序是在程序设计中经常使用的一种编程方法。排序的方法有多种,本例采用了较常用的“冒泡”排序法。冒泡排序的基本思路是:从前向后依次将相邻两个单元中的数据进行比较,即第一个数与第二个数比较,第二个数与第三个数比较,如两数比较的大小次序符合排序顺序,则不改变它们的存放顺序,否则交换两数位置,使其符合排序要求。,由于每次冒泡后只是从前向后排定一个大数(对于升序排列),所以在整个排序过程中,执行的内容包含两层:第一层为每一轮内的两两比较,第二层为每当一轮比较之后重新组织下一轮的比较,因此宜采用二重循环结构。NEQU10LISTEQU40HFLAGBIT00HMOVR7,#N-1;外循环记数NEXT:MOVA,R7;内循环记数MOVR6,AMOVR0,#LIST;数据指针CLRFLAG,COMP:MOVA,R0MOVR3,AINCR0CLRCSUBBA,R0JCLESSMOVA,R3XCHA,R0SETBFLAGLESS:DJNZR6,COMPDJNZR7,LOOPSJMPSTOPLOOP:JBFLAG,NEXTSTOP:RET,第七节子程序设计对于子程序的结构与一般程序(通常指主程序)的结构没有多大区别,它可以由简单结构、分支结构和循环结构组成。而它区别于主程序的主要特点是,在执行过程中需要由其它程序来调用,执行完毕又需要把执行流程返回到调用该子程序的程序中。,在子程序调用过程中常要解决以下两方面的问题:(1)保护现场与恢复现场;(2)主程序与子程序之间的参数传递。我们知道,因为子程序是作为主程序的一部分,所以在执行主程序和子程序时,必然要发生数据上的联系。在调用子程序时,主程序应通过某种方式把有关参数(也称入口参数)传送给子程序,当子程序执行完毕,又需要通过某种方式把有关参数(通常是子程序执行的结果,也称出口参数)传送给主程序,把这样一个过程称为参数传递。,在MCS-51中,通常采用以下三种参数传递方式:1累加器或寄存器传递参数在这种传递方式中,把要传递的参数存放在累加器A或工作寄存器R0-R7中。也就是说,在主程序调用子程序时,应事先把子程序中所需要的数据送入累加器A或指定的寄存器中,当子程序执行时,可以从指定的单元中取得数据,执行运算。反之,子程序也可以用同样的方法把结果传送给主程序。,2存储器传递参数当传送的数据量比较大时,常用存储器存放数据。在这种传递方式中,事先要建立一个参数表,用指针指示参数表所在的位置。当参数表建立在内部RAM时,用R0或R1作参数表的指针。当参数表建立在外部RAM时,用DPTR作参数表的指针。3堆栈传递参数利用堆栈传递参数是在子程序嵌套中常采用的一种方式。在调用子程序前,用PUSH指令将子程序中所需数据压入堆栈,在进入执行子程序时,再用POP指令从堆栈中弹出数据。,例:试编写程序,计算设:a1,a2,a3,an存放在外部RAM2000H开始的存储区域内,计算所得结果存放在R2R3中。在本例中,把求ai2的运算编写成子程序SQR,主程序通过调用子程序完成求和运算。MAIN:MOVDPTR,#2000HMOVR7,#NMOVR2,#0MOVR3,#0,LOOP:MOVXA,DPTRLCALLSQRADDA,R3MOVR3,ACLRAADDCA,R2MOVR2,AINCDPTRDJNZR7,LOOP:,SQR:PUSHDPHPUSHDPLMOVDPTR,#SQR_TABMOVCA,A+DPTRPOPDPLPOPDPHRETSQR_TAB:DB00,01,04,09,16DB25,36,49,64,81,例:将冒泡排序法改写成完整的子程序,通过堆栈进行参数传递。NEQU10LISTEQU40HBUF_ADDEQU50HFLAGBIT00HMAIN:MOVSP,60HMOVA,#NPUSHAMOVA,#LISTPUSHALCALLSORT:,SORT:PUSHPSWPUSHASETBRS0MOVA,SPCLRCSUBBA,#05MOVR1,AMOVA,R1DECAMOVR7,A;外循环记数INCR1MOVA,R1MOVBUF_ADD,A,NEXT:MOVA,R7;内循环记数MOVR6,AMOVR0,BUF_ADD;数据指针CLRFLAGCOMP:MOVA,R0MOVR3,AINCR0CLRCSUBBA,R0JCLESSMOVA,R3XCHA,R0SETBFLAG,LESS:DJNZR6,COMPDJNZR7,LOOPSJMPSTOPLOOP:JBFLAG,NEXTSTOP:POPAPOPPSWRET,第八节算术运算程序设计在绝大多数微机应用中都离不开数值计算,而加、减、乘、除四则运算是数值计算中最基本的运算。由于在实际应用中遇到的数据千变万化,它们的表示方式、取值范围、精度要求各不相同,因此处理的方法也不同。本节结合应用实例介绍几种基本的算术运算的编程方法和技巧。一、多字节数的加减运算由于MCS-51系列单片机是8位机,提供的指令都是字节运算指令。因此在处理多字节数加减运算时,需要特别注意进位(借位)问题。,例:多字节无符号数减法设:两个N字节无符号数分别存放在内部RAMBSS1和BSS2开始的单元中,两数差仍存放在BSS1数据区。MOVR0,#BSS1MOVR1,#BSS2MOVR7,#NCLRCLOOP:MOVA,R0SUBBA,R1MOVR0,AINCR0INCR1DJNZR7,LOOP,二、多字节数的乘除运算在MCS-51中提供了两条单字节乘、除法指令,若要进行多字节乘、除法运算,还需做相应的处理。例:双字节无符号数乘法设:双字节无符号被乘数存放在R2、R3中,双字节无符号乘数存放在R6、R7中,积存放在R4、R5、R6、R7四个寄存器中。,当被乘数和乘数有相同的字长时一般的乘法运算叙述如下:(1)清0累计积(2)从最低位开始检查各个乘数值(3)如乘数位为1,加被乘数至累计积,否则不加。(4)左移一位被乘数。(5)重复步骤(1)一(4)n次。(n为字长)多字节乘法运算可采用乘法和加法相结合的快速方法。,例:双字节无符号数除法对于多字节的除法运算通常是按照减法和移位操作来实现。首先用被除数的高位数与除数比较,若大于除数,则上商为1,并从被除数中减去除数,形成部分余数;若小于除数,则上商为o,不执行减除数操作,再把所得的余数左移一位,重复上述过程,直到被除数的每一位都参加过运算为止。,多字节除法程序框图,三、十进制数加减运算在MCS-51指令系统中没有提供专门用于十进制数加减运算指令。十进制数的加减运算是借用二进制数的加、减法指令ADD、ADDC、SUBB和十进制数调整指令DA来实现的。例:多字节BCD码的减法。设:R0、R1为两个n字节BCD码的数据指针,R7为循环次数计数器,所求结果仍存放在R0所指示的存储区城内。对于十进制数的减法运算,不能在SUBB指令后面直接使用DA指令进行调整,这是因为DA指令只能用在加法指令ADD或ADDC之后,对BCD码相加的结果进行调整,而对于BCD码的减法结果没有提供专门的调整指令,需要在运算过程中做适当的处理。,一般的程序处理方法是:将减法运算转换成加法运算。即先求减数的补,然后将被减数与减数的补相加,再由DA指令调整就得到两个BCD码相减的正确结果。例如设被减数为x,减数为y,其运算过程可表示如下:x-y=x+(-y)=x+y补=x+(100-y)SS:DB75H,38H,06HSD:DB41H,24H,17HN:EQUSD-SS,DSUB:MOVR0,#SSMOVR1,#SDMOVR7,#NSETBCNEXT:CLRAADDCA,99HSUBBA,R1ADDA,R0DAAMOVR0,AINCR0INCR1DJNZR7,NEXT,前面介绍了定点数的运算方法。定点数有一个致命的缺点:数的表示范围太小。例如双字节整数在无符号时,只能表示0-65535之间的整数,在有符号时,只能表示-32768-32767之间的整数,它们都不能表示小数。而小数则不能表示大于等于1的数。采用定点混合小数,虽然可表示小数和大于1的数,但它的表示范围仍太小。在实际使用时,数据的范围一般都比较大,例如测量电阻时,其阻值可能为1m-1000M,即为10-3-109,其最小值和最大值之比为1012,所以需要有一种能表示较大范围数据的表示方法-浮点数,它的小数点位置可按数值的大小自动的变化。,浮点数的表示一般浮点数均采用MCE的形式来表示,其中M称为尾数,它一般取为小数,0M1,E为阶码,它为指数部分,它的基为C。C可取各种数,对于十进制数,它取10,而对二进制数,C取2。阶码E的位数取决于数值的表示范围,一般取一个字节,而尾数则根据计算所需的精度,取2-4个字节。浮点数如同定点数一样,也有各种表示有符号数的方法,其中数的符号常和尾数放在一起考虑,即把M作为一个有符号的小数,它可采用原码、补码等各种表示方法,而阶码可采用各种不同的长度,并且数的符号也可放于各种不同的地方,所以浮点数具有各种不同的表示方法。,1、四字节浮点数的表示法微机中常用的一种浮点数采用如下格式:其中阶码8位,尾数24位。阶码和尾数均为2的补码形式。阶码的最大值为+127,最小值为-128,这样四字节浮点数能表示的最大值近似为1.701038,能表示的最小值(绝对值)近似为1.4710-39。浮点数的有效位数取决于尾数的数值位长度,上述浮点数有3字节尾数,去掉符号位共有23位二进制数字,接近于7位十进制数(2238388608)。,2三字节浮点数表示法上述的浮点数的精度较高(接近7位十进制数),但是由于字节较多,运算速度比较慢,往往不能满足实时控制和测量的需要,并且实际使用时所需的精度一般并不这么高。例如,一般高精度仪表为0.1,最高级也仅为0.01,这只相当于4位十进制数,而工业控制中所需的精度要求更低,但它们对运算速度的要求往往比较高,常要求在几ms内完成全部运算,在许多工业控制用微机系统中,因为一般的浮点数的运算速度太慢,不能满足实时控制的要求,而不得不采用定点运算来代替浮点运算。这样,有必要寻找一种精度稍低但运算速度较快的浮点数表示方法。,其中阶码7位,数符在阶码所在字节的最高位,尾数为16位。阶码采用二进制补码形式,尾数采用原码表示,以加快乘除法的速度。7位阶码可表示的最大值为263,最小值为2-64。上述3字节浮点数能表示的最大值近似为9.21018,能表示的最小值(绝对值)近似为2.7X10-20。浮点数的有效数字位数取决于尾数的字长(16位),约相当于4位半十进制数(65536)。,这种浮点数表示法的运算速度较快,需要的存储容量也较小,并且数的范围和精度能满足绝大多数应用场合的需要。4规格化浮点数为了保证运算精度,必须尽量增加尾数的有效值位数。一个数的有效值位数是指从第一个非零数字位开始的全部数值位数。例如二进制数00010100的有效数值位为5位,而10100000的有效数值位为8位。这样,应使浮点数中的尾数的第一位数字不等于零,满足这一条件的数称为规格化浮点数。这时0.5M1。任何数(除零外)只要它的数值处于浮点数的表示范围之内,均可以化成规格化浮点数。,5.浮点数的加减法运算浮点数的加减法比定点数要困难得多。执行加减法前必须先对准小数点,然后才能按定点小数加减法运算那样进行尾数加减法操作,结果数的阶码等于对准小数点后的的阶码。由于结果数不一定为规格化数,因此必须对结果进行规格化操作。对阶应该是小的阶码向大的阶码对齐。如果采用大阶对小阶,那么减小大的阶码时,必须把它的尾数左移,将丢失尾数的高位有效数字。,5浮点乘除法运算执行浮点数乘法比加法方便,不需要对准小数点,只要将阶码相加,尾数相乘即可。浮点乘法不会产生溢出,但有可能需进行规格化。执行浮点除法与浮点乘法不一样,不能对尾数直接调用双字节定点小数除法子程序,因为定点小数除法在入口时,应满足被除数小于除数的条件,否则商将大于1,无法用小数表示。所以执行浮点除法时,应先调整小数点的位置(即调整阶码),使被除数的尾数小于除数的尾数。,第九节码型转换程序设计在计算机系统的硬件设备中使用的码型不完全相同,例如主机处理是二进制数,而输入输出设备(如显示器,打印机)则常使用ASCII码或BCD码。因此,在绝大多数微机应用中,都离不开编写码型转换程序,本节通过几个程序实例介绍几种常用的码型转换程序的设计方法。一、十六进制数与ASCII码之间的转换0-9的ASCII码是30H一39H,AF的ASCII码是41H一46H。转换程序的功能是将由4位二进制数表示的1位十六进制数(即0000-1111)转换成由8位二进制数表示的ASCII码字符。反之,将由8位二进制数表示的ASCII码字符转换成由4位二进制数表示的十六进制数。,例:将十六进制数转换成ASCII码设:N个数据存放在内部RAM20H开始的单元中,将每个单元中的2位十六进制数分别转换成相应的ASCII码,存放在40H开始的区域内。转换算法:首先将一字节中的2位十六进制数拆成2个1位十六进制数,然后再判断是0-9之间的数,还是A-F之间的数,若是0-9之间的数,则在原数基础上加上“30H”,就得到0-9的ASCII码30H-39H,若是AF之间的数,则在原数基础上加上“07H+30H”,就得到A-F的ASCII码42H一46H。,例:将ASCII码转换成十六进制数设:把外部RAM2000H-200FH单元中的ASCII码依次转换成十六进制数,并存放在内部RAM40H-47H单元中。转换算法:取ASCII码减去30H,若小于0AH,则是0-9之间的数;若大于或等于0AH,则应再减去07H,则是A-F之间的数。,二、十进制数与二进制数之间的转换在日常生活中,人们往往习惯采用十进制数进行各种运算,而计算机只能处理二进制数,这就需要通过数制转换程序来实现各自的需要。例:8位二进制数转换

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论