《第4章汇编语言程序设计及编程实例1》由会员分享,可在线阅读,更多相关《第4章汇编语言程序设计及编程实例1(100页珍藏版)》请在金锄头文库上搜索。
1、第四章第四章 汇编语言程序设计及知识汇编语言程序设计及知识4.1 4.1 编程的步骤、方法和技巧编程的步骤、方法和技巧4.2 4.2 汇编语言源程序的编辑和汇编汇编语言源程序的编辑和汇编4. 3 汇编语言程序的基本结构汇编语言程序的基本结构4.1 编程的步骤、方法和技巧4.1.1 4.1.1 编程的步骤编程的步骤4.1.2 4.1.2 编程的方法和技巧编程的方法和技巧4.1.1 编程的步骤n一、分析问题一、分析问题n二、确定算法二、确定算法n三、画程序流程图三、画程序流程图n四、编写程序四、编写程序一、分析问题一、分析问题n对需要解决的问题进行分析,以求对问题由正确的对需要解决的问题进行分析,
2、以求对问题由正确的理解。如,理解。如,n解决问题的任务是什么?解决问题的任务是什么?n工作过程?工作过程?n现有的条件,已知数据,对运算的精度和速度方面现有的条件,已知数据,对运算的精度和速度方面的要求?的要求?n设计的硬件结构是否方便编程?设计的硬件结构是否方便编程?二、确定算法二、确定算法n算法算法是如何将实际问题转化成是如何将实际问题转化成程序模块程序模块来处理。来处理。n在编程以前,先要对几种不同的算法进行分析、比在编程以前,先要对几种不同的算法进行分析、比较,找出最适宜的算法较,找出最适宜的算法三、画程序流程图三、画程序流程图n程序流程图是使用各种图形、符号、有向线段等来说明程序程序
3、流程图是使用各种图形、符号、有向线段等来说明程序设计过程的一种直观的表示。设计过程的一种直观的表示。n流程图步骤分得越细致,编写程序是也越方便。流程图步骤分得越细致,编写程序是也越方便。n画流程图是程序结构设计是采用的一种重要手段。画流程图是程序结构设计是采用的一种重要手段。n一个系统软件有总的流程图(主程序框图)和局部的流程图。一个系统软件有总的流程图(主程序框图)和局部的流程图。n流程图常采用的图形和符号。流程图常采用的图形和符号。椭圆框椭圆框或桶形框或桶形框:表示程序的开始或结束。矩形框矩形框:表示要进行的工作。:表示要进行的工作。菱形框菱形框:表示要判断的事情,菱形框内:表示要判断的事
4、情,菱形框内的表达式表示要判断的内容。的表达式表示要判断的内容。圆圈圆圈:表示连接点:表示连接点指向线指向线:表示程序的流向:表示程序的流向四、编写程序四、编写程序n用用89C51汇编语言编写的源程序行(一条语句)包括汇编语言编写的源程序行(一条语句)包括四个部分,也叫四个字段:四个部分,也叫四个字段:标号标号:操作码操作码操作数操作数;注释注释n 每个字段之间要用分隔符分隔,而每个字段内部不能使用分每个字段之间要用分隔符分隔,而每个字段内部不能使用分隔符。可以用作分隔符的符号:空格隔符。可以用作分隔符的符号:空格“ ”、冒号、冒号“:”、逗号逗号“,”、分号、分号“;”等。等。例:例:LOO
5、P:MOV A,#00H;立即数;立即数00HA标号标号n标号标号是用户定义的是用户定义的符号地址符号地址。n一条指令的标号是该条指令的符号名字,标号的值是汇编这一条指令的标号是该条指令的符号名字,标号的值是汇编这条指令时指令的地址。条指令时指令的地址。n标号由标号由以英文字母开始以英文字母开始的的18个个字母字母或或数字数字组成,以组成,以冒号冒号“:”结尾。结尾。n标号可以由赋值伪指令赋值,如果没有赋值,汇编程序把存标号可以由赋值伪指令赋值,如果没有赋值,汇编程序把存放该指令目标码第一字节的存储单元的地址赋给该标号,所放该指令目标码第一字节的存储单元的地址赋给该标号,所以,标号又叫指令标号
6、。以,标号又叫指令标号。操作码操作码n操作码操作码是必不可少的。是必不可少的。n它用一组字母符号表示指令的操作码。在它用一组字母符号表示指令的操作码。在89C51中,中,由由89C51的的指令助记符指令助记符组成。组成。操作数操作数n汇编语言指令可能要求或不要求操作数,所以这一字段可能有也可能没汇编语言指令可能要求或不要求操作数,所以这一字段可能有也可能没有。有。n若有两个操作数,操作数之间用逗号若有两个操作数,操作数之间用逗号“,”分开。分开。n操作数包括的内容有:操作数包括的内容有:n(1)工作寄存器:由)工作寄存器:由PSW.3和和PSW.4规定的当前工作寄存器区中的规定的当前工作寄存器
7、区中的R0R7。n(2)特殊功能寄存器:)特殊功能寄存器:21个个SFR的名字。的名字。n(3)标号名:赋值标号)标号名:赋值标号由汇编指令由汇编指令EQU等赋值的标号;指令标号等赋值的标号;指令标号指指令标号指示的指令的第一字节地址是该标号的值。令标号指示的指令的第一字节地址是该标号的值。n(4)常数:可用二进制()常数:可用二进制(B)、十进制、十六进制()、十进制、十六进制(H),若常数以字),若常数以字符开头,前面加符开头,前面加0。n(5)$:用来表示程序计数器的当前值。:用来表示程序计数器的当前值。n(6)表达式:汇编时,计算出表达式的值填入目标码。)表达式:汇编时,计算出表达式的
8、值填入目标码。注释注释n注释部分不是汇编语言的功能部分注释部分不是汇编语言的功能部分,只是用语增加,只是用语增加程序的可读性。程序的可读性。n良好的注释是汇编语言程序编写中的重要组成部分。良好的注释是汇编语言程序编写中的重要组成部分。4.1.2 编程的方法和技巧一、模块化的程序设计方法一、模块化的程序设计方法二、编程技巧二、编程技巧一、模块化的程序设计方法一、模块化的程序设计方法1、程序功能模块化的优点、程序功能模块化的优点2、划分模块的原则、划分模块的原则1、程序功能模块化的优点、程序功能模块化的优点n单个模块结构的程序功能单一,易于编写、调试和修改。单个模块结构的程序功能单一,易于编写、调
9、试和修改。n便于分工,从而可使多个程序员同时进行程序的编写和调试便于分工,从而可使多个程序员同时进行程序的编写和调试工作,加快软件研制进度。工作,加快软件研制进度。n程序可读性好,便于功能扩充和版本升级。程序可读性好,便于功能扩充和版本升级。n对程序的修改可局部进行,其它部分可以保持不变。对程序的修改可局部进行,其它部分可以保持不变。n对于使用频繁的子程序可以建立子程序库,便于多个模块调对于使用频繁的子程序可以建立子程序库,便于多个模块调用。用。2、划分模块的原则、划分模块的原则n每个模块每个模块应具有独立的功能,能产生一个应具有独立的功能,能产生一个明确的结果明确的结果,即单,即单模块的功能
10、高内聚性。模块的功能高内聚性。n模块之间的模块之间的控制耦合控制耦合应尽量简单,应尽量简单,数据耦合数据耦合应应尽量少尽量少,即模,即模块间的低耦合性。控制耦合是指模块进入和退出的条件及方块间的低耦合性。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息交换方式、交换量的多少及式,数据耦合是指模块间的信息交换方式、交换量的多少及交换频繁程度。交换频繁程度。n模块长度适中。模块长度适中。20条条100条条的范围较合适。的范围较合适。二、编程技巧二、编程技巧1、尽量采用、尽量采用循环结构和子程序循环结构和子程序。2、尽量、尽量少用无条件转移少用无条件转移指令。指令。3、对于通用的子程
11、序,考虑到其通用性,除了用于存放子程序、对于通用的子程序,考虑到其通用性,除了用于存放子程序入口参数的寄存器外,子程序中用到的其他寄存器的内容应入口参数的寄存器外,子程序中用到的其他寄存器的内容应压入堆栈(返回前再弹出),即压入堆栈(返回前再弹出),即保护现场保护现场。4、在、在中断处理程序中断处理程序中,除了要中,除了要保护保护处理程序中用到的处理程序中用到的寄存器寄存器外,外,还要保护还要保护标志寄存器。标志寄存器。5、用累加器传递入口参数或返回参数比较方便,在、用累加器传递入口参数或返回参数比较方便,在子程序子程序中,中,一般不必把累加器内容压入堆栈一般不必把累加器内容压入堆栈。4.2
12、汇编语言源程序的编辑和汇编4.2.1 4.2.1 源程序编辑源程序编辑4.2.2 4.2.2 源程序的汇编源程序的汇编4.2.3 4.2.3 伪指令伪指令4.2.1 源程序编辑n在微型计算机上,借助编辑软件,编写或修在微型计算机上,借助编辑软件,编写或修改汇编语言源程序。如行编辑或屏幕编辑软改汇编语言源程序。如行编辑或屏幕编辑软件。件。4.2.2 源程序的汇编n汇编:汇编:将汇编语言源程序转换为将汇编语言源程序转换为机器码机器码表示的表示的目标目标程序程序的过程。对单片机有:的过程。对单片机有: 一、手工汇编一、手工汇编 二、机器汇编二、机器汇编 三、反汇编三、反汇编一、手工汇编一、手工汇编n
13、通过手工方式查指令编码表,逐个把助记符指令通过手工方式查指令编码表,逐个把助记符指令“翻译翻译”成机器码,然后把得到的机器码程序键入单成机器码,然后把得到的机器码程序键入单片机,进行调试和运行。片机,进行调试和运行。n手工汇编的缺点:手工汇编的缺点: 1、偏移量的计算容易出错、偏移量的计算容易出错 2、程序的修改会引起后面指令地址的变化,转移、程序的修改会引起后面指令地址的变化,转移指令的偏移量也要重新计算。指令的偏移量也要重新计算。二、机器汇编二、机器汇编n机器汇编是在计算机上使用交叉汇编程序进行源程机器汇编是在计算机上使用交叉汇编程序进行源程序的汇编。汇编工作由机器自动完成,最后得到以序的
14、汇编。汇编工作由机器自动完成,最后得到以机器码表示的目标程序。机器码表示的目标程序。三、反汇编三、反汇编n将二进制机器语言程序翻译成汇编语言程序的过程将二进制机器语言程序翻译成汇编语言程序的过程称反汇编。称反汇编。n汇编和反汇编的过程如图汇编和反汇编的过程如图4-3所示。所示。源程序(汇编语言)目标码(机器语言)汇编(汇编程序)反汇编(汇编程序)图4-3 汇编和反汇编过程4.2.3 伪指令n伪指令伪指令不是真正的指令,不是真正的指令,无对应的机器码无对应的机器码,在汇编,在汇编时时不产生目标程序不产生目标程序,只是用来对,只是用来对汇编过程汇编过程进行某种进行某种控制控制。ORG 汇编起始命令
15、汇编起始命令n格式:格式:ORG 16位地址位地址n功能:规定该伪指令后面程序的汇编地址,即汇编后生成目功能:规定该伪指令后面程序的汇编地址,即汇编后生成目标程序存放的标程序存放的起始地址起始地址。例如:。例如: ORG 2000HSTART:MOV A,#64H n规定了规定了START的地址是的地址是2000H,又规定了汇编后的第一条指,又规定了汇编后的第一条指令码从令码从2000H开始存放。开始存放。END 汇编结束指令汇编结束指令n格式:格式:ENDn功能:通知汇编程序结束汇编。在功能:通知汇编程序结束汇编。在END之后所有的之后所有的汇编指令均不予以处理。汇编指令均不予以处理。EQU
16、 赋值命令赋值命令n格式:字符名称格式:字符名称 EQU 项(数或汇编符号)项(数或汇编符号)n功能:把功能:把“项项”赋给赋给“字符名称字符名称”。n注意:注意:字符名称不等于标号字符名称不等于标号(其后没有冒号);其中的项,(其后没有冒号);其中的项,可以是数,也可以是汇编符号。可以是数,也可以是汇编符号。EQU赋值过的符号名可以用赋值过的符号名可以用作作数据数据、代码地址代码地址、位地址位地址或或一个立即数一个立即数。可以是。可以是8位的,也位的,也可以是可以是16位的。位的。n例如:例如:EQU 赋值命令赋值命令例例1:AA EQU R1 MOV A,AA;AA代表工作寄存器代表工作寄
17、存器R1例例2: A10 EQU 10DELY EQU 07EBH MOV A,A10;A10作为片内的一个直接地址作为片内的一个直接地址 LCALL DELY;DELY作为一个作为一个16位子程序的入口地址位子程序的入口地址DATA 数据地址赋值命令数据地址赋值命令n格式:字符名称格式:字符名称 DATA 表达式表达式n功能:与功能:与EQU类似,但有以下差别:类似,但有以下差别:n1、EQU定义的字符名定义的字符名必须先定义后使用必须先定义后使用,而,而DATA定义的字定义的字符名符名可以后定义先使用可以后定义先使用。n2、用、用EQU伪指令可以把一个汇编符号赋给一个名字,而伪指令可以把一
18、个汇编符号赋给一个名字,而DATA只能把只能把数据赋给字符名数据赋给字符名。n3、DATA语句可以把一个语句可以把一个表达式的值赋表达式的值赋给字符名称,其中的给字符名称,其中的表达式应是可求值的。表达式应是可求值的。DATA伪指令在程序中用来定义伪指令在程序中用来定义数据数据地址地址DB 定义字节命令定义字节命令n格式:格式:DB(项或项表)(项或项表)n功能:通知汇编程序从当前功能:通知汇编程序从当前ROM地址开始,保留一地址开始,保留一个字或字节串的存储单元,并存入个字或字节串的存储单元,并存入DB后的数据。后的数据。n注意:项或项表可以是一个字节、用逗号隔开的字注意:项或项表可以是一个
19、字节、用逗号隔开的字节串或括在节串或括在单引号中的单引号中的ASCII字符串字符串。n例如:例如:DB 定义字节命令定义字节命令 ORG 2000H DB 0A3HLIST:DB 26H,03H STR:DB ABC 经汇编后(经汇编后(2000H)=A3H, (2001H)=26H, (2002H)=03H, (2003H)=41H, (2004H)=42H, (2005H)=43H,(,(41H,42H,43H分别为分别为A,B,C的的ASCII码)码);(见书见书P12)DW 定义字命令定义字命令n格式:格式:DW 16位数据项或项表位数据项或项表n功能:把功能:把DW后的后的16位数据
20、项或项表从当前地址连续位数据项或项表从当前地址连续存放。每项数值为存放。每项数值为16位二进制数,位二进制数,高高8位先放,低位先放,低8位后存放位后存放。DW用于定义一个用于定义一个地址表地址表。n例如:例如:DW 定义字命令定义字命令 ORG 1500HTABLE:DW 7234H,8AH,10H 经汇编后(经汇编后(1500H)=72H, (1501H)=34H, (1502H)=00H, (1503H)=8AH, (1504H)=00H, (1505H)=10H,DS 定义存储空间命令定义存储空间命令n格式:格式:DS 表达式表达式n功能:在汇编时,从指定地址开始保留功能:在汇编时,从
21、指定地址开始保留DS之后表达式的值所之后表达式的值所规定的存储单元以备后用。规定的存储单元以备后用。n例如:例如:ORG 1000HDS 08HDB 30H,8AH汇编后,从汇编后,从1000H保留保留8个单元,然后从个单元,然后从1008H按按DB命令给内存命令给内存赋值,即(赋值,即(1008H)=30H (1009H)=8AHBIT 位地址符号命令位地址符号命令n格式:字符名格式:字符名 BIT 位地址位地址n功能:把功能:把BIT后的位地址值赋给字符名。其中字符名不是标后的位地址值赋给字符名。其中字符名不是标号,其后没有冒号,但字符名是必须的。号,其后没有冒号,但字符名是必须的。n例如
22、:例如:nA1 BIT P1.0nA2 BIT 02Hn汇编后,汇编后,P1口第口第0位的位的位地址位地址90H就赋给了就赋给了A1,而,而A2的值则的值则为为02H。4. 3 汇编语言程序的基本结构一、顺序程序一、顺序程序二、分支程序二、分支程序三、循环程序三、循环程序一、顺序程序一、顺序程序n顺序程序是最简单的程序结构,即顺序结构。顺序程序是最简单的程序结构,即顺序结构。n程序程序按顺序一条一条按顺序一条一条地执行指令地执行指令。一 简单程序设计举例例例1 1 :拆字。将片内:拆字。将片内RAM 20HRAM 20H单元的内容拆成两段,单元的内容拆成两段,每段四位。并将它们分别存入每段四位
23、。并将它们分别存入21H21H与与22H22H单元中。单元中。程序如下:程序如下:Back例如例如 :(:(20H20H)=56H,=56H,程序运行后程序运行后(21H21H)=06H,(22H)=05H=06H,(22H)=05H 例例2:双字节无符号数加法。:双字节无符号数加法。 设被加数存放在内部设被加数存放在内部RAM的的51H、50H单元,加数单元,加数存放在内部存放在内部RAM的的61H、60H单元,相加的结果存单元,相加的结果存放在内部放在内部RAM的的51H、50H单元,进位存放在位寻单元,进位存放在位寻址区的址区的00H位中。位中。 程序:程序:MOV R0,50H ;被加
24、数的低字节地址;被加数的低字节地址;2B,2usMOV R1,60H ;加数的低字节地址;加数的低字节地址 ;2B,2usMOV A,R0 ;取被加数低字节;取被加数低字节;1B,1usADD A,R1 ;加上加数低字节;加上加数低字节;1B,1usMOV R0,A ;保存低字节相加结果;保存低字节相加结果;1B,1us这两条指令能否用其他指令代替?这两条指令能否用其他指令代替?INC R0 ;指向被加数高字节;指向被加数高字节;1B,1usINC R1 ;指向加数高字节;指向加数高字节;1B,1usMOV A,R0 ;取被加数高字节;取被加数高字节;1B,1usADDC A,R1;加数高字节
25、(带进位加);加数高字节(带进位加)1B,1usMOV R0,A ;存高字节相加结果;存高字节相加结果;1B,1usMOV 00H,C ;保存进位;保存进位 ;2B,2us 这里为什么采用这里为什么采用带进位的加法,带进位的加法,而前面采用不带而前面采用不带进位的加法?进位的加法?n例例3: 有一有一变量变量存放在片存放在片内内RAM的的20H单元,其取单元,其取值范围为:值范围为:00H05H。要求编制一段程序,根据要求编制一段程序,根据变量值求其平方值,并存变量值求其平方值,并存入片内入片内RAM的的21H单元。单元。程序程序1:MOV A,20HMOV B,AMUL ABMOV 21H,
26、An程序如下:程序如下: ORG 1000HSTART:MOV DPTR,#2000H MOV A,20H MOVC A,A+DPTR MOV 21H,A SJMP $ ORG 2000HTABLE:DB 00,01,04,09,16,25 END二、分支程序二、分支程序n程序分支是通过程序分支是通过条件转移指令条件转移指令实现的,即根据条件对程序的实现的,即根据条件对程序的执行进行判断、满足条件则进行程序转移,不满足条件就顺执行进行判断、满足条件则进行程序转移,不满足条件就顺序执行程序。序执行程序。n分支程序又分为单分支和多分支结构。分支程序又分为单分支和多分支结构。n多分支程序是首先把分支
27、程序按序号排列,然后按序号值进多分支程序是首先把分支程序按序号排列,然后按序号值进行转移。行转移。二、分支程序二、分支程序n在在MCS-51指令系统中,通过条件判断实现单分支程序转移指令系统中,通过条件判断实现单分支程序转移的指令有:的指令有:JZ、JNZ、CJNE、DJNZ等。此外还有以位状态等。此外还有以位状态作为条件进行程序分支的指令,如作为条件进行程序分支的指令,如JC、JNC、JB、JNB、JBC等。使用这些指令可以完成等。使用这些指令可以完成0、1、正、负,以及相等、正、负,以及相等、不相等作为各种条件判断依据的程序转移。不相等作为各种条件判断依据的程序转移。(1) CJNE A,
28、#10,L1;(A)=10顺序执行顺序执行 LABLE1: L1:JNC LABLE1;(A)10跳转到跳转到LABLE1 一、单分支程序一、单分支程序例例1 编写程序实现编写程序实现(1) (A) =10时则程序转至标号时则程序转至标号LABLE1处执行。处执行。(2) (A) 10时则程序转至标号时则程序转至标号LABLE2处执行处执行(3) (A) 源字节内容,源字节内容,则则CY位清零,否则置位清零,否则置1判判“1”跳转,若跳转,若CY1,跳转,跳转(2) SUBB A,#10 JNC LABLE2 ;(A)10跳转跳转 LABLE2:(3) CJNE A,#10,L1 ;(A)=1
29、0顺序执行顺序执行 LABLE3: L1:JC LABLE3 ;(A)0,且现,且现A=00H,即跳,即跳转至转至LP;若;若CY=1,则则,则则原原A0,且现,且现A=80H00H,顺序执行,顺序执行三、多分支程序三、多分支程序例例1 128种分支转移程序。种分支转移程序。功能:根据功能:根据入口条件入口条件转移到转移到128个目的地址。个目的地址。入口:(入口:(R3)=转移目的地址的序号转移目的地址的序号00H7FH。出口:转移到相应子程序入口。出口:转移到相应子程序入口。图4-1 分支程序结构散转指令转向0分支转向1分支转向n-1分支转向n分支K=0K=1K=n-1K=n128个子程序
30、首址JMP_128:MOV A,R3 RL A MOV DPTR,#JMPTAB JMP A+DPTRJMPTAB:AJMP ROUT00 AJMP ROUT01 AJMP ROUT7Fn说明:此程序要求说明:此程序要求128个转移目的地址(个转移目的地址(ROUT00 ROUT7FH)必须驻留在与绝对转移指令)必须驻留在与绝对转移指令AJMP相同相同的一个的一个2KB存储区内。存储区内。nRL指令对变址部分指令对变址部分乘以乘以2,因为,因为每条每条AJMP指令占两个字节。指令占两个字节。注:即注:即A=00H、02H、04H每一个数据的偏移地址是每一个数据的偏移地址是2的整数的整数倍倍三、
31、循环程序三、循环程序n在程序运行时,有时需要连续重复执行某段程序,在程序运行时,有时需要连续重复执行某段程序,可以使用循环程序。其结构包括四部分:可以使用循环程序。其结构包括四部分: 1、置循环初值、置循环初值 2、循环体(循环工作部分)、循环体(循环工作部分) 3、修改控制变量、修改控制变量 4、循环控制部分、循环控制部分n其组织方式如其组织方式如P74图图4-4所示。所示。1、置循环初值、置循环初值n对于循环程序中所使用的工作单元,在循环开始时对于循环程序中所使用的工作单元,在循环开始时应置初值。应置初值。n例如,例如,工作寄存器设置计数初值,累加器工作寄存器设置计数初值,累加器A清清0,
32、以,以及设置地址指针、长度等。及设置地址指针、长度等。2、循环体(循环工作部分)、循环体(循环工作部分)n重复执行的程序段部分,分为循环工作部分和循环重复执行的程序段部分,分为循环工作部分和循环控制部分。控制部分。n循环控制部分每循环一次,检查结束条件,当满足循环控制部分每循环一次,检查结束条件,当满足条件时,就停止循环,往下继续执行其他程序条件时,就停止循环,往下继续执行其他程序3、修改控制变量、修改控制变量n在循环程序中,不许给出循环结束条件。在循环程序中,不许给出循环结束条件。n常见的是常见的是计数循环计数循环,当循环了一定的次数后,就停,当循环了一定的次数后,就停止循环。止循环。n在单
33、片机中,一般用一个工作寄存器在单片机中,一般用一个工作寄存器Rn作为计数器作为计数器,对该计数器赋初值作为循环次数。每循环一次,计对该计数器赋初值作为循环次数。每循环一次,计数器的值减数器的值减1,即修改循环控制变量,当计数器的置,即修改循环控制变量,当计数器的置件为件为0时,就停止循环。时,就停止循环。4、循环控制部分、循环控制部分n根据循环结束条件,判断是否结束循环。根据循环结束条件,判断是否结束循环。n89C51可采用可采用DJNZ指令指令来自动修改控制变量并能结来自动修改控制变量并能结束循环。束循环。置初值循环体循环修改循环控制退出循环未完完(a)置初值循环体循环修改循环控制退出循环未
34、完完(b)图4-4 循环组织方式流程图一、先执行后判断一、先执行后判断例例3 50ms延时程序。延时程序。若晶振频率为若晶振频率为12MHz,则一个机器周期为,则一个机器周期为1s。执行一条。执行一条DJNZ指令指令需要需要2个机器周期,即个机器周期,即 2s。采用循环计数法实现延时,循。采用循环计数法实现延时,循环次数可以通过计算获得,并选择环次数可以通过计算获得,并选择先执行后判断先执行后判断的循环结构。的循环结构。DELY:MOV R6,#50 ;1usDELY1:DJNZ R6,DELY1 ;2us*50=100us RET ;2us本段程序延时时间为本段程序延时时间为:1+100+2
35、=103us单循环最长延时时间为:单循环最长延时时间为:1+256*2+2=515us50ms延时程序段如下页:延时程序段如下页: DEL:MOV R7,#200 ;1 sDEL1:MOV R6,#123 ;1 s NOP ;1 sDEL2:DJNZ R6,DEL2 ;2s,计(,计(2123)s DJNZ R7,DEL1 ;2s, RET ;2s 共计共计 1+(21232 2)200+2 s,即,即50.003ms双重循环双重循环最长延时时间为:最长延时时间为:1+(22552 2)255+2 s,即,即131.070msDEL:MOV R7,#200 ;1 sDEL1:MOV R6,#1
36、23 ;1 s NOP ;1 sDEL2:DJNZ R6,DEL2 ;2s,计(,计(2123)s DJNZ R7,DEL1 ;2s, RET ;2s 共计共计 1+(21232 2)200+2 s,即,即50.003ms双重循环双重循环最长延时时间为:最长延时时间为:1+(22552 2)255+2 s,即,即131.070ms练习练习1: 设计一个延时时间为设计一个延时时间为5ms的延时子程序。的延时子程序。二、先判断后执行二、先判断后执行例例4 将内部将内部RAM中起始地址为中起始地址为data的数据串传送的数据串传送到外部到外部RAM中起始地址为中起始地址为buffer的存储区域内,的
37、存储区域内,直到发现直到发现$ 字符停止传送。由于字符停止传送。由于循环次数事先循环次数事先不知道不知道,但循环条件可以测试到。所以,采用,但循环条件可以测试到。所以,采用先先判断后执行判断后执行的结构比较适宜。程序段如下:的结构比较适宜。程序段如下: MOV R0,#data MOV DPTR,#bufferLOOP0:MOV A,R0 SJMP LOOP2 ;是;是 $ 字符,转其它程序字符,转其它程序CJNE A,#24H,LOOP1 ;判断是否为;判断是否为 $ 字符字符LOOP1:MOVX DPTR,A ;不是;不是 $ 字符,执行传送字符,执行传送INC R0 INC DPTRSJ
38、MP LOOP0 ;传送下一数据;传送下一数据LOOP2: $的ASC码练习练习2: 统计以统计以 $ 字符为结尾的字符串长度并送字符为结尾的字符串长度并送NUM单元单元,设字符串放在内部设字符串放在内部RAM中起始地址为中起始地址为data的存储区域内。的存储区域内。MOV R0,#data MOV R1,#0LOOP0:MOV A,R0 SJMP LOOP2 ;是;是 $ 字符,转结束字符,转结束CJNE A,#24H,LOOP1 ;判断是否为;判断是否为 $ 字符字符LOOP1: INC R1 ;不是;不是 $ 字符,字符, 取下一个字符取下一个字符INC R0 SJMP LOOP0 ;
39、下一字符;下一字符LOOP2:MOV NUM,R1; 字符串长度送字符串长度送NUM单元单元四 代码转换程序转换程序设计举例例5:R1中存有一个BCD码,编一子程序将其转换为ASCII码,存入片外RAM1000H单元中去。一、BCD码与ASCII码之间的转换为什么要将为什么要将累加器累加器A的的内容内容+30H?思考题思考题:当有多个当有多个BCDBCD码时,如何将其转换为码时,如何将其转换为 ASCIIASCII码,并存入到指定的单元中去?码,并存入到指定的单元中去?例例6 6:用用查查表表法法编编一一子子程程序序,将将40H40H单单元元中中的的BCDBCD码码转换成转换成ASCIIASC
40、II码。码。入口:待转换数在(入口:待转换数在(40H40H)出口:转换后的数(出口:转换后的数(40H40H) 例例7 若将若将30H单元单元BCD码转换成码转换成ASCII码,码,利用利用SUB1子程序子程序。例例8 片外片外RAM2000H单元中有一单元中有一BCD码,编码,编一子程序将其转换成一子程序将其转换成ASCII码。码。Back二、二、BCD码与二进制数之间的转换码与二进制数之间的转换n在计算机中,十进制数要用在计算机中,十进制数要用BCD码来表示。通常,用码来表示。通常,用四位二进制数表示一位四位二进制数表示一位BCD码,用码,用1个字节表示个字节表示2位位BCD码(称为压缩
41、型码(称为压缩型BCD码)。码)。实验:实验: 编程将编程将 A中的二进制数中的二进制数 拆为三个拆为三个 BCD 码码, 并存并存入入 Result 开始的三个单元开始的三个单元如(如(A)=01111011B=123D=7BH, 则执行程序结则执行程序结果应为(果应为(30H)=1,(31H)=2, (32H)=3,十进制数十进制数三、十六进制数与三、十六进制数与ASCII码间的转换码间的转换 十六进制数十六进制数与与ASCII码的对应关系如表所示。码的对应关系如表所示。当十六进制数当十六进制数在在09之间时,其对应的之间时,其对应的ASCII码值码值为该十为该十六进制数六进制数加加30H
42、;当十六进制数;当十六进制数在在AF之间时,其对应的之间时,其对应的ASCII码码值为该十六进制数值为该十六进制数加加37H。为什么此处为什么此处+37H而不而不是是41H或其他值?或其他值?例例9 将将1位十六进制数转换成相应的位十六进制数转换成相应的ASCII码。码。设十六进制数存放在设十六进制数存放在R0中,转换后的中,转换后的ASCII 码存放于码存放于R2中。中。实现程序如下实现程序如下HASC:MOV A,R0 ;取;取4位二进制数位二进制数 ANL A,#0FH ;屏蔽掉高;屏蔽掉高4位位PUSH ACC ;4位二进制数入栈位二进制数入栈ADD A,#06H ;用半进位位的状态判
43、断该数在;用半进位位的状态判断该数在09还是还是AF之间之间POP ACC ;弹出原;弹出原4位二进制数位二进制数JNB PSW.6 ,LOOP ;AC位为位为0,跳转至,跳转至LOOPADD A,#37H ;AC为为1,该数在,该数在AF之间,加之间,加37HLOOP:ADD A,#30H ;该数在;该数在09之间,加之间,加30HLOOP1:MOV R2,A ;ASCII码存于码存于R2RETSJMP LOOP1此处为此处为什么要什么要用堆栈用堆栈操作指操作指令令PUSH和和POP?不用行不用行不行?不行?思考题:除加思考题:除加#06H 判断外,还可以用什么方法判断?判断外,还可以用什么
44、方法判断?实现程序如下实现程序如下HASC:MOV A,R0 ;取;取4位二进制数位二进制数 ANL A,#0FH ;屏蔽掉高;屏蔽掉高4位位PUSH ACC ;4位二进制数入栈位二进制数入栈CLR C ;清进(借)位位;清进(借)位位SUBB A,#0AH ;用借位位的状态判断该数在;用借位位的状态判断该数在09还是还是AF之间之间POP ACC ;弹出原;弹出原4位二进制数位二进制数JC LOOP ;借位位为;借位位为1,跳转至,跳转至LOOPADD A,#07H ;借位位为;借位位为0,该数在,该数在AF之间,加之间,加37HLOOP:ADD A,#30H ;该数在;该数在09之间,加之
45、间,加30HMOV R2,A ;ASCII码存于码存于R2RET五 子程序设计 Back一、子程序的调用一、子程序的调用n在实际应用中,经常会遇到一些带有在实际应用中,经常会遇到一些带有通用性通用性的问题,例如:的问题,例如:数值转换、数值计算等,在一个程序中可能要数值转换、数值计算等,在一个程序中可能要使用多次使用多次。这时。这时可以将其设计成通用的子程序供随时调用。可以将其设计成通用的子程序供随时调用。n子程序子程序的结构与一般的程序并无多大区别,它的主要特点是,的结构与一般的程序并无多大区别,它的主要特点是,在执行过程中在执行过程中需要由其它程序来调用需要由其它程序来调用,执行完执行完后
46、后又需要又需要把执行把执行流程流程返回返回到调用该子程序的到调用该子程序的主程序主程序。n子程序调用时要注意两点:子程序调用时要注意两点:一是现场的保护和恢复;二是主一是现场的保护和恢复;二是主程序与子程序的参数传递。程序与子程序的参数传递。 Back二、现场保护与恢复二、现场保护与恢复 在子程序执行过程中常常要用到单片机的一些通用单元,如在子程序执行过程中常常要用到单片机的一些通用单元,如工作寄存器工作寄存器R0R7、累加器、累加器A、数据指针、数据指针DPTR,以及有关标志,以及有关标志和状态等。而这些单元中的内容在调用结束后的主程序中仍有和状态等。而这些单元中的内容在调用结束后的主程序中
47、仍有用,所以需要进行保护,称为用,所以需要进行保护,称为现场保护现场保护。在执行完子程序,返。在执行完子程序,返回继续执行主程序前恢复其原内容,称为回继续执行主程序前恢复其原内容,称为现场恢复现场恢复。保护与恢。保护与恢复的方法有以下两种:复的方法有以下两种:n在主程序中实现;在主程序中实现;n在子程序中实现。在子程序中实现。 Back 1、在主程序中实现、在主程序中实现 示例如下:示例如下: PUSH PSW ;保护现场;保护现场 PUSH ACC PUSH B MOV PSW,#10H ;换当前工作寄存器组;换当前工作寄存器组 LCALL addr16 ;子程序调用;子程序调用 POP B
48、 ;恢复现场;恢复现场 POP ACC POP PSW 其特点是结构灵活。其特点是结构灵活。 2、在子程序中实现、在子程序中实现示例如下:示例如下:SUB1:PUSH PSW ;保护现场;保护现场 PUSH ACC PUSH B MOV PSW,#10H ;换当前工作寄存器组为;换当前工作寄存器组为2组组 POP B ;恢复现场;恢复现场 POP ACC POP PSW RET其特点是程序规范、清晰。其特点是程序规范、清晰。注意,无论哪种方法保护与恢复的顺序要对应。注意,无论哪种方法保护与恢复的顺序要对应。三、参数传递三、参数传递 由于子程序是主程序的一部分,所以,在程序的执行时必然由于子程序
49、是主程序的一部分,所以,在程序的执行时必然要发生数据上的联系。在调用子程序时,主程序应通过某种方要发生数据上的联系。在调用子程序时,主程序应通过某种方式把有关参数(即子程序的入口参数)传给子程序,当子程序式把有关参数(即子程序的入口参数)传给子程序,当子程序执行完毕后,又需要通过某种方式把有关参数(即子程序的出执行完毕后,又需要通过某种方式把有关参数(即子程序的出口参数)传给主程序。在口参数)传给主程序。在80C51单片机中,传递参数的方法有单片机中,传递参数的方法有三种:三种: 1、利用累加器或寄存器、利用累加器或寄存器 在这种方式中,要把预传递的参数存放在累加器在这种方式中,要把预传递的参
50、数存放在累加器A或工作寄或工作寄存器存器R0R7中。即在主程序调用子程序时,应事先把子程序需中。即在主程序调用子程序时,应事先把子程序需要的数据送入累加器要的数据送入累加器A或指定的工作寄存器中,当子程序执行或指定的工作寄存器中,当子程序执行时,可以从指定的单元中取得数据,执行运算。反之,子程序时,可以从指定的单元中取得数据,执行运算。反之,子程序也可以用同样的方法把结果传送给主程序。也可以用同样的方法把结果传送给主程序。例例10 编写程序,实现编写程序,实现c=a2+b2 。设。设a,b,c分别存分别存于内部于内部RAM的的30H,31H,32H三个单元中。三个单元中。程序段如下:程序段如下
51、:START:MOV A,30H ;取;取a ACALL SQR ;调用查平方表;调用查平方表 MOV R1,A ;a2 暂存于暂存于R1中中 MOV A,31H ;取;取b ACALL SQR ;调用查平方表;调用查平方表 ADD A,R1 ;a2+b2 存于存于A中中 MOV 32H,A ;存结果;存结果 SJMP $ SQR :MOV DPTR,#TAB ;子程序;子程序 MOVC A,A+DPTR ;查表;查表 RET TAB :DB 0,1,4,9,16 ,25,36 DB 49,64,81,100,1212、利用存储器、利用存储器 当传送的当传送的数据量比较大数据量比较大时,可以利
52、用存储器实现参时,可以利用存储器实现参数的传递。在这种方式中,事先要数的传递。在这种方式中,事先要建立建立一个一个参数表参数表,用指针指示参数表所在的位置。当参数表建立在用指针指示参数表所在的位置。当参数表建立在内内部部RAM时,用时,用R0或或R1作作参数表的参数表的指针指针。当参数表。当参数表建立在建立在外部外部RAM时,用时,用DPTR作作参数表的参数表的指针。指针。3、利用堆栈、利用堆栈 利用利用堆栈堆栈传递参数是在传递参数是在子程序嵌套中子程序嵌套中常采用的一种常采用的一种方法。在调用子程序前,用方法。在调用子程序前,用PUSH指令将子程序中所指令将子程序中所需数据压入堆栈,进入执行
53、子程序时,再用需数据压入堆栈,进入执行子程序时,再用POP指指令从堆栈中弹出数据。令从堆栈中弹出数据。例例11 把内部把内部RAM中中20H单元中的单元中的1个字节十六进制数个字节十六进制数转换为转换为2位位ASCII码,存放在码,存放在R0指示指示的两个单元中。的两个单元中。5BH35H42H30H20H31HMAIN: MOV A,20H;(A)=5BH MOV R0,#30H SWAP A;(A)=B5H PUSH 20H ;参数入栈;参数入栈 ACALL HEASC MOV R0,A ;存高位十六进制数转换结果;存高位十六进制数转换结果 INC R0 ;修改指针;修改指针 POP AC
54、C ;(A)=5BH ;参数入栈;参数入栈 ACALL HEASC ;(A)=42H MOV R0,A ;存低位十六进制数转换结果;存低位十六进制数转换结果 SJMP $HEASC: ANL A,#0FH ;取一位十六进制数;取一位十六进制数 ADD A,#2 ;偏移量调整;偏移量调整 MOVC A,A+PC ;查表;查表 RET ;1字节指令字节指令ASCTAB:DB 30H,31H,32H,33H,34H,35H, 36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H n一般说来:一般说来:n当相互传递的数据较少时,采用寄存器传递方式可当相互传递的数据较少时
55、,采用寄存器传递方式可以获得较快的传递速度;以获得较快的传递速度;n当相互传递的数据较多时,宜采用存储器或堆栈方当相互传递的数据较多时,宜采用存储器或堆栈方式传递;式传递;n如果是子程序嵌套时,最好是采用堆栈方式。如果是子程序嵌套时,最好是采用堆栈方式。六 运算类程序设计举例例12:片内RAM30H单元开始有10个字节的二进制数。编一子程序,求它们的和。(和小于256)将和存入20H单元中。例例13:编写将:编写将30H,31H单元中的两字节二进单元中的两字节二进制数乘以制数乘以2的程序(积小于的程序(积小于65536)作业作业n试编写一段10ms的延时子程序nP83 4,5,7,8,10习题
56、课习题课第二章2 2.EA/Vpp(31脚):EAEA: 外部程序存储器外部程序存储器地址允许输入端。地址允许输入端。当该当该引脚接高电平引脚接高电平时,时,CPUCPU访问片内访问片内EPROM/ROMEPROM/ROM并执行片内程序存储器中的指令,并执行片内程序存储器中的指令,但当但当PCPC值超过值超过0FFFH0FFFH(片内(片内ROMROM为为4KB4KB)时,将)时,将自自动转向动转向执行片外执行片外ROMROM中的程序。中的程序。当该当该引脚接低电平引脚接低电平时,时,CPUCPU只访问片外只访问片外EPROM/ROMEPROM/ROM并执行外部程序存储器中的程序。并执行外部程序存储器中的程序。V Vpppp:对片内对片内的的flash ROMflash ROM固化编程时,固化编程时,编程电压编程电压输入端(输入端(12-21V12-21V)。)。3.