程序设计课件_第1页
程序设计课件_第2页
程序设计课件_第3页
程序设计课件_第4页
程序设计课件_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

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

文档简介

第四章:MCS-51程序设计计算机与通信工程学院李耀明第四章:MCS-51程序设计计算机与通信工程学院1一、汇编语言概述1、指令系统语句格式[<标号>]:<操作码>[<操作数>];[<注释>]指令编码长短:单字节,双字节,三字节执行周期:一个机器周期占12个振荡周期,单周期指令,双周期,4周期寻址方式:指令中所规定的寻找操作地址的方式立即、直接、寄存器、寄存器间接寻址、基址加变址、相对寻址、位寻址指令分类:数据传送、算术、逻辑、位操作、控制转移2、程序设计的步骤(1)分析问题,编制说明要解决问题的程序框图。(2)确定数据结构、算法、工作单元、变量设定(与高级语言不同)(3)根据所用的指令系统,按照已编制的程序框图用汇编语言编制出源程序。(4)将编制出的程序在计算机上调试,直至实现预定的功能。计算机与通信工程学院一、汇编语言概述1、指令系统计算机与通信工程学院二、程序设计分类1、顺序程序:执行时按顺序一条条地执行指令2、分支程序:当程序不再顺序执行,而向一个方向或多个方向转移时,叫分支程序。3、循环程序:对于需要反复的程序段,常采用循环办法,以缩短程序。4、子程序及其调用程序主程序使用子程序时,用调用指令(ACALL),子程序最后放一条RET指令。计算机与通信工程学院二、程序设计分类1、顺序程序:计算机与通信工程学院三、程序设计准则结构清晰:便于分析层次分明:便于阅读语言简洁:便于分析易于理解:便于阅读计算机与通信工程学院三、程序设计准则结构清晰:便于分析计算机与通信工程学院4.1简单程序设计简单程序又称顺序程序。计算机是按指令在存储器中存放的先后次序来顺序执行程序的。除非用特殊指令让它跳转,不然它会在PC控制下执行。计算机与通信工程学院4.1简单程序设计简单程序又称顺序程序。计算机是按指令在例4-1两个8位无符号数相加ORG0000HAJMPBEGINORG0030HBEGIN:MOV40H,#01HMOV41H,#02HLOOP:MOVR0,#40HMOVA,@R0INCR0ADDA,@R0INCR0MOV@R0,AJMPLOOPEND开始R0←40HA←(R0)A送(42H)(40H)+(41H)和送A返回图4-1例1流程图例:将加数和被加数分别送入40H、41H单元,加完后和送入42H单元计算机与通信工程学院例4-1两个8位无符号数相加ORG0000H开始R0←40例4-2将两个半字节数合并成一个单字节数程序ORG0000HAJMPstartORG0030HSTART:MOVsp,#60HMOV40h,#01hMOV41h,#02hloop:MOVR1,#40HMOVA,@R1ANLA,#0FH;取第一个半字节SWAPAINCR1XCHA,@R1;取第二字节ANLA,#0FH;取第二个半字节ORLA,@R1;拼字INCR1MOV@R1,A;存放结果AJMP$END执行完后如何不改变内存和寄存器的值?开始(40H)内容送A,屏蔽高位,交换高低位A←(R0)A与(R1)或后送(42H)取(41H)内容,屏蔽高位,送A返回图4-2例2流程图计算机与通信工程学院例4-2将两个半字节数合并成一个单字节数程序开始(40H)4.2分支程序设计在处理实际事务中,只用简单程序设计的方法是不够的。因为大部分程序总包含有判断、比较等情况。根据判断、比较的结果转向不同的分支计算机与通信工程学院4.2分支程序设计在处理实际事务中,只用简单程序设计的方例4-3:两个无符号数比较大小设两个连续外部RAM单元ST1和ST2中存放不带符号的二进制数,找出其中的大数存入ST3单元中。ST1EQU8040HORG0000HJMPSTARTORG0030HSTART:MOVDPTR,#ST1MOVA,#12HMOVX@DPTR,AINCDPTRMOVA,#34HMOVX@DPTR,ALOOP:CLRC;进位位清零MOVDPTR,#ST1;设数据指针MOVXA,@DPTR;取第一数MOVR2,A;暂存R2INCDPTRMOVXA,@DPTR;取第二个数SUBBA,R2;两数比较JNCBIG1XCHA,R2;第一数大BIG0:INCDPTRMOVX@DPTR,A;存大数SJMP$BIG1:MOVXA,@DPTR;第二数大SJMPBIG0END开始设置指针DPTR初始值取第一个数存入R2取第二个数后者减前者进位标志是否为0?存后者结束存前者YN图5-3例4流程计算机与通信工程学院例4-3:两个无符号数比较大小设两个连续外部RAM单元ST1例4-4:编制计算符号函数y=SGN(x)的程序AREEQU8040HBUFEQU8060HORG0000HJMPSTARTORG0030HSTART:MOVDPTR,#AREMOVA,#0F0HMOVX@DPTR,ALOOP:MOVDPTR,#ARE;进位位清零MOVXA,@DPTR;取第一数JZSULJBACC.7,NEGMOVA,#01HSUL:MOVDPTR,#BUFMOVX@DPTR,AJMPLOOPNEG:MOVA,#0FFHSJMPSULEND计算机与通信工程学院例4-4:编制计算符号函数y=SGN(x)的程序AREE4.3循环程序设计简单程序,每条指令只执行一次分支程序则根据条件的不同,会跳过一些指令,执行另一些指令。它们的特点是,每一条指令至多执行一次。在处理实际事务时,有时会遇到多次重复处理的问题,用循环程序的方法来解决就比较合适。循环程序中的某些指令可以反复执行多次。采用循环程序,使程序缩短,节省存储单元。重复次数越多,循环程序的优越性就越明显。程序的执行时间并不节省。由于要有循环准备、结束判断等指令,速度要比简单程序稍慢些。计算机与通信工程学院4.3循环程序设计简单程序,每条指令只执行一次计算机与通循环程序组成循环程序一般由五部分组成:1、初始化部分:为循环程序做准备。如:设置循环次数计数器的初值,地址指针置初值,为循环变量赋初值等。2、处理部分:为反复执行的程序段,是循环程序的实体。3、修改部分:每执行一次循环体后,对指针作一次修改,使指针指向下一数据所在位置,为进入下一轮处理作准备。4、控制部分:根据循环次数计数器的状态或循环条件,检查循环是否能继续进行,若循环次数到或循环条件不满足,应控制退出循环,否则继续循环。通常2、3、4部分又称为循环体。5、结束部分:分析及存放执行结果。计算机与通信工程学院循环程序组成循环程序一般由五部分组成:计算机与通信工程学院循环程序的结构循环程序的结构一般有两种形式:先进入处理部分,再控制循环。至少执行一次循环体。先控制循环,后进入处理部分。即先根据判断结果,控制循环的执行与否,有时可以不进入循环体就退出循环程序。计算机与通信工程学院循环程序的结构循环程序的结构一般有两种形式:计算机与通信工程主要语句寻址方式寄存器间接寻址MOVA,@RiMOVXA,@DPTRMOVXA,@Ri基址寄存器+变址寄存器间接寻址MOVCA,@A+DPTRMOVCA,@A+PC循环计数DJNZRn,relDJNEA,direct,relJZ(JNZ,JC,JNC,JB,JNB)rel计算机与通信工程学院主要语句寻址方式计算机与通信工程学院例4-5工作单元清零将40H为起点的8个单元清“0”ORG0000HCLEAR:CLRA;A清0MOVR0,#40H;确定清0单元起始地址MOVR7,#08;确定要清除的单元个数LOOP:MOV@R0,A;清单元INCR0;指向下一个单元DJNZR7,LOOP;控制循环END计算机与通信工程学院例4-5工作单元清零将40H为起点的8个单元清“0”计算机例4-5工作单元清零例如:设有50个外部RAM单元要清“0”,即为循环次数存放在R2寄存器中,其首址存放在DPTR中,设为2000HORG0000HMOVDPTR,#2000HCLEAR:CLRAMOVR2,#32H;置计数值LOOP:MOVX@DPTR,AINCDPTR;修改地址指针DJNZR2,LOOP;控制循环END计算机与通信工程学院例4-5工作单元清零例如:设有50个外部RAM单元要清“0例4-5工作单元清零写成通用子程序形式:CLEAR:CLRALOOP:MOVX@DPTR,AINCDPTR;修改地址指针DJNZR2,LOOP;控制循环RET完整调用ORG0000HMOVDPTR,#2000HMOVR2,#50ACALLCLEARSJMP$CLEAR:CLRALOOP:MOVX@DPTR,AINCDPTR;修改地址指针DJNZR2,LOOP;控制循环RETEND计算机与通信工程学院例4-5工作单元清零写成通用子程序形式:计算机与通信工程学例4-6多个单字节数据求和已知有n个单字节数据,依次存放在内部RAM40H单元开始的连续单元中。要求把计算结果存入R2,R3中(高位存R2,低位存R3)。程序如下:ORG8000HSAD:MOVR0,#40H;设数据指针MOVR5,#NUM;计数值0AH→R5SAD1:MOVR2,#0;和的高8位清零MOVR3,#0;和的低8位清零LOOP:MOVA,R3;取加数ADDA,@R0MOVR3,A;存和的低8位JNCLOP1;无进位,直接计算高8位INCR2;有进位,和的高8位+1LOP1:INCR0;指向下一数据地址DJNZR5,LOOPRETNUMEQU0AHEND上述程序中,用R0作间址寄存器,每作一次加法,R0加1,数据指针指向下一数据地址,R5为循环次数计数器,控制循环的次数。计算机与通信工程学院例4-6多个单字节数据求和已知有n个单字节数据,依次存放在例4-7测试字符串长度设有一串字符依次存放在从50H单元开始的连续单元中,该字符串以回车符(0DH)为结束标志,测得的字符串长度存入R2中。测字符串长度程序是将该字符串中的每一个字符依次与回车符相比,若比较不相等,则统计字符串长度的计数器加1。继续比较,若比较相等,则表示该字符串结束,计数器中的值就是字符串的长度。程序如下:ORG0000HCONT:MOVR2,#00H;初始长度设置MOVR0,#50H;数据指针R0置初值NEXT:CJNE@R0,#0DH,LOOP1 RETLOOP1:INCR0INCR2SJMPNEXTEND待测字符以ASCII码形式存放在RAM中,回车符的ASCII码为0DH,程序中用一条CJNE@R0,#0DH,LOOP指令实现字符比较及控制循环的任务,当循环结束时,R2的内容为字符串长度计算机与通信工程学院例4-7测试字符串长度设有一串字符依次存放在从50H单元开例4-910秒延时程序延时程序与MCS-51执行指令的时间有关,如果使用6MHz晶振,一个机器周期为2μs,计算出执行一条指令以至一个循环所需要的时间,给出相应的循环次数,便能达到延时的目的。程序如下:DEL:MOVR5,#100DEL0:MOVR6,#200DEL1:MOVR7,#248DEL2:DJNZR7,DEL2;248*2+4DJNZR6,DEL1;(248*2+4)*200+4DJNZR5,DEL0;(248*2+4)*200+4)*100+4RET上例延时程序实际延时为10.000406秒。它是一个三重循环程序,利用程序嵌套的方法对时间实行延迟是程序设计中常用的方法。使用多重循环程序时,必须注意以下几点:(1)循环嵌套,必须层次分明,不允许产生内外层循环交叉。(2)外循环可以一层层向内循环进入,结束时由里往外一层层退出。(3)内循环体可以直接转入外循环体,实现一个循环由多个条件控制的循环结构方式。计算机与通信工程学院例4-910秒延时程序延时程序与MCS-51执行指令的时间例4-10冒泡程序MOVR6,#CNTDECR6LOOPA:MOVR0,#30HMOVA,R6MOVR7,ACLR20H.0NEXT:MOVA,@R0INCR0CLRCSUBBA,@R0JCNXCHMOVA,@R0DECR0XCHA,@R0INCR0MOV@R0,ASETB20H.0CNTEQU07HORG0000HAJMPSTARTORG0030HSTART:MOVDPTR,#LISTMOVR0,#30HMOVR7,#CNTLOOPD:CLRAMOVCA,@A+DPTRMOV@R0,AINCDPTRINCR0DJNZR7,LOOPDNXCH:DJNZR7,NEXTJNB20H.0,OVERDJNZR6,LOOPAOVER:AJMP$LIST:DB70H,13H,3H,90H,27H,32H,11Hend计算机与通信工程学院例4-10冒泡程序MOVR6,#CNTCNT例4-13无符号数双字节乘法R2R3×R6R7--------------------------------R3×R7R2×R7R3×R6R2×R6-------------------------------------R4R5R6R7计算机与通信工程学院例4-13无符号数双字节乘法例4-13无符号数双字节乘法ORG0000HAJMPMAINORG0030HMAIN:MOVSP,#60HSTART:MOVR2,#0FFHMOVR3,#0FFHMOVR6,#0FFHMOVR7,#0FFHLCALLDBMULAJMPSTARTDBMUL:MOVA,R3MOVB,R7MULABXCHA,R7MOVR5,BMOVB,R2MULABADDA,R5MOVR4,ACLRAADDCA,BMOVA,R5MOVA,R6MOVB,R3MULABADDA,R4XCHA,R6XCHA,BADDCA,R5MOVR5,AMOVF0,CMOVA,R2MULABADDA,R5MOVR5,ACLRAMOVACC.0,CMOVC,F0ADDCA,BMOVR4,ARETEND计算机与通信工程学院例4-13无符号数双字节乘法ORG0000HA4.4散转程序设计散转程序是分支程序的一种。它由输入条件或运算结果来确定转入各自的处理程序。有多种方法能实现散转程序,但通常用逐次比较法,即把所有各个情况逐一进行比较,若有符合便转向对应的处理程序。由于每一个情况都有判断和转移,如对n个情况,需要n个判断和转移,因此它的缺点是程序比较长。MCS-51指令系统中有一条跳转指JMP@A+DPTR,用它可以容易地实现散转功能。该指令是把累加器A的8位无符号数(作地址的低8位)与16位数据指针的内容相加,其和送入程序计数器,作为转移指令的地址。执行JMP@A+DPTR指令后,累加器和16位数据指针的内容均不受影响。计算机与通信工程学院4.4散转程序设计散转程序是分支程序的一种。计算机与通信工例4-16用转移指令表实现散转根据某一单元的值0,1,2,…,n分别转向处理程序0,处理程序1,……处理程序n。这时可以用转移指令AJMP(或LJMP)组成一个转移表例4-16:根据R6的内容,转向各个处理程序MOVDPTR,#TAB1MOVA,R6ADDA,R6PAD:JMP@A+DPTRTAB1:AJMPLOP0AJMPLOP1AJMPLOP2本例仅适用于散转表首地址TAB1和处理程序入口地址LOP0,LOP1,……LOPn在同一个2K范围的存储区的情况。如果一个2K范围的存储区内放不下所有的处理程序时,把一些较长的处理程序放在其他存储区域,只要在该处理程序的入口地址内用LJMP指令即可。计算机与通信工程学院例4-16用转移指令表实现散转根据某一单元的值0,1,2,例4-16用LJMP指令组成转移表PJ2:MOVDPTR,#TAB2CLRCMOVR5,#0MOVA,R6RLCA;R6*2JNCAD1INCR5;有进位,高8位加1AD1:ADDA,R6;R6*3JNCAD2INCR5;有进位,高8位加1AD2:MOVA,R5ADDA,DPH;DPTR高8位调整MOVA,R6JMP@A+DPTR;得散转地址TAB2:LJMBLOP0LJMPLOP1……LJMPLOPnEND用AJMP组成的散转表为二字节一项,而用LJMP组成的散转表则为三字节一项,根据R6中的内容或乘2,或乘3得每一处理程序的入口地址表指针。PJ2:MOVDPTR,#TAB2CLRCMOVR5,#0MOVA,R6RLCA;R6*2JNCAD1INCDPH;AD1:ADDA,R6;R6*3JNCAD2INCDPH;AD2:JMP@A+DPTRTAB2:LJMBLOP0LJMPLOP1……LJMPLOPnEND计算机与通信工程学院例4-16用LJMP指令组成转移表PJ2:MOV例4-17用转移地址表实现散转例4-17:根据R3的内容转向对应处理程序。处理程序的入口分别是LOP0~LOP2。PJ3:MOVDPTR,#TAB3MOVA,R3ADDA,R3;R3*2JNCCADINCDPH;有进位DPTR高位加1CAD:MOVR2,A;暂存R2MOVCA,@A+DPTRXCHA,R2;处理程序入口地址高8位暂存R2INCAMOVCA,@A+DPTRMOVDPL,A;处理程序入口地址低8位暂存DPLMOVDPH,R2CLRAJMP@A+DPTRTAB3:DWLOP0DWLOP1DWLOP2计算机与通信工程学院例4-17用转移地址表实现散转例4-17:根据R3的内容4.5子程序和参数传递方法在程序中,会多次进行一些相同的计算和操作,一般把他们写成子程序如数制转换、函数式计算等。一些常用的程序段,以子程序的形式,事先存放在存储器的某一区域主程序在运行时,需要用子程序时,只要执行调用子程序的指令,使程序转至子程序。子程序处理完毕,返回主程序,继续进行以后的操作。调用子程序有几个优点:1、避免对相同程序段的重复编制。2、简化程序的逻辑结构,同时也便于子程序调试。3、节省存储器空间。有两条调用子程序指令ACALL及LCALL,和一条返回主程序的指令RET。子程序的调用,一般包含两个部分:保护现场和恢复现场。参数的传递调用子程序时,主程序先把有关的参数(入口参数)存放在约定的位置,子程序在执行时,从约定的位置取得参数,当子程序执行完,将得到的结果(出口参数)存入约定的位置,返回主程序后,主程序可以从这些约定的位置上取到需要的结果。计算机与通信工程学院4.5子程序和参数传递方法在程序中,会多次进行一些相同的计1、工作寄存器或累加器传递参数把入口参数或出口参数放工作寄存器或累加器中。使用这种方法程序最简单,运算速度也最高。缺点工作寄存器数量有限,不能传递太多的数据;主程序必须先把数据送到工作寄存器;参数个数固定,不能由主程序任意改定。例:请编出能把R5单元内两个BCD数变换成相应ASCII码放在R6(高位BCD数的ASCII码)和R7(低位BCD数的ASCII码)单元的程序。根据ASCII字符表,0-9的BCD数和它们的ASCII码之间仅相差30H。因此,仅需把R5单元中两个BCD数拆开,分别和30H相加就行了,可以编出程序如下:ASCH:MOVA,R5ANLA,#0F0HORLA,#30HMOVR6,AMOVA,R5ANLA,#0FHORLA,#30HMOVR7,ARET计算机与通信工程学院1、工作寄存器或累加器传递参数把入口参数或出口参数放工作寄存2、用指针寄存器来传递参数由于数据一般存放在存贮器中,而不是工作寄存器中,故可用指针来指示数据的位置,可以节省传递数据的工作量,并可实现可变长度运算。一般如参数在内部RAM中,可用R0或R1作指针。可变长度运算时,可用一个寄存器来指出数据长度,也可在数据中指出其长度(如使用结束标记符)。例:将(R0)和(R1)指出的内部RAM中两个3字节无符号整数相加,结果送(R0)指出的内部RAM中。入口时,(R0),(R1)分别指向加数和被加数的低位字节,出口时(R0)指向结果的高位字节。利用MS-51的带进位加法指令,可以直接编写出下面的程序。NADD:MOVR7,#3CLRCNADD1:MOVA,@R0ADDCA,@R1MOV@R0,ADECR0DECR1DJNZR7,NADD1INCR0INCR0INCR0RET计算机与通信工程学院2、用指针寄存器来传递参数由于数据一般存放在存贮器中,而不是3、用堆栈来传递参数堆栈可以用于传递参数。调用时,主程序用PUSH指令把参数压入堆栈子程序可按栈指针访问堆栈中的参数,同时可把结果参数送回堆栈中。返回主程序后,可用POP指令得到这些结果参数。这种方法的优点是简单,能传递大量参数,不必为特定的参数分配存贮单元。使用这种方法时,由于参数在堆栈中,故大大简化了中断响应时的现场保护。计算机与通信工程学院3、用堆栈来传递参数堆栈可以用于传递参数。计算机与通信工程学例4-19一位十六进制数转换为ASCII码子程序HASC:MOVR0,SPDECR0DECR0;R0为参数指针XCHA,@R0;保护ACC,取出参数ANLA,#0FHADDA,#2;加偏移量MOVCA,@A+PCXCHA,@R0;查表结果放回堆栈中RETDB‘0123456789’;十六进制数的ASCII字符表DB‘ABCDEF’计算机与通信工程学院例4-19一位十六进制数转换为ASCII码子程序HASC:例4-21一个字节的两位十六进制数为转换为两个ASCII码子程序ORG0000HAJMPSTARTORG0030HSTART:MOVSP,#60HMOV40H,#7FHPUSH40HMOVA,#78hLCALLHTA2AJMPSTARTHTA2:MOVR0,SPDECR0DECR0PUSHACC;保护累加器内容(????)MOVA,@R0;取出参数ANLA,#0FHMOVDPTR,#DATA1MOVCA,@A+DPTRXCHA,@R0;低位HEX的ASCII码放入堆栈中SWAPAANLA,#0FHMOVCA,@A+DPTRINCR0XCHA,@R0;高位HEX的ASCII码放入堆栈中INCR0XCHA,@R0;高位返回地址放入堆栈,并恢复累加器内容RETDATA1:DB'0123456789'DB'ABCDEF'END计算机与通信工程学院例4-21一个字节的两位十六进制数为转换为两个ASCII码例22将内部RAM中50H、51H中的内容以4位十六进制数的ASCII形式在串行发送出去,可如下调用HTA2程序:ORG0000HSCOT4:PUSH50HACALLHTA2POPACCACALLCOUTPOPACCACALLCOUTPUSH51HACALLHTA2POPACCACALLCOUTPOPACCACALLCOUTCOUT:JNBTI,COUT;字符发送子程序CLRTIMOVSBUF,ARETEND计算机与通信工程学院例22将内部RAM中50H、51H中的内容以4位十六进制数的4、程序段参数传递参数传递方法,多数是在调用子程序前,把值装入适当的寄存器传递参数。如果有许多常数参数,这种技术不太有效,每个参数需要一个寄存器传递,并且在每次调用子程序时需分别用指令把它们装入寄存器中。如果需要大量参数,并且这些参数均为常数时,程序段参数传递方法(有时也称为直接参数传递)是传递常数的有效方法。调用时,常数作为程序代码的一部分,紧跟在调用子程序后面。子程序根据栈内的返回地址,决定从何处找到这些常数然后在需要时,从程序存贮器中读出这些参数。计算机与通信工程学院4、程序段参数传递参数传递方法,多数是在调用子程序前,把值装例22字符串发送子程序。实际应用中,需要发送各种字符串。这些字符串,通常放在EPROM(程序存贮器)中。按通常方法,需要先把这些字符装入RAM中,然后用传递指针的方法来实现参数传递。为了简便,也可把字符串放在EPROM独立区域中,然后用传递字符串首地址的方法来传递参数。子程序可按该地址用MOVC指令从EPROM中读出并发送该字符串。最简单的方法是采用程序段参数传递方法。下例中,字符串全以0结束。SOUT:POPDPH;栈中指针POPDPLSOT1:CLRAMOVCA,@A+DPTRINCDPTRJZSENDJNBTI,$;$为本条指令地址CLRTIMOVSBUF,ASJMPSOT1SEND:JMP@A+DPTRRET下面从发送字符串‘MCS-51CONTROLLER’为例,说明该子程序使用方法。ACALLSOUTDB‘MCS-51CONTROLLER’DB0AH,0DH,0后面紧接其他程序。计算机与通信工程学院例22字符串发送子程序。实际应用中,需要发送各种字符串。这些例22:总结上面子程序有几个特点:它不以一般的返回指令结尾,而是采用基寄存器加变址寄存器间接转移指令来返回到参数表后的第一条指令。一开始的POP指令已调整了栈指针的内容。它可适用与ACALL或LCALL,因为这两种调用指令均把下一条指令或数据字节的地址压入栈中。调用程序可位于MCS-51全部地址空间的任何地方,因为MOVC指令能访问所有64K字节。传递到子程序的参数可按最方便的次序列表,而不必按使用的次序排列。子程序在每一条MOVC指令前累加器装入适当的参数,这样基本上可“随机访问”参数表。子程序只使用累加器A和数据指针DPTR,应用程序可以在调用前,把这些寄存器压入堆栈中,保护它们的内容。计算机与通信工程学院例22:总结上面子程序有几个特点:计算机与通信工程学院4.6查表程序设计查表程序是一种常用程序,它广泛使用于LED显示器控制、打印机打印以及数据补偿,计算、转换等功能程序中,具有程序简单、执行速度快等优点。查表,就是根据变量x在表格中查找y,使y=f(x)。计算机与通信工程学院4.6查表程序设计查表程序是一种常用程序,它广泛使用于LED1、用MOVCA,@A+PC查表指令编程例:用查表方法编写彩灯控制程序,编程使彩灯先顺次点亮,再逆次点亮,然后连闪三下,反复循环。TAB:DB01H,02H,04H,08H,10H,20H,40H,80HDB80H,40H,20H,10H,08H,04H,02H,01HDB00H,0FFH,00H,0FFH,00H,0FFH,03HDEL:MOVR7,#0FFHDEL1:MOVR6,#0FFHDEL2:DJNZR6,DEL2DJNZR7,DEL1RETENDORG0000HSTART:MOVR0,#00HLOOP:CLRAMOVA,R0ADDA,#0CHMOVCA,@A+PCCJNEA,#03H,LOOP1JMPSTARTLOOP1:MOVP1,AACALLDELINCR0JMPLOOP计算机与通信工程学院1、用MOVCA,@A+PC查表指令编程例:用查表方法编写2、用MOVCA,@A+DPTR查表指令编程例:用查表方法编写彩灯控制程序,编程使彩灯先顺次点亮,再逆次点亮,然后连闪三下,反复循环。程序为:ORG0000HSTART:MOVDPTR,#TABLOOP:CLRAMOVCA,@A+DPTRCJNEA,#03H,LOOP1JMPSTARTLOOP1:MOVP1,AACALLDELINCDPTRJMPLOOPTAB:DB01H,02H,04H,08H,10H,20H,40H,80HDB80H,40H,20H,10H,08H,04H,02H,01HDB00H,0FFH,00H,0FFH,00H,0FFH,03HDEL:MOVR7,#0FFHDEL1:MOVR6,#0FFHDEL2:DJNZR6,DEL2DJNZR7,DEL1RETEND计算机与通信工程学院2、用MOVCA,@A+DPTR查表指令编程例:用查表方法4.7综合编程已经编过彩灯程序控制,使接于P1口的红发光二极管左移顺次点亮,当时为了简单易懂,用字节传送方法编的,编的程序较长,实际上编程很灵活,方法很多,同一个问题有很多种编程方法,没有千篇一律的格式,下面就彩灯顺序点亮的程序的两种编程方法作一比较,了解一些编程的技巧。计算机与通信工程学院4.7综合编程已经编过彩灯程序控制,使接于P1口的红发光二极例用左移指令RLA编程ORG0000HMOVA,#0FEHLOP1:MOVP1,AACALLDELRLAAJMPLOP1DEL:MOVR4,#0FFHDEL1:MOVR3,#0FFHDEL2:DJNZR3,DEL2DJNZR4,DEL1RETENDORG0000HMOVA,#7FHLOP2:MOVP1,AACALLDELRRAAJMPLOP2DEL:MOVR4,#0FFHDEL1:MOVR3,#0FFHDEL2:DJNZR3,DEL2DJNZR4,DEL1RETEND计算机与通信工程学院例用左移指令RLA编程ORG0例用查表方法编写彩灯左移控制程序ORG0000HSTART:MOVR0,#00HLOOP:MOVA,R0ADDA,#0DHMOVCA,@A+PCCJNEA,#03H,LOOP1JMPSTARTLOOP1:MOVP1,ACLRAACALLDELINCR0JMPLOOPTAB:DB01H,02H,04H,08H,10H,20H,40H,80H,03HDEL:MOVR4,#0FFHDEL1:MOVR3,#0FFHDEL2:DJNZR3,DEL2DJNZR4,DEL1RETEND计算机与通信工程学院例用查表方法编写彩灯左移控制程序ORG0000H计算机与计算机与通信工程学院计算机与通信工程学院演讲完毕,谢谢观看!演讲完毕,谢谢观看!第四章:MCS-51程序设计计算机与通信工程学院李耀明第四章:MCS-51程序设计计算机与通信工程学院46一、汇编语言概述1、指令系统语句格式[<标号>]:<操作码>[<操作数>];[<注释>]指令编码长短:单字节,双字节,三字节执行周期:一个机器周期占12个振荡周期,单周期指令,双周期,4周期寻址方式:指令中所规定的寻找操作地址的方式立即、直接、寄存器、寄存器间接寻址、基址加变址、相对寻址、位寻址指令分类:数据传送、算术、逻辑、位操作、控制转移2、程序设计的步骤(1)分析问题,编制说明要解决问题的程序框图。(2)确定数据结构、算法、工作单元、变量设定(与高级语言不同)(3)根据所用的指令系统,按照已编制的程序框图用汇编语言编制出源程序。(4)将编制出的程序在计算机上调试,直至实现预定的功能。计算机与通信工程学院一、汇编语言概述1、指令系统计算机与通信工程学院二、程序设计分类1、顺序程序:执行时按顺序一条条地执行指令2、分支程序:当程序不再顺序执行,而向一个方向或多个方向转移时,叫分支程序。3、循环程序:对于需要反复的程序段,常采用循环办法,以缩短程序。4、子程序及其调用程序主程序使用子程序时,用调用指令(ACALL),子程序最后放一条RET指令。计算机与通信工程学院二、程序设计分类1、顺序程序:计算机与通信工程学院三、程序设计准则结构清晰:便于分析层次分明:便于阅读语言简洁:便于分析易于理解:便于阅读计算机与通信工程学院三、程序设计准则结构清晰:便于分析计算机与通信工程学院4.1简单程序设计简单程序又称顺序程序。计算机是按指令在存储器中存放的先后次序来顺序执行程序的。除非用特殊指令让它跳转,不然它会在PC控制下执行。计算机与通信工程学院4.1简单程序设计简单程序又称顺序程序。计算机是按指令在例4-1两个8位无符号数相加ORG0000HAJMPBEGINORG0030HBEGIN:MOV40H,#01HMOV41H,#02HLOOP:MOVR0,#40HMOVA,@R0INCR0ADDA,@R0INCR0MOV@R0,AJMPLOOPEND开始R0←40HA←(R0)A送(42H)(40H)+(41H)和送A返回图4-1例1流程图例:将加数和被加数分别送入40H、41H单元,加完后和送入42H单元计算机与通信工程学院例4-1两个8位无符号数相加ORG0000H开始R0←40例4-2将两个半字节数合并成一个单字节数程序ORG0000HAJMPstartORG0030HSTART:MOVsp,#60HMOV40h,#01hMOV41h,#02hloop:MOVR1,#40HMOVA,@R1ANLA,#0FH;取第一个半字节SWAPAINCR1XCHA,@R1;取第二字节ANLA,#0FH;取第二个半字节ORLA,@R1;拼字INCR1MOV@R1,A;存放结果AJMP$END执行完后如何不改变内存和寄存器的值?开始(40H)内容送A,屏蔽高位,交换高低位A←(R0)A与(R1)或后送(42H)取(41H)内容,屏蔽高位,送A返回图4-2例2流程图计算机与通信工程学院例4-2将两个半字节数合并成一个单字节数程序开始(40H)4.2分支程序设计在处理实际事务中,只用简单程序设计的方法是不够的。因为大部分程序总包含有判断、比较等情况。根据判断、比较的结果转向不同的分支计算机与通信工程学院4.2分支程序设计在处理实际事务中,只用简单程序设计的方例4-3:两个无符号数比较大小设两个连续外部RAM单元ST1和ST2中存放不带符号的二进制数,找出其中的大数存入ST3单元中。ST1EQU8040HORG0000HJMPSTARTORG0030HSTART:MOVDPTR,#ST1MOVA,#12HMOVX@DPTR,AINCDPTRMOVA,#34HMOVX@DPTR,ALOOP:CLRC;进位位清零MOVDPTR,#ST1;设数据指针MOVXA,@DPTR;取第一数MOVR2,A;暂存R2INCDPTRMOVXA,@DPTR;取第二个数SUBBA,R2;两数比较JNCBIG1XCHA,R2;第一数大BIG0:INCDPTRMOVX@DPTR,A;存大数SJMP$BIG1:MOVXA,@DPTR;第二数大SJMPBIG0END开始设置指针DPTR初始值取第一个数存入R2取第二个数后者减前者进位标志是否为0?存后者结束存前者YN图5-3例4流程计算机与通信工程学院例4-3:两个无符号数比较大小设两个连续外部RAM单元ST1例4-4:编制计算符号函数y=SGN(x)的程序AREEQU8040HBUFEQU8060HORG0000HJMPSTARTORG0030HSTART:MOVDPTR,#AREMOVA,#0F0HMOVX@DPTR,ALOOP:MOVDPTR,#ARE;进位位清零MOVXA,@DPTR;取第一数JZSULJBACC.7,NEGMOVA,#01HSUL:MOVDPTR,#BUFMOVX@DPTR,AJMPLOOPNEG:MOVA,#0FFHSJMPSULEND计算机与通信工程学院例4-4:编制计算符号函数y=SGN(x)的程序AREE4.3循环程序设计简单程序,每条指令只执行一次分支程序则根据条件的不同,会跳过一些指令,执行另一些指令。它们的特点是,每一条指令至多执行一次。在处理实际事务时,有时会遇到多次重复处理的问题,用循环程序的方法来解决就比较合适。循环程序中的某些指令可以反复执行多次。采用循环程序,使程序缩短,节省存储单元。重复次数越多,循环程序的优越性就越明显。程序的执行时间并不节省。由于要有循环准备、结束判断等指令,速度要比简单程序稍慢些。计算机与通信工程学院4.3循环程序设计简单程序,每条指令只执行一次计算机与通循环程序组成循环程序一般由五部分组成:1、初始化部分:为循环程序做准备。如:设置循环次数计数器的初值,地址指针置初值,为循环变量赋初值等。2、处理部分:为反复执行的程序段,是循环程序的实体。3、修改部分:每执行一次循环体后,对指针作一次修改,使指针指向下一数据所在位置,为进入下一轮处理作准备。4、控制部分:根据循环次数计数器的状态或循环条件,检查循环是否能继续进行,若循环次数到或循环条件不满足,应控制退出循环,否则继续循环。通常2、3、4部分又称为循环体。5、结束部分:分析及存放执行结果。计算机与通信工程学院循环程序组成循环程序一般由五部分组成:计算机与通信工程学院循环程序的结构循环程序的结构一般有两种形式:先进入处理部分,再控制循环。至少执行一次循环体。先控制循环,后进入处理部分。即先根据判断结果,控制循环的执行与否,有时可以不进入循环体就退出循环程序。计算机与通信工程学院循环程序的结构循环程序的结构一般有两种形式:计算机与通信工程主要语句寻址方式寄存器间接寻址MOVA,@RiMOVXA,@DPTRMOVXA,@Ri基址寄存器+变址寄存器间接寻址MOVCA,@A+DPTRMOVCA,@A+PC循环计数DJNZRn,relDJNEA,direct,relJZ(JNZ,JC,JNC,JB,JNB)rel计算机与通信工程学院主要语句寻址方式计算机与通信工程学院例4-5工作单元清零将40H为起点的8个单元清“0”ORG0000HCLEAR:CLRA;A清0MOVR0,#40H;确定清0单元起始地址MOVR7,#08;确定要清除的单元个数LOOP:MOV@R0,A;清单元INCR0;指向下一个单元DJNZR7,LOOP;控制循环END计算机与通信工程学院例4-5工作单元清零将40H为起点的8个单元清“0”计算机例4-5工作单元清零例如:设有50个外部RAM单元要清“0”,即为循环次数存放在R2寄存器中,其首址存放在DPTR中,设为2000HORG0000HMOVDPTR,#2000HCLEAR:CLRAMOVR2,#32H;置计数值LOOP:MOVX@DPTR,AINCDPTR;修改地址指针DJNZR2,LOOP;控制循环END计算机与通信工程学院例4-5工作单元清零例如:设有50个外部RAM单元要清“0例4-5工作单元清零写成通用子程序形式:CLEAR:CLRALOOP:MOVX@DPTR,AINCDPTR;修改地址指针DJNZR2,LOOP;控制循环RET完整调用ORG0000HMOVDPTR,#2000HMOVR2,#50ACALLCLEARSJMP$CLEAR:CLRALOOP:MOVX@DPTR,AINCDPTR;修改地址指针DJNZR2,LOOP;控制循环RETEND计算机与通信工程学院例4-5工作单元清零写成通用子程序形式:计算机与通信工程学例4-6多个单字节数据求和已知有n个单字节数据,依次存放在内部RAM40H单元开始的连续单元中。要求把计算结果存入R2,R3中(高位存R2,低位存R3)。程序如下:ORG8000HSAD:MOVR0,#40H;设数据指针MOVR5,#NUM;计数值0AH→R5SAD1:MOVR2,#0;和的高8位清零MOVR3,#0;和的低8位清零LOOP:MOVA,R3;取加数ADDA,@R0MOVR3,A;存和的低8位JNCLOP1;无进位,直接计算高8位INCR2;有进位,和的高8位+1LOP1:INCR0;指向下一数据地址DJNZR5,LOOPRETNUMEQU0AHEND上述程序中,用R0作间址寄存器,每作一次加法,R0加1,数据指针指向下一数据地址,R5为循环次数计数器,控制循环的次数。计算机与通信工程学院例4-6多个单字节数据求和已知有n个单字节数据,依次存放在例4-7测试字符串长度设有一串字符依次存放在从50H单元开始的连续单元中,该字符串以回车符(0DH)为结束标志,测得的字符串长度存入R2中。测字符串长度程序是将该字符串中的每一个字符依次与回车符相比,若比较不相等,则统计字符串长度的计数器加1。继续比较,若比较相等,则表示该字符串结束,计数器中的值就是字符串的长度。程序如下:ORG0000HCONT:MOVR2,#00H;初始长度设置MOVR0,#50H;数据指针R0置初值NEXT:CJNE@R0,#0DH,LOOP1 RETLOOP1:INCR0INCR2SJMPNEXTEND待测字符以ASCII码形式存放在RAM中,回车符的ASCII码为0DH,程序中用一条CJNE@R0,#0DH,LOOP指令实现字符比较及控制循环的任务,当循环结束时,R2的内容为字符串长度计算机与通信工程学院例4-7测试字符串长度设有一串字符依次存放在从50H单元开例4-910秒延时程序延时程序与MCS-51执行指令的时间有关,如果使用6MHz晶振,一个机器周期为2μs,计算出执行一条指令以至一个循环所需要的时间,给出相应的循环次数,便能达到延时的目的。程序如下:DEL:MOVR5,#100DEL0:MOVR6,#200DEL1:MOVR7,#248DEL2:DJNZR7,DEL2;248*2+4DJNZR6,DEL1;(248*2+4)*200+4DJNZR5,DEL0;(248*2+4)*200+4)*100+4RET上例延时程序实际延时为10.000406秒。它是一个三重循环程序,利用程序嵌套的方法对时间实行延迟是程序设计中常用的方法。使用多重循环程序时,必须注意以下几点:(1)循环嵌套,必须层次分明,不允许产生内外层循环交叉。(2)外循环可以一层层向内循环进入,结束时由里往外一层层退出。(3)内循环体可以直接转入外循环体,实现一个循环由多个条件控制的循环结构方式。计算机与通信工程学院例4-910秒延时程序延时程序与MCS-51执行指令的时间例4-10冒泡程序MOVR6,#CNTDECR6LOOPA:MOVR0,#30HMOVA,R6MOVR7,ACLR20H.0NEXT:MOVA,@R0INCR0CLRCSUBBA,@R0JCNXCHMOVA,@R0DECR0XCHA,@R0INCR0MOV@R0,ASETB20H.0CNTEQU07HORG0000HAJMPSTARTORG0030HSTART:MOVDPTR,#LISTMOVR0,#30HMOVR7,#CNTLOOPD:CLRAMOVCA,@A+DPTRMOV@R0,AINCDPTRINCR0DJNZR7,LOOPDNXCH:DJNZR7,NEXTJNB20H.0,OVERDJNZR6,LOOPAOVER:AJMP$LIST:DB70H,13H,3H,90H,27H,32H,11Hend计算机与通信工程学院例4-10冒泡程序MOVR6,#CNTCNT例4-13无符号数双字节乘法R2R3×R6R7--------------------------------R3×R7R2×R7R3×R6R2×R6-------------------------------------R4R5R6R7计算机与通信工程学院例4-13无符号数双字节乘法例4-13无符号数双字节乘法ORG0000HAJMPMAINORG0030HMAIN:MOVSP,#60HSTART:MOVR2,#0FFHMOVR3,#0FFHMOVR6,#0FFHMOVR7,#0FFHLCALLDBMULAJMPSTARTDBMUL:MOVA,R3MOVB,R7MULABXCHA,R7MOVR5,BMOVB,R2MULABADDA,R5MOVR4,ACLRAADDCA,BMOVA,R5MOVA,R6MOVB,R3MULABADDA,R4XCHA,R6XCHA,BADDCA,R5MOVR5,AMOVF0,CMOVA,R2MULABADDA,R5MOVR5,ACLRAMOVACC.0,CMOVC,F0ADDCA,BMOVR4,ARETEND计算机与通信工程学院例4-13无符号数双字节乘法ORG0000HA4.4散转程序设计散转程序是分支程序的一种。它由输入条件或运算结果来确定转入各自的处理程序。有多种方法能实现散转程序,但通常用逐次比较法,即把所有各个情况逐一进行比较,若有符合便转向对应的处理程序。由于每一个情况都有判断和转移,如对n个情况,需要n个判断和转移,因此它的缺点是程序比较长。MCS-51指令系统中有一条跳转指JMP@A+DPTR,用它可以容易地实现散转功能。该指令是把累加器A的8位无符号数(作地址的低8位)与16位数据指针的内容相加,其和送入程序计数器,作为转移指令的地址。执行JMP@A+DPTR指令后,累加器和16位数据指针的内容均不受影响。计算机与通信工程学院4.4散转程序设计散转程序是分支程序的一种。计算机与通信工例4-16用转移指令表实现散转根据某一单元的值0,1,2,…,n分别转向处理程序0,处理程序1,……处理程序n。这时可以用转移指令AJMP(或LJMP)组成一个转移表例4-16:根据R6的内容,转向各个处理程序MOVDPTR,#TAB1MOVA,R6ADDA,R6PAD:JMP@A+DPTRTAB1:AJMPLOP0AJMPLOP1AJMPLOP2本例仅适用于散转表首地址TAB1和处理程序入口地址LOP0,LOP1,……LOPn在同一个2K范围的存储区的情况。如果一个2K范围的存储区内放不下所有的处理程序时,把一些较长的处理程序放在其他存储区域,只要在该处理程序的入口地址内用LJMP指令即可。计算机与通信工程学院例4-16用转移指令表

温馨提示

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

评论

0/150

提交评论