




已阅读5页,还剩73页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.,1,第4章汇编语言程序设计,.,2,所谓程序设计,就是按照给定的任务要求,编写出完整的计算机程序。要完成同样的任务,使用的方法或程序并不是唯一的。因此,程序设计的质量将直接影响到计算机系统的工作效率、运行可靠性。,4.1单片机程序设计语言概述,.,3,4.1.1按照语言的结构及其功能可以分为三种1机器语言:机器语言是用二进制代码0和1表示指令和数据的最原始的程序设计语言。2汇编语言:在汇编语言中,指令用助记符表示,地址、操作数可用标号、符号地址及字符等形式来描述。3高级语言:高级语言是接近于人的自然语言,面向过程而独立于机器的通用语言。,.,4,机器语言(MachineLanguage)直接用机器码编写程序、能够为计算机直接执行的机器级语言。机器码是一串由二进制代码“0”和“1”组成的二进制数据,其执行速度快,但是可读性极差。机器语言一般只在简单的开发装置中使用,程序的设计、输入、修改和调试都很麻烦。,.,5,汇编语言(AssemblyLanguage)指用指令助记符代替机器码的编程语言。汇编语言程序结构简单,执行速度快,程序易优化,编译后占用存储空间小,是单片机应用系统开发中最常用的程序设计语言。汇编语言的缺点是可读性比较差,只有熟悉单片机的指令系统,并具有一定的程序设计经验,才能研制出功能复杂的应用程序。,.,6,高级语言(High-LevelLanguage)在汇编语言的基础上用自然语言的语句来编写程序,例如PL/M-51、C51等,程序可读性强,通用性好,适用于不熟悉单片机指令系统的的用户。高级语言编写程序的缺点是实时性不高,结构不紧凑,编译后占用存储空间比较大,这一点在存储器有限的单片机应用系统中没有优势。因而,单片机的汇编语言不但不会被高级语言完全取代,甚至还将继续占据重要地位。,.,7,4.1.2汇编语言语句的种类和格式汇编语言语句有三种基本类型:指令语句、伪指令语句和宏指令语句。指令语句:每一个指令语句都在汇编时产生一个目标代码,对应着机器的一种操作。例如:MOVA,#0伪指令语句:主要是为汇编语言服务的,在汇编时没有目标代码与之对应。例如:ONEEQU1宏指令语句:用以代替汇编语言源程序中重复使用的程序段的一种语句,由汇编程序在汇编时产生相应的目标代码。,.,8,汇编语言语句的格式指令语句和伪指令语句的格式是类似的。指令语句的格式为:【标号】:助记符(操作码)【操作数】;【注释】伪指令语句的格式:名字定义符参数;注释两种语句都由四个部分组成。其中每一部分称为域也称为字段,各字段之间用一个空格或字段定界符分隔,常用的字段定界符有冒号“:”、逗号“,”和分号“;”。其中方括号括起来的是可选择部分。,.,9,4.280C51汇编语言程序设计,汇编语言程序设计,就是采用汇编指令来编写计算机程序。要对应用中需使用的寄存器、存储单元、I/O端口等先要作出具体安排。在实际编程中,如何正确选择指令、寻址方式和合理使用工作寄存器,包括数据存储器单元,如何对扩展的I/O端口进行操作等,都是基本的汇编语言程序设计技巧。程序结构一般采用以下三种基本控制结构,即顺序结构、分支结构和循环结构来组成,再加上使用广泛的子程序及中断服务子程序,共有五种基本结构。,.,10,4.2.1顺序程序结构,例1两个无符号双字节数相加。设被加数存放于内部RAM的40H(高位字节),41H(低位字节),加数存放于50H(高位字节),51H(低位字节),和数存入40H和41H单元中。,.,11,程序如下:START:CLRC;将Cy清零MOVR0,41H;将被加数地址送数据指针R0MOVR1,51H;将加数地址送数据指针R1AD1:MOVA,R0;被加数低字节的内容送入AADDA,R1;两个低字节相加MOVR0,A;低字节的和存入被加数低字节中DECR0;指向被加数高位字节DECR1;指向加数高位字节MOVA,R0;被加数高位字节送入AADDCA,R1;两个高位字节带Cy相加MOVR0,A;高位字节的和送被加数高位字节RET,.,12,例2将两个半字节数合并成一个一字节数。设内部RAM40H#,41H单元中分别存放着8位二进制数,要求取出两个单元中的低半字节,并成一个字节后,存入50H单元中。程序如下:,START:MOVR1,40H;设置R1为数据指针MOVA,R1;取出第一个单元中的内容ANLA,0FH;取第一个数的低半字节SWAPA;移至高半字节INCR1;修改数据指针XCHA,R1;取第二个单元中的内容ANLA,0FH;取第二个数的低半字节ORLA,R1;拼字MOV50H,A;存放结果RET,.,13,4.2.2分支程序设计,分支结构框图(a)单分支流程;(b)多分支流程,.,14,例3x,y均为8位二进制数,设x存入R0,y存入R1,求解:,.,15,程序如下:START:CJNER0,00H,SUL1;R0中的数与00比较不等转移MOVR1,00H;相等,R10SJMPSUL2SUL1:JCNEG;两数不等,若(R0)0,则R101HSJMPSUL2NEG:MOVR1,0FFH;(R0)0,则R10FFHSUL2:RET,.,16,例4比较两个无符号数的大小。设外部RAM的存储单元ST1和ST2中存放两个不带符号的二进制数,找出其中的大数存入外部RAM中的ST3单元中。,.,17,程序如下:ORG1000HST1EQU2000HST2EQU2100HST3EQU2200HSTART:CLRC;清零CyMOVDPTR,ST1;第一个数的指针MOVXA,DPTR;取第一个数MOVR2,A;保存MOVDPTR,ST2;第二个数的指针MOVXA,DPTR;取第二个数CLRC,.,18,SUBBA,R2;两数比较JNCBIG1;若第二个数大,则转XCHA,R2;第一个数大BIG0:MOVDPTR,ST3MOVXDPTR,A;存大数AJMPBBIG1:MOVXA,DPTR;第二个数大SJMPBIG0,B:RET,.,19,.,20,4.2.3循环程序设计,一、循环程序,.,21,循环程序一般由四个主要部分组成:(1)初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。(2)处理部分:为反复执行的程序段,是循环程序的实体,也是循环程序的主体。(3)循环控制部分:这部分的作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止。(4)结束部分:这部分主要是对循环程序的结果进行分析、处理和存放。,.,22,例5工作单元清零。在应用系统程序设计时,有时经常需要将存储器中各部分地址单元作为工作单元,存放程序执行的中间值或执行结果,工作单元清零工作常常放在程序的初始化部分中。设有50个工作单元,其首址为外部存储器8000H单元,则其工作单元清零程序如下:,.,23,CLEAR:CLRAMOVDPTR,8000H;工作单元首址送指针MOVR2,#50;置循环次数CLEAR1:MOVXDPTR,AINCDPTR;修改指针DJNZR2,CLEAR1;控制循环RET,.,24,例6设在内部RAM的BLOCK单元开始处有长度为LEN的无符号数据块,试编一个求和程序,并将和存入内部RAM的SUM单元(设和不超过8位)。,BLOCKEQU20HLENEQU30HSUMEQU40HSTART:CLRA;清累加器AMOVR2,LEN;数据块长度送R2MOVR1,BLOCK;数据块首址送R1LOOP:ADDA,R1;循环加法INCR1;修改地址指针DJNZR2,LOOP;修改计数器并判断MOVSUM,A;存和RET,.,25,二、多重循环,例710秒延时程序。延时程序与MCS-51执行指令的时间有关,如果使用12MHz晶振,一个机器周期为1s,计算出一条指令以至一个循环所需要的执行时间,给出相应的循环次数,便能达到延时的目的。10秒延时程序如下:DELAY:MOVR5,100DEL0:MOVR6,200DEL1:MOVR7,248NOPDEL2:DJNZR7,DEL2DJNZR6,DEL1DJNZR5,DEL0RET,.,26,上例程序中采用了多重循环程序,即在一个循环体中又包含了其它的循环程序,这种方式是实现延时程序的常用方法。使用多重循环时,必须注意:(1)循环嵌套,必须层次分明,不允许产生内外层循环交叉。(2)外循环可以一层层向内循环进入,结束时由里往外一层层退出。(3)内循环可以直接转入外循环,实现一个循环由多个条件控制的循环结构方式。,.,27,多重循环示意图,.,28,例8设某系统的模数转换器是ADC0809,它的转换结束信号EOC连接到8031的P1.7端,当EOC的状态由低变高时,则结束循环等待,并读取转换值,其程序如下:START:MOVDPTR,addr;0809端口地址送DPTRMOVA,00H;启动0809转换MOVXDPTR,ALOOP:JNBP1.7,LOOP;检测P1.7状态,判是否转换结束MOVXA,DPTR;读取转换结果,.,29,例9在内部RAM中从50H单元开始的连续单元依次存放了一串字符,该字符串以回车符为结束标志,要求测试该字符串的长度。,.,30,ASCII码表,.,31,程序如下:START:MOVR2,0FFHMOVR0,4FH;数据指针R0置初值LOOP:INCR0INCR2CJNER0,0DH,LOOPRET,.,32,4.2.4散转程序设计,散转程序是分支程序的一种,它可根据运算结果或输入数据将程序转入不同的分支。MCS-51指令系统中有一条跳转指令JMPA+DPTR,用它可以很容易地实现散转功能。该指令把累加器的8位无符号数与16位数据指针的内容相加,并把相加的结果装入程序计数器PC,控制程序转向目标地址去执行。此指令的特点在于,转移的目标地址不是在编程或汇编时预先确定的,而是在程序运行过程中动态地确定的。目标地址是以数据指针DPTR的内容为起始的256字节范围内的指定地址,即由DPTR的内容决定分支转移程序的首地址,由累加器A的内容来动态选择其中的某一个分支转移程序。,.,33,JMPA+DPTR,.,34,数据排序程序数据的排序,其算法很多,常用的有插入排序法、冒泡排序法、快速排序法、选择排序法、堆积排序法、二路归并排序法及基数排序法等。冒泡法是一种相邻数互换的排序方法,其过程类似水中气泡上浮。执行时从前向后进行相邻数比较,若数据的大小次序与要求的顺序不符时(逆序),就将二数互换,正序时不交换,假定是升序排序,则通过这种相邻数互换方法,使小数向前移,大数向后移,为此从前向后进行一次冒泡(相邻数互换),就会把最大数换到最后,再进行一次冒泡,就会把次大数排在倒数第二,直至冒泡结束。,应用举例:,.,35,说明:每次冒泡都从向后排定了一个大数(升序),每次冒泡所需进行的比较次数都递减,例如有n个数排序,则第一次冒泡需比较(n-1)次,第二次冒泡则需(n-2)次,依此类推,但实际编程中为了简化程序,往往把各次比较次数都固定为(n-1)次。对于n个数,理论上说应进行(n-1)次冒泡才能完成排序,但实际上往往不到(n-1)次就已排好序。判定排序是否完成的最简单方法是每次冒泡中是否有互换发生,如果有互换发生,说明排序还没完成,否则就表示已排好序,为此控制排序结束常不使用计数方法,而使用设置互换标志的方法,以其状态表示在一次冒泡中有无数据互换进行。,.,36,统计的数值分别存入20H29H中。CLRA;结果单元20H29H清零MOVR0,#10MOVR1,#20HLP:MOVR1,AINCR1DJNZR0,LPMOVR0,#100;100个数的计数器READ:MOVA,P1;读入P1,例10.对从P1口输入的100个09的数进行概率统计。,.,37,CHK0:CJNEA,#0,CHK1;比较,不为“0”,继续比较INC20H;是“0”,则“0”计数单元加1SJMPEND0;是否全部统计完?CHK1:CJNEA,#1,CHK2INC21H;是“1”,则“1”计数单元加1SJMPEND0CHK2:CJNEA,#2,CHK3INC22H;是“2”,则“2”计数单元加1SJMPEND0,.,38,CHK3:CJNEA,#3,CHK4INC23H;是“3”,则“3”计数单元加1SJMPEND0CHK4:CJNEA,#4,CHK5INC24H;是“4”,则“4”计数单元加1SJMPEND0CHK5:CJNEA,#5,CHK6INC25H;是“5”,则“5”计数单元加1SJMPEND0,.,39,CHK6:CJNEA,#6,CHK7INC26H;是“6”,则“6”计数单元加1SJMPEND0CHK7:CJNEA,#7,CHK8INC27H;是“7”,则“7”计数单元加1SJMPEND0,.,40,CHK8:CJNEA,#8,CHK9INC28H;是“8”,则“8”计数单元加1SJMPEND0CHK9:CJNEA,#9,ERRINC29H;是“9”,则“9”计数单元加1END0:DJNZR0,READ;判是否全部统计完?HERE:SJMPHEREERR:;非09,出错,.,41,.,42,4.2.5子程序和参数传递,一、子程序的概念通常把一些基本操作功能编制为程序段作为独立的子程序,以供不同程序或同一程序反复调用。在程序中需要执行这种操作的地方放置一条调用指令,当程序执行到调用指令,就转到子程序中完成规定的操作,并返回到原来的程序继续执行下去。,.,43,二、子程序的调用调用子程序的指令有“ACALL”和“LCALL”,执行调用指令时,先将程序地址指针PC改变(“ACALL”加2,“LCALL”加3),然后PC值压入堆栈,用新的地址值代替。执行返回指令时,再将PC值弹出。子程序调用中,主程序应先把有关的参数存入约定的位置,子程序在执行时,可以从约定的位置取得参数,当子程序执行完,将得到的结果再存入约定的位置,返回主程序后,主程序可以从这些约定的位置上取得需要的结果,这就是参数的传递。,.,44,子程序调用与返回过程示意图,.,45,在汇编语言源程序中使用子程序时,一般要注意两个问题:参数传递和现场保护。1、参数传递一般可采用以下方法:传递数据。将数据通过工作寄存器R0R7或累加器来传送。即主程序和子程序在交接处,上述寄存器和累加器存储的是同一参数。传送地址。数据存放在数据寄存器中,参数传递时只通过R0、R1、DPTR传递数据所存放的地址。通过堆栈传递参数。在调用之前,先把要传送的参数压入堆栈,进入子程序之后,再将压入堆栈的参数弹出到工作寄存器或者其他内存单元。,.,46,2、保护现场与恢复现场在调用子程序时,单片微机只是自动保护断点地址,但由调用程序转入子程序执行时,往往会破坏主程序或调用程序的有关寄存器(如工作寄存器和累加器等)的内容,也很可能破坏程序状态字PSW中的标志位,从而在子程序返回后引起出错。因此,必要时应将这些单元内容保护起来,即保护现场。对于PSW、A、B等可通过压栈指令进栈保护。工作寄存器采用选择不同工作寄存器组的方式来达到保护的目的。一般主程序选用工作寄存器组0,而子程序选用工作寄存器的其它组。当子程序执行完后,即返回主程序时,应先将上述内容送回到来时的寄存器中去,这后一过程称为恢复现场。对于PSW、A、B等内容可通过弹栈指令来恢复。在编写子程序时,还应注意保护(压栈)和恢复(弹出)的顺序,即先压入者后弹出。,.,47,【例11】单字节二进制数据转换为BCD码子程序SBTOD。功能:将单字节二进制数转换为三位BCD码。入口:R2中存放要转换的二进制数。出口:(R0)给出百位BCD码的存放地址。(R0)+1给出十位和个位BCD码的存放地址,高半字节放十位,低半字节放个位。占用寄存器:A,B,R0,R2。A累加器的内容不受影响。,.,48,.,49,【例12】求两个无符号数据块中的最大值。数据块的首地址分别为60H和70H,每个数据块的第一个字节都存放数据块的长度,结果存入5FH单元。解本例可采用分别求出两个数据块的最大值,然后比较其大小的方法,求最大值的过程可采用子程序。子程序名称:QMAX。子程序入口条件:R1中存有数据块首地址。出口条件:最大值在A中。下面分别编写主程序和子程序。,.,50,主程序:,.,51,子程序:,.,52,三、子程序设计子程序的调用与返回MCS-51单片机有两条子程序调用指令:ACALLaddr11、LCALLaddr16;一条子程序返回指令RET。保存与恢复寄存器内容例如:SUB1:PUSHPSWPUSHAPUSHR6(此处省略了子程序的内容)POPR6POPAPUSHPSW,.,53,【例13】编程计算编程说明:这个问题中,计算某数的平方可以用子程序来实现,两次调用该子程序,并求和便得到所需结果。设a、b分别存于内部RAM的30H、31H单元,结果C存于内部RAM的40H单元。,.,54,参数传递:主程序中,将某数存放到累加器A中,作为子程序的入口参数;子程序中,将所求数的平方值存放在累加器A中,作为出口参数(即主程序的返回值)。子程序的入口参数:A中存放某数的值。子程序的出口参数:A中存放所求数的平方。子程序如下:SQR:INCAMOVCA,A+PC;查平方表RETTABLE:DB0,1,4,9,16DB25,36,49,64,81,.,55,.,56,主程序如下:START:MOVA,30HACALLSQR;调查表子程序MOVR1,A;a2暂存R1中MOVA,31HACALLSQR;调查表子程序ADDA,R1MOV40H,AEND,.,57,4.2.6查表程序设计,查表程序是一种常用程序,它广泛使用于LED显示控制、打印机打印控制、数据补偿、数值计算、转换等功能程序中,这类程序具有简单、执行速度快等特点。所谓查表法,就是预先将满足一定精度要求的表示变量与函数值之间关系的一张表求出,然后把这张表存于单片机的程序存储器中,这时自变量值为单元地址,相应的函数值为该地址单元中的内容。查表,就是根据变量X在表格中查找对应的函数值Y,使Y=f(X)。,.,58,MCS-51指令系统中,有两条查表指令:MOVCA,A+PCMOVCA,A+DPTR,.,59,例13一个十六进制数存放在内部RAM的HEX单元的低4位中,将其转换成ASCII码并送回HEX单元。,.,60,ORG1000HHEXASC:MOVA,HEXANLA,0FHADDA,3;修改指针MOVCA,A+PCMOVHEX,ARET,十六进制09的ASCII码为30H39H,AF的ASCII码为41H46H,ASCII码表格的首地址为ASCTAB。编程如下:,ASCTAB:DB30H,31H,32H,33H,34HDB35H,36H,37H,38H,39HDB41H,42H,43H,44H,45HDB46H在这个程序中,查表指令MOVCA,A+PC到表格首地址有两条指令,占用3个字节地址空间,故修改指针应加3。,.,61,例14设有一个巡回检测报警装置,需对96路输入进行控制,每路有一个额定的最大值,是双字节数。当检测量大于该路对应的最大值时,就越限报警。假设R2为保存检测路数的寄存器,查找最大额定值,将其对应的最大额定值存放于31H和32H单元中。的程序如下:,FMAX:MOVA,R2ADDA,R2;表中一个额定值为2个字节MOV31H,AMOVDPTR,TAB;表首址,.,62,MOVCA,A+DPTR;查表读取第一个字节XCHA,31H;第一个字节内容存入31HINCDPTRMOVCA,A+DPTR;查表读取第二个字节MOV32H,A;第二字节的内容存入32HTAB:DW1230H,1450H,.DW2230H,2440H,.DW3120H,3300H,.,.,63,4.2.7数制转换,例15将一个字节二进制数转换成3位非压缩型BCD码。设一个字节二进制数在内部RAM40H单元,转换结果放入内部RAM50H,51H,52H单元中(高位在前),程序如下:,HEXBCD:MOVA,40HMOVB,100DIVABMOV50H,AMOVA,10XCHA,BDIVABMOV51H,AMOV52H,BRET,.,64,4.2.8运算程序,一、加、减法程序,例16将40H开始存放的10个字节的数与50H开始存放的10个字节的数相减(假设被减数大于减数)。设被减数指针为R0,减数指针为R1,差数放回被减数单元,R5存放字节个数,则程序如下:,.,65,SUB:MOVR0,40HMOVR1,50HMOVR5,10CLRCSUB1:MOVA,R0SUBBA,R1MOVR0,AINCR0INCR1DJNZR5,SUB1RET,.,66,二、乘法运算程序在计算机中,常将乘法采用移位和加法来实现。例19将(R2R3)和(R6R7)中双字节无符号数相乘,结果存入R4R5R6R7。此乘法可以采用部分积右移的方法来实现,其程序框图如图4.6所示,程序如下:,NMUL:MOVR4,0;初始化MOVR5,0CLRCMOVR0,16,.,67,NMUL1:MOVA,R4;CyR4R5R6R7右移一位RRCAMOVR4,AMOVA,R5RRCAMOVR5,AMOVA,R6RRCAMOVR6,AMOVA,R7RRCMOVR7,AJNCNMUL2;C为移出乘数的最低位MOVA,R5;(R4R5)+(R6F7)(R4R5),.,68,ADDA,R3MOVR5,AMOVA,R4ADDCA,R2MOVR4,ANMUL2:DJNZR0,NMUL1;循环16位MOVA,R4;最后结果再移一位RRCAMOVR4,AMOVA,R5RRCAMOVR5,AMOVA,R6,.,69,RRCAMOVR6,AMOVA,R7RRCAMOVR7,ARET,.,70,图4.6NMUL程序框图,.,71,例20假定被乘数在(R4R3)中,乘数放在R2中,乘积放在R7R6和R5中。MCS-51中有8位数的乘法指令MUL,用它来实现多字节乘法时,可表示为(R4R3)(R2)=(R4)28+(R3)(R2)=(R4)(R2)28
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电竞公司滞销周边处置细则
- 旅行社电子商务平台建设方案
- 中级银行从业资格之中级银行业法律法规与综合能力综合检测模拟卷含完整答案详解(全优)
- 机械行业智能制造与生产线升级维护方案
- 环保行业废气治理技术解决方案
- 纳米药物盆腔肿瘤治疗-洞察及研究
- 2026届山西省忻州市静乐县第一中学化学高一第一学期期末调研试题含解析
- 教育培训机构运营管理手册
- 湖北省部分重点高中2026届化学高二上期末质量检测模拟试题含答案
- (2025年标准)关于售房协议书
- (2025年标准)动火安全协议书
- 2026届广州市高三年级阶段训练(8月市调研摸底) 数学试卷(含答案解析)
- 动物防疫检疫试题(附答案)
- 沙石码头经营方案(3篇)
- 2025年粉笔辅警考试题库
- 2025个人房屋租赁合同范本下载
- 残疾人家庭无障碍改造投标方案(技术标)
- 项目经理带班检查记录表(每周一次)
- 人卫九诊断学发热
- 《特困人员集中供养服务协议》
- 说明书hid500系列变频调速器使用说明书s1.1(1)
评论
0/150
提交评论