C51的汇编语言程序设计.ppt

上传人:max****ui 文档编号:3402923 上传时间:2019-12-13 格式:PPT 页数:66 大小:680KB
返回 下载 相关 举报
C51的汇编语言程序设计.ppt_第1页
第1页 / 共66页
C51的汇编语言程序设计.ppt_第2页
第2页 / 共66页
C51的汇编语言程序设计.ppt_第3页
第3页 / 共66页
点击查看更多>>
资源描述
第5章80C51的汇编语言程序设计,一个完整的单片机应用系统是合理的硬件与完善的软件的有机组合,二者缺一不可。所谓的软件设计就是指程序的设计。程序实际上是一系列计算机指令的有序集合。我们把利用计算机的指令系统来合理地编写出解决某个问题的程序的过程,称之为程序设计。,5.1程序编制的方法和技巧,本章主要介绍:,5.3基本程序结构,5.2源程序的编辑和汇编,5.4常用程序举例,5.5简单I/O设备的并口直接驱动示例,目前,80C51程序设计主要采用以下两种语言:,二、高级语言,对系统的功能描述与实现比用汇编语言简单,程序的阅读、修改和移植比较方便,适合于编写复杂些的程序。,一、汇编语言,生成的目标程序占存储空间少、运行速度快,具有效率高、实时性强的优点,适合于编写短小高速的程序。,汇编语言是面向机器的,对单片机的硬件资源操作直接、概念清晰,对于掌握单片机的硬件结构非常有益,本章仅对汇编语言进行介绍。,5.1程序编制的方法和技巧5.1.1程序编制的步骤,一、任务的分析,首先,明确系统的设计任务、功能要求和技术指标。其次,要对系统的硬件资源和工作环境进行分析。,二、建立思路,确定算法算法是解决具体问题的方法。应用系统经过分析、研究和明确规定后,对应实现的功能和技术指标可以利用严密的数学方法或数学模型来描述,从而把实际问题转化成由计算机进行处理的问题。,三、程序总体设计及流程图绘制,进行程序的总体构思,确定程序的结构和数据形式,并考虑资源的分配和参数的计算,然后勾画出程序流程图。流程图可以分为总流程图和局部流程图。总流程图侧重反映程序的逻辑结构和各程序模块之间的相互关系。局部流程图反映程序模块的具体实施细节。当程序较为复杂时,绘制流程图是一个良好的编程习惯。,常用的流程图符号有:开始和结束符号、工作任务符号、判断分支符号、程序连接符号、程序流向符号等。,5.1.2编制程序的方法和技巧,一、采用模块化程序设计方法,应用系统的程序由包含多个模块的主程序和各种子程序组成。各程序模块都要完成一个明确的任务,实现某个具体的功能。,优点:把一个多功能的复杂的程序划分为若干个简单的、功能单一的程序模块,有利于程序的设计和调试,有利于程序的优化和分工,提高了程序的阅读性和可靠性,使程序的结构层次一目了然。,二、尽量采用循环结构和子程序,采用循环结构和子程序可以使程序的长度减少、占用内存空间减少。,多重循环,注意各重循环的初值和循环结束条件,避免出现“死循环”现象;,通用的子程序,除了用于存放子程序入口参数的寄存器外,子程序中用到的其它寄存器的内容应压入堆栈进行现场保护,并要特别注意堆栈操作的压入和弹出的平衡;,中断处理子程序除了要保护程序中用到的寄存器外,还应保护标志寄存器。,5.1.3汇编语言的语句种类及指令格式,一、汇编语言语句的种类:,指令语句:每一个指令语句都在汇编时产生一个目标代码,对应着机器的一种操作。伪指令语句:伪指令语句是一种说明语句,主要是为汇编程序服务的,在汇编时没有目标代码与这对应,没有对应的机器操作。宏指令语句:用以代替汇编语言源程序中重复使用的程序段而设置的一种语句,由汇编程序在汇编时产生相应的目标代码。,二、汇编语言的语句格式,指令语句的格式:标号:操作码(助记符)操作数(参数);注释伪指令语句格式:标号:定义符参数;注释例LOOP:MOVA,#0FFH;AFFH,一、标号,标号是语句地址的标志符号。由18个ASCII字符组成。第一个字符必须是字母,其余字符可以是字母、数字或其他特定字符;不能使用已经定义了的符号作为标号。如指令助记符、寄存器符号名称等;后边必须跟冒号。二、操作码操作码用于规定语句执行的操作。它是汇编语句中唯一不能空缺的部分。它由指令助记符表示。,三、操作数,操作数用于给指令的操作提供数据或地址。各操作数间以逗号分隔。操作数字段的内容可能包括以下几种情况:,(1)工作寄存器名;(2)特殊功能寄存器名;(3)标号名;(4)常数;(5)符号“$”,表示程序计数器PC的当前值;(6)表达式。,四、注释注释只是对语句的说明,必须以分号“;”开头,长度不限,换行时在开头使用分号“;”。五、数据的表示形式二进制数,末尾以字母B标识。如:10001111B;十进制数,末尾以字母D标识或将字母D省略。如:88D,66;十六进制数,末尾以字母H标识。如:78H,0A8H(但应注意的是,以字母AF开头时应在其前面加上数字“0”。);ASCII码,以单引号括起来标识。如:AB,1245,三、常用伪指令伪指令是汇编程序能够识别并对汇编过程进行某种控制的汇编命令。它不是单片机执行的指令,所以没有对应的可执行目标码,汇编后产生的目标程序中不会再出现伪指令。1、起始地址设定伪指令格式:ORG表达式功能:向汇编程序说明下面紧接的程序段或数据段存放的起始地址。表达式通常为16进制地址,也可以是已定义的标号地址。,例如:ORG1000HMAIN:MOVDPTR,#3000H在每一个汇编语言源程序的开始,都要设置一条ORG伪指令来指定该程序在存储器中存放的起始位置。若省略ORG伪指令,则该程序段从0000H单元开始存放。在一个源程序中,可以多次使用ORG伪指令规定不同程序段或数据段存放的起始地址,但要求地址值由小到大依序排列,不允许空间重叠。,2、汇编结束伪指令END格式:END功能:结束汇编,在整个程序中只能出现一次。3、字节数据定义伪指令DB(DefineByte)格式:标号:DB字节数据表功能:从标号指定的地址开始,在ROM中定义字节数据。将字节数据表中的数据根据从左到右的顺序依次存放在指定的存储单元中。一个数据占一个存储单元。,例:ORG1000HMAIN:MOVDPTR,#TABMOVA,#01HMOVCA,A+DPTRTAB:DB01H,02H,03H,04H,05HEND,4、字数据定义伪指令格式:标号:DW字常数表DW定义一个字。将字或字表中的数据根据从左到右的顺序依次存放在指定的存储单元中。例如:ORG1000HTAB:DW1234H,19,FFH汇编结果为:(1000H)=12H,(1001H)=34H(1002H)=00H,(1003H)=13H(1004H)=00H,(1005H)=FFH,5、空间定义伪指令DS格式:标号:DS表达式功能是从标号指定的地址单元开始,在程序存储器中保留由表达式所指定的个数的存储单元作为备用的空间,并都填以零值。例如:ORG1000HBUF:DS10汇编结果:从地址1000H开始保留10个存储单元作为备用单元。,6、定义常值为符号名伪指令EQU格式:符号名EQU常值表达式将表达式的常值或特定的某个汇编符号定义为一个指定的符号名。汇编器在汇编过程中会把源程序中每个出现该符号的位置均用同EQU定义的数据或汇编符号来取代。注意,这里的标号后不能加“:”,EQU伪指令中的字符名必须先赋值后才能使用,故该语句通常放在源程序的开头。例如:ORG1000HCH1EQU#50HMOVA,CH1;A(50H),相当于MOVA,50HEND,7、位地址符号定义伪指令BIT格式:符号名BIT位地址表达式功能:将位地址赋给指定的符号名。其中,位地址表达式可以是绝对地址,也可以是符号地址。例如:X1BITP1.0将P1.0的位地址赋给符号名X1,在其后的编程中就可以用X1来代替P1.0。,5.2源程序的编辑和汇编,一、源程序的编辑编辑好的源程序应以“.ASM”扩展名存盘,以备汇编程序调用。二、源程序的汇编将汇编语言源程序转换为单片机能执行的机器码形式的目标程序的过程叫汇编。手工汇编:通过手工方式查指令编码表,逐个把助记符指令翻译成机器码,然后把得到的机器码程序(以十六进制形式)键入到单片机开发机中,并进行调试。,5.2.1源程序的编辑与汇编,机器汇编:是PC机上,使用交叉汇编程序将汇编语言源程序转换为机器码形式的目标程序。生成的目标程序由PC机传送到开发机上,经调试无误后,再固化到单片机的程序存储器ROM中。源程序经过机器汇编后,形成的若干文件中含有两个主要文件:列表文件(.LST)目标代码文件(.OBJ),5.3汇编语言程序设计和基本程序结构,5.3.1顺序程序设计顺序程序是指计算机按指令在程序在存储器中存放的先后次序来顺序执行。它是无分支结构、无循环结构、也不调用子程序,这类程序大量采用了数据传送指令。顺序结构虽然简单明了,但程序所占的程序存储器空间比例较大。因此,顺序程序设计的好坏会涉及整个程序的效率。一个好的顺序程序段,应该尽可能使其占用的空间少,执行速度快。,ORG0000HLJMPMAINORG0050HMAIN:MOVDPTR,#1000HMOVXA,DPTRMOVR0,AINCDPTRMOVXA,DPTRANLA,R0MOV30H,ASJMP$END,例:从片外数据存储器1000H、1001H地址单元中的数据作“与”运算,并把结果放到片内30H单元中。,4.3.2分支程序,有单分支、双分支和多分支几种情况:,一、双分支程序例:比较两个无符号数大小,设两个无符号数分别存放在内部RAM的30H和31H单元中,比较大小后把大数存到32H中。ORG0000HMAIN:CLRC;保证前面的操作不会对后面结果有影响MOVA,30H;取30H单元的数据到累加器中SUBBA,31H;(30H)-(31H),两数大小比较JCDATA2;条件判断MOV32H,30H;30H单元中的数大SJMPWAITDATA2:MOV32H,31H;31H单元中的数大WAIT:SJMP$END,单分支程序流程图,单分支程序例:比较两个无符号数大小,设两个无符号数分别存放在内部RAM的30H和31H单元中,如果30H中的数大则将30H和31H单元的差存到32H中。ORG0000HMAIN:CLRC;保证前面的操作不会对后面结果有影响MOVA,30H;取30H单元的数据到累加器中SUBBA,31H;(30H)-(31H),两数大小比较JCWAIT;条件判断MOV32H,A;30H单元中的数大WAIT:SJMP$END,二、多分支程序例:利用散转指令编写程序,根据30H单元中变量X的内容转入相应的分支。X=0时执行Y=X+2;X=1时执行Y=X-2;X=2时执行Y=X*2。并将结果存入31H单元中。,ORG0000HLJMPMAINORG1000HMAIN:MOVA,30HMOVDPTR,#TABRLAJMPA+DPTRWAIT:SJMP$TAB:AJMPX0AJMPX1AJMPX2,X0:ADDA,#2MOV31H,ALJMPWAITX1:CLRCSUBBA,#2MOV31H,ALJMPWAITX2:RLAMOV31H,ALJMPWAITEND,5.3.3循环程序由4个部分组成:1、循环初始化2、循环体3、循环调整4、循环条件判断按某种控制规律重复执行的程序称为循环程序。循环程序有先执行后判断和先判断后执行两种基本结构。,循环程序又分单循环程序和多重循环程序。1单循环程序例:编写程序,实现内部RAM30H单元开始的20个单元全部清0。ORG0000HLJMPMAINORG1000HMAIN:MOVR1,#30H;地址指针赋初值MOVR3,#20;循环次数LOOP:MOVR1,#0;相应地址单元清0INCR1;地址指针加1DJNZR3,LOOP;判断循环是否结束SJMP$END,2多重循环程序例:编写程序,利用软件实现100ms的延时。假设使用12MHz晶振。ORG0000HLJMPDELAYORG1000HDELAY:MOVR7,#250;外循环次数DELAY1:MOVR6,#200;内循环次数DELAY2:DJNZR6,DELAY2;内循环时间200*2=400usDJNZR7,DELAY1;外循环时间0.4ms*250=100msSJMP$END注意:本程序的精确延时还要算上其它一些指令周期,精确延时时间为:1+250*(1+400+2)=100.751ms。,5.3.4子程序及其调用,一、子程序的调用将其设计成通用的子程序供随时调用。子程序主要特点:在执行过程中需要由其它程序来调用,执行完后又需要把执行流程返回到调用该子程序的主程序。子程序调用时要注意两点:1.现场的保护和恢复;2.是主程序与子程序的参数传递。,二、现场保护与恢复在子程序执行过程中常常要用到单片机的一些通用单元,如工作寄存器R0R7、累加器A、数据指针DPTR,以及有关标志和状态等。而这些单元中的内容在调用结束后的主程序中仍有用,所以需要进行保护,称为现场保护。,在执行完子程序,返回继续执行主程序前恢复其原内容,称为现场恢复。保护与恢复的方法有以下两种:在主程序中实现;在子程序中实现。,1.在主程序中实现示例如下:PUSHPSW;保护现场PUSHACCPUSHBMOVPSW,#10H;换当前工作寄存器组LCALLaddr16;子程序调用POPB;恢复现场POPACCPOPPSW其特点是结构灵活。,2.在子程序中实现SUB1:PUSHPSW;保护现场PUSHACCPUSHBMOVPSW,#10H;换当前工作寄存器组POPB;恢复现场POPACCPOPPSWRET其特点是程序规范、清晰。注意,无论哪种方法保护与恢复的顺序要对应。,三、参数传递1、利用累加器或寄存器例:实现c=a2+b2。设a,b,c分别存于内部RAM的30H,31H,32H三个单元中。ORGOOOOHLJMPMAINORG0100HMAIN:MOVSP,#3FH;设置堆栈指针START:MOVA,30H;取aACALLSQR;调用查平方表MOVR1,A;a2暂存于R1中MOVA,31H;取bACALLSQR;调用查平方表ADDA,R1;a2+b2存于A中MOV32H,A;存结果SJMP$SQR:MOVDPTR,#TAB;子程序MOVCA,A+DPTR;RETTAB:DB0,1,4,9,16,25,36,49,64,81END,2、利用存储器当传送的数据量比较大时,可以利用存储器实现参数的传递。在这种方式中,事先要建立一个参数表,用指针指示参数表所在的位置。当参数表建立在内部RAM时,用R0或R1作参数表的指针。当参数表建立在外部RAM时,用DPTR作参数表的指针。例:将R0和R1指向的内部RAM中两个3字节无符号整数相加,结果送到由R0指向的内部RAM中。入口:R0和R1分别指向加数和被加数的低位字节;出口:R0指向结果的高位字节。低字节在高地址,高字节在低地址。,NADD:MOVR7,#3;三字节加法CLRCNADD1:MOVA,R0;取加数低字节ADDCA,R1;被加数低字节加AMOVR0,ADECR0DECR1DJNZR7,NADD1INCR0RET,3、利用堆栈利用堆栈传递参数是在子程序嵌套中常采用的一种方法。在调用子程序前,用PUSH指令将子程序中所需数据压入堆栈,进入执行子程序时,再用POP指令从堆栈中弹出数据。,例:把内部RAM中20H单元中的1个字节十六进制数转换为2位ASCII码,存放在31H和32H两个单元中。分析:十六进制数09的ASCII码为30H39H,即十六进制数(09)=ASCII码-30H;十六进制数AF的ASCII码为41H46H,即十六进制数(AF)=ASCII-37H。根据此对应关系。,主程序:ORG0000HLJMPMAINORG0090HMAIN:MOVSP,#7FH;设置堆栈指针PUSH20HLCALLSBU;调用子函数POP31HMOVA,20HSWAPAPUSHACCLCALLSBUPOP32HSJMP$,子程序:SBU:DECSPDECSPPOPACCANLA,#0FHMOVDPTR,#TABMOVCA,A+DPTRPUSHACCINCSPINCSPRETTAB:DB30H,031H,032H,033H,034H,035H,036H,037HDB038H,039H,041H,042H,043H,044H,045H,046HEND,一般说来:当相互传递的数据较少时,采用寄存器传递方式可以获得较快的传递速度;当相互传递的数据较多时,宜采用存储器或堆栈方式传递;如果是子程序嵌套时,最好是采用堆栈方式。,5.4常用程序举例,5.4.1算术运算程序一、多字节数的加、减运算80C51单片机的指令系统提供的是字节运算指令,所以在处理多字节数的加减运算时,要合理地运用进位(借位)标志。,例:多字节无符号数的加法。,ORG0000HLJMPMAINORG1000HMAIN:MOVR0,#30HMOVR1,#40HMOVR7,#3;相加的字节数CLRCLOOP:MOVA,R0ADDCA,R1;求和MOVR1,A;保存结果INCR0;修改指针INCR1DJNZR7,LOOPSJMP$END,例:多字节无符号数的减法。设两个N字节的无符号数分别存放在内部RAM中以DATA1和DATA2开始的单元中。相减后的结果要求存放在DATA2数据区。MOVR0,#DATA1;MOVR1,#DATA2;MOVR7,#N;置字节数CLRCLOOP:MOVA,R0SUBBA,R1;求差MOVR1,A;存结果INCR0;修改指针INCR1DJNZR7,LOOP,一、十六进制数与ASCII码间的转换当十六进制数在09之间时,其对应的ASCII码值为该十六进制数加30H;当十六进制数在AF之间时,其对应的ASCII码值为该十六进制数加37H。,5.4.2码型转换,例将1位十六进制数转换成相应的ASCII码。设十六进制数存放在R0中,转换后的ASCII码存放于R2中。HASC:MOVA,R0;取4位二进制数ANLA,#0FH;屏蔽掉高4位PUSHACC;4位二进制数入栈CLRC;清进(借)位位SUBBA,#0AH;用借位位的状态判断该数在09还是AF之间POPACC;弹出原4位二进制数JCLOOP;借位位为1,跳转至LOOPADDA,#07H;借位位为0,该数在AF之间,加37HLOOP:ADDA,#30H;该数在09之间,加30HMOVR2,A;ASCII码存于R2RET,例将多位十六进制数转换成ASCII码。设地址指针R0指向十六进制数低位,R2中存放字节数,转换后地址指针R0指向十六进制数的高位。R1指向要存放的ASCII码的高位地址。,HTASC:MOVA,R0;取低4位二进制数ANLA,#0FHMOVDPTR,#ASCTAB;表起始地址MOVCA,A+DPTR;查表MOVR1,A;存ASCII码INCR1MOVA,R0;取十六进制高4位SWAPAANLA,#0FHMOVDPTR,#ASCTAB;表起始地址MOVCA,A+DPTR;查表MOVR1,AINCR0;指向下一单元INCR1;DJNZR2,HTASC;字节数存于R2RETASCTAB:DB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46H,二、BCD码与二进制数之间的转换在计算机中,十进制数要用BCD码来表示。通常,用四位二进制数表示一位BCD码,用1个字节表示2位BCD码(称为压缩型BCD码)。例:双字节二进制数转换成BCD码。设(R2R3)为双字节二进制数,(R4R5R6)为转换完的压缩型BCD码。十进制数B与一个8位的二进制数的关系可以表示为:只要依十进制运算法则,将bi(i7,6,1,0)按权相加,就可以得到对应的十进制数B。(逐次得到:b720;b721b620;b722b621b520;)。,DCDTH:CLRAMOVR4,A;R4清0MOVR5,A;R5清0MOVR6,A;R6清0MOVR7,#16;计数初值LOOP:CLRC;MOVA,R3RLCAMOVR3,A;R3左移一位并送回MOVA,R2RLCAMOVR2,A;R2左移一位并送回,MOVA,R6ADDCA,R6DAAMOVR6,A;(R6)乘2并调整后送回MOVA,R5ADDCA,R5DAAMOVR5,A;(R5)乘2并调整后送回MOVA,R4ADDCA,R4DAAMOVR4,A;(R4)乘2并调整后送回DJNZR7,LOOP,5.4.3IO操作例:编制一个循环闪烁灯程序.设51单片机的P1口作为输出口,经驱动电路74LS240(8反相三态缓冲驱动器)接8只发光二极管。当输出位为“1”时,发光二极管点亮,“0”时为暗。编程实现:每个灯闪烁点亮5次,再转移到下一个灯闪烁点亮5次,一直循环下去。(DELAYY1S为延时1秒子程序),ORG0000HLJMPMAINORG0100HMAIN:CLRCMOVA,#01H;为LED灯赋值,低位先亮FLASH:MOVR2,#5;闪烁次数LOOP:MOVP1,A;LED亮LCALLDELAYY1S;延时1sMOVP1,#00H;LED灭LCALLDELAYY1S;延时1sDJNZR2,LOOP;闪烁5次RLCA;左移一位SJMPFLASH;不断循环END,5.5简单I/O设备的并口直接驱动示例5.5.1独立式键盘与LED显示示例例:数据端与P0口正序连接。编写程序,分别实现功能:上电后数码管显示“P”,按下任何键后,显示从“0”开始每隔1秒加1,加至“F”后,数码管显示“P”,进入等待按键状态。,TEMPEQU30HORG0000HJMPSTARTORG0100HSTART:MOVSP,#5FHMOVP0,#8CH;显示PMOVP3,#0FFHNOKEY:MOVA,P3CPLAJZNOKEY;无键按下MOVTEMP,P3;有键按下,CALLD10msMOVA,P3CJNEA,TEMP,NOKEY;去抖MOVR7,#16MOVR2,#0LOOP:MOVA,R2MOVDPTR,#CODE_P0MOVCA,A+DPTRMOVP0,A,INCR2SETBRS0;切换组CALLD_1SCLRRS0DJNZR7,LOOPJMPSTARTD_1S:(子程序)D10ms:(子程序)CODE_P0:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8HDB80H,90H,88H,83H,0C6H,0A1H,86H,8EH,有时为方便走线而采用逆序连接,显示段码要进行调整:CODE_P2:DB03H,9FH,25H,0DH,99H,49H,40H,1FHDB01H,09H,11H,0C1H,63H,85H,61H,71H,本章小结目前,80C51单片机的程序设计主要采用两种语言,一种是汇编语言,另一种是高级语言(如C51)。虽然高级语言的应用越来越来广泛,但是汇编语言还是有它存在的意义,它们都有各自的优缺点。汇编语言生成的目标程序占存储空间少、运行速度快,具有效率高、实时性强的优点,适合于编写短小高速的程序。采用高级语言进行程序设计,对系统的功能描述与实现比用汇编语言简单,程序的阅读、修改和移植比较方便,适合于编写复杂些的程序。,汇编语言是面向机器的,对单片机的硬件资源操作直接、概念清晰,在中小规模应用软件中广泛应用。尽管对编程人员的硬件知识要求比较高,但对于掌握单片机的硬件结构非常有益。本章对用介绍了程序编制的方法和技巧和源程序中用到的一些伪指令,重点介绍了用汇编语言对分支、循环、子程序及按键、LED显示程序的设计。,END,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!