《汇编语言程序设计基础》由会员分享,可在线阅读,更多相关《汇编语言程序设计基础(36页珍藏版)》请在金锄头文库上搜索。
1、3.4 3.4 汇编语言程序设计基础汇编语言程序设计基础 3 3.4.1 .4.1 程序设计程序设计语言语言概述概述 3 3.4.2 .4.2 汇编语言汇编语言程序设计的特点及伪指令程序设计的特点及伪指令 3 3.4.3 .4.3 单片机汇编语言程序设计单片机汇编语言程序设计 3 3. .4.3.1 4.3.1 顺序结构程序设计顺序结构程序设计 3.4.3.2 3.4.3.2 分支程序设计分支程序设计 3.4.3.3 3.4.3.3 散转程序设计散转程序设计 3.4.3.5 3.4.3.5 查表程序设计查表程序设计 3.4.3.6 3.4.3.6 子子程序设计程序设计 3 3.4.4 .4.4
2、 单片机汇编语言程序设计单片机汇编语言程序设计举例举例3.3.4.14.1 程序设计语言程序设计语言概述概述 3 3. .4.1.1 4.1.1 汇编语言的优点汇编语言的优点 3.4.1.2 3.4.1.2 汇编语言程序设计的过程汇编语言程序设计的过程 3.4.1.3 3.4.1.3 程序质量程序质量3.3.4.2 4.2 汇编语言汇编语言程序设计的特点及伪指令程序设计的特点及伪指令3.3.4.2.1 4.2.1 汇编语言程序的特点汇编语言程序的特点 标号: 操作码 操作数1,操作数2,操作数3 ;注释方括符 表示可选项。标号代表指令所在地址,1-8个字母/数字,字母开头,“:”结尾。操作码就
3、是指令功能助记符,指令实体。操作数是指令操作的对象。分为目的操作数和源操作数。注释是对该指令的解释和说明,是指令的非执行部分,可省略,前面必须加“;”。3.3.4.2.2 4.2.2 伪指令伪指令 汇编语言源程序是由汇编语句组成的,一般情况下,汇汇编语言源程序是由汇编语句组成的,一般情况下,汇 编语言语句可分为指令性语句和指示性语句。编语言语句可分为指令性语句和指示性语句。指令性语句(即汇编指令)指令性语句(即汇编指令) 指令性语句是进行汇编语言程序设计的可执行语句,每指令性语句是进行汇编语言程序设计的可执行语句,每条指令都产生相应的机器语言的目标代码。源程序的主要功条指令都产生相应的机器语言
4、的目标代码。源程序的主要功能是由指令性语句去完成的。能是由指令性语句去完成的。指示性语句(即伪指令)指示性语句(即伪指令) 伪指令伪指令 伪指令是控制汇编过程的一些命令,是程序员通知汇编程序在进行汇伪指令是控制汇编过程的一些命令,是程序员通知汇编程序在进行汇编时的一些指示。没有对应的机器码,不产生目标代码程序,不影响程序的编时的一些指示。没有对应的机器码,不产生目标代码程序,不影响程序的执行。执行。1).1).伪指令主要用来指定程序或数据的起始位置,给出一些连续存放数据的伪指令主要用来指定程序或数据的起始位置,给出一些连续存放数据的地址或为中间运算结果保留一部分存储空间以及表示源程序结束等等。
5、地址或为中间运算结果保留一部分存储空间以及表示源程序结束等等。2).2).伪指令还可用来对符号伪指令还可用来对符号标号赋值。标号赋值。 不同版本汇编语言,伪指令可能有所不同,但基本用法是相似的。不同版本汇编语言,伪指令可能有所不同,但基本用法是相似的。 1) 1) 设置目标程序起始地址伪指令设置目标程序起始地址伪指令ORGORG 格式:格式: 标号:标号: ORG ORG 地址地址 功能:功能:规定其后面的目标程序或数据块的起始地址。规定其后面的目标程序或数据块的起始地址。 伪指令伪指令ORGORG放在一段源程序放在一段源程序( (主程序、子程序主程序、子程序) )或数据块的前或数据块的前面,
6、说明紧跟在其后的程序段或数据块的起始地址就是面,说明紧跟在其后的程序段或数据块的起始地址就是ORGORG后面后面给出的地址。给出的地址。 例如:例如: ORG 1000HORG 1000H START START:MOV AMOV A, #34H#34H 2) 2) 结束汇编伪指令结束汇编伪指令ENDEND 格式:格式: 标号:标号: END END 功能:功能: ENDEND是汇编语言源程序的结束标志,用于终止源程序的是汇编语言源程序的结束标志,用于终止源程序的汇编工作。汇编工作。 在在ENDEND以后所写的指令,汇编程序都不予处理。以后所写的指令,汇编程序都不予处理。 一个源程序只能有一个
7、一个源程序只能有一个ENDEND命令。命令。 3) 3) 定义字节伪指令定义字节伪指令DBDB 格式:格式: 标号:标号: DB DB 字节常数或字符字节常数或字符 功能:功能:从指定地址单元开始存放若干个字节的数据或字符。从指定地址单元开始存放若干个字节的数据或字符。 字符若用引号括起来则表示字符若用引号括起来则表示ASCIIASCII码。码。 例如:例如: ORG 2000HORG 2000H TAB1 TAB1: DB 30HDB 30H,8AH8AH,7FH7FH,7373 DB 5 DB 5,AA, YESYES 4) 4) 定义字伪指令定义字伪指令DWDW 格式:格式: 标号:标号
8、: DW 16 DW 16位数据表位数据表 功能:功能: DWDW伪指令告诉汇编程序从指定的地址单元开始定义若干伪指令告诉汇编程序从指定的地址单元开始定义若干个个1616位数据。位数据。 对于对于MCS-51MCS-51单片机系统,单片机系统,1616位数据的高位数据的高8 8位存入低地址单元,低位存入低地址单元,低8 8位存入位存入高地址单元。高地址单元。例如:例如: ORG 1500HORG 1500H TAB2 TAB2: DW 1234HDW 1234H,80H, AB80H, AB汇编以后,汇编以后,(1500H)=12H(1500H)=12H,(1501H)=34H(1501H)=
9、34H, (1502H)=00H(1502H)=00H,(1503H)=80H,(1503H)=80H, (1504H)=41H (1504H)=41H,(1505H)=42H(1505H)=42H 5) 5) 赋值伪指令赋值伪指令EQUEQU 格式:格式: 字符名称字符名称 EQU EQU 赋值项赋值项 功能:功能:将将EQUEQU右边的值赋予右边的值赋予EQUEQU左面用户定义的符号。左面用户定义的符号。 赋值项可以是常数、地址、标号或表达式。赋值项可以是常数、地址、标号或表达式。 例如:例如:TEMP EQU R2TEMP EQU R2 PA8155 EQU 8001HPA8155 EQ
10、U 8001H 汇编后汇编后TEMP TEMP 对应寄存器对应寄存器R2R2,PA8155PA8155值为值为8001H8001H EQUEQU定义的符号必须先定义后使用,定义的符号必须先定义后使用,且在同一个源程序中且在同一个源程序中, , 同同一个标号只能赋值一次一个标号只能赋值一次, ,该语句通常放在程序开头。该语句通常放在程序开头。6) 6) 位地址定义伪指令位地址定义伪指令BITBIT格式:格式: 字符名称字符名称 BIT BIT 位地址位地址功能功能: : 将位地址赋予字符名称。将位地址赋予字符名称。 经赋值后可用字符名称代替位地址。其中,位地址可以是绝经赋值后可用字符名称代替位地
11、址。其中,位地址可以是绝对地址,也可以是符号地址(即位符号名称)。对地址,也可以是符号地址(即位符号名称)。例如:例如:PLG BIT F0PLG BIT F0AI BIT P1.0AI BIT P1.0 经以上伪指令定义后,在程序中就可以把经以上伪指令定义后,在程序中就可以把FLGFLG和和AIAI作为位地作为位地址来使用。址来使用。补充补充: : 7) 7) 定义标号值伪指令定义标号值伪指令DLDL 格式:格式: 字符名称字符名称 DL DL 表达式表达式 功能:功能:DLDL命令将数据地址或代码地址赋予规定的字符名称。命令将数据地址或代码地址赋予规定的字符名称。 例如:例如:COUNT
12、DL 1000HCOUNT DL 1000H COUNT DL COUNT+1 COUNT DL COUNT+1 DL DL伪指令常用来定义数据地址。伪指令常用来定义数据地址。补充补充: : 8) 8) 定义存储空间伪指令定义存储空间伪指令DSDS 格式:格式: 标号:标号: DS DS 表达式表达式 功能:功能:从指定地址开始,保留若干个字节的内存空间,供程序运从指定地址开始,保留若干个字节的内存空间,供程序运行使用。行使用。 保留的字节单元数由表达式的值决定。保留的字节单元数由表达式的值决定。 例如:例如: ORG 2000HORG 2000H DS 05H DS 05H DB 10H D
13、B 10H,20H20H 汇编后从汇编后从2000H2000H开始,预留开始,预留5 5个字节的内存单元,然后从个字节的内存单元,然后从2005H2005H开始,按照下一条开始,按照下一条DBDB指令赋值,即指令赋值,即(2005H)=10H(2005H)=10H,(2006H)=20H(2006H)=20H。 对对MCS-51MCS-51来说,来说,DBDB、DWDW、DSDS只能对程序存储器使用。只能对程序存储器使用。补充补充: 9) : 9) 数据地址赋值伪指令数据地址赋值伪指令DATADATA 格格 式:式: 字符名称字符名称 DATA 表达式表达式 功能:功能:将表达式指定的数据地址
14、赋予规定的字符名称。将表达式指定的数据地址赋予规定的字符名称。 DATADATA与与EQUEQU伪指令的功能类似,但也有区别:伪指令的功能类似,但也有区别: DATADATA定义的字符名称可以先使用后定义定义的字符名称可以先使用后定义,EQU,EQU定义的字符定义的字符名称必须先定义后使用。名称必须先定义后使用。 DATADATA伪伪指令可以放在源程序的开头或结尾,也可以放在指令可以放在源程序的开头或结尾,也可以放在程序的其他位置,程序的其他位置,EQUEQU伪指令通常放在程序开头。伪指令通常放在程序开头。3.3.4.3 4.3 单片机汇编语言程序设计单片机汇编语言程序设计 3.4.3.1 4
15、.3.1 顺序结构程序设计顺序结构程序设计 顺顺序序结结构构,是是最最简简单单、最最基基本本的的程程序序结结构构,其其特特点点是是按按指指令令的的排排列列顺顺序序一一条条条地执行,直到全部指令执行完毕为止。条地执行,直到全部指令执行完毕为止。 往往往往用用来来解解决决一一些些简简单单的的算算术术及及逻逻辑辑运运算算问问题题,主主要要用用数数据据传传送送指指令令和和数数据据运算指令实现。运算指令实现。【例1】 :设有16位二进制数存放在 R0,R1中(R0存放高位,R1存放低位),试编写实现16位二进制数的:“取反加1”操作的程序。程序如下:程序如下: ORG 1000H MOV A,R1 CP
16、L A ADD A,#01H MOV R1,A MOV A,R0 CPL A ADDC A,#00H MOV R0,A END 3.4.3.2 3.4.3.2 分支程序设计分支程序设计 分支结构程序可根据程序要求无条件或有条件地改变程序分支结构程序可根据程序要求无条件或有条件地改变程序执行的顺序,选择新的程序流向。执行的顺序,选择新的程序流向。 编写分支结构程序主要在于正确使用转移指令,即无条件编写分支结构程序主要在于正确使用转移指令,即无条件转移和条件转移指令。转移和条件转移指令。 根据分支多少,将分支程序结构分为单分支根据分支多少,将分支程序结构分为单分支( (即两分支即两分支) )结结构
17、和多分支结构。构和多分支结构。 单分支常用条件转移指令实现。单分支常用条件转移指令实现。 多分支,在多分支,在MCS-51MCS-51中,利用中,利用“JMP A+DPTR”JMP A+DPTR”指令可以实指令可以实现(可实现现(可实现256256分支),为菜单程序设计提供了方便。分支),为菜单程序设计提供了方便。 图图 3.4.1 分支结构框图分支结构框图(a) 单分支流程单分支流程; (b) 多分支流程多分支流程 【例2】 :设a存放在累加器A中,b存放在寄存器B中,要求按下式计算Y值,并将结果Y存于累加器A 中,试编写程序。 a-b (a0) Y = a+b (a 0) ORG 1000
18、H BRMPNA:JB ACC.7,PLUS CLR C SUBB A,B SJMP BRDONE PLUS: ADD A,B BRDONE : SJMP BRDONE END3.4.3.3 3.4.3.3 散转程序设计散转程序设计 散散转转程程序序是是分分支支程程序序的的一一种种, ,它它可可根根据据运运算算结结果果或或输输入入数数据据将程序转入不同的分支。将程序转入不同的分支。 MCS-51MCS-51指指令令系系统统中中有有一一条条跳跳转转指指令令JMP JMP A+DPTR,A+DPTR,用用它它可可以以很很容容易易地地实实现现散散转转功功能能。该该指指令令把把累累加加器器的的8 8位
19、位无无符符号号数数与与16 16 位位数数据据指指针针的的内内容容相相加加, ,并并把把相相加加的的结结果果装装入入程程序序计计数数器器PC,PC,控控制程序转向目标地址去执行。制程序转向目标地址去执行。 此此指指令令的的特特点点在在于于, ,转转移移的的目目标标地地址址不不是是在在编编程程或或汇汇编编时时预预先先确确定定的的, ,而而是是在在程程序序运运行行过过程程中中动动态态地地确确定定的的。目目标标地地址址是是以以数数据据指指针针DPTRDPTR的的内内容容为为起起始始的的256256字字节节范范围围内内的的指指定定地地址址, ,即即由由 DPTRDPTR的的内内容容决决定定分分支支转转
20、移移程程序序的的首首地地址址, ,由由累累加加器器A A的的内内容容来来动动态选择其中的某一个分支转移程序。态选择其中的某一个分支转移程序。 在在程程序序设设计计过过程程中中,常常常常遇遇到到反反复复执执行行某某一一段段程程序序的的情情况况,这这种种情情况况下下采采用用循循环环程程序序结结构构,可可以以缩缩短短程程序序代代码码的的长长度,提高程序的质量和运行效率。度,提高程序的质量和运行效率。循环程序一般由四个主要部分组成循环程序一般由四个主要部分组成: : 初初始始化化部部分分: : 为为循循环环程程序序做做准准备备, ,如如规规定定循循环环次次数数、给给各各变变量量和和地地址址指指针预置初
21、值。针预置初值。 处处理理部部分分: : 为为反反复复执执行行的的程程序序段段, ,是是循循环环程程序序的的实实体体, ,也也是是循循环环程程序序的的主主体。体。 循循环环控控制制部部分分: : 这这部部分分的的作作用用是是修修改改循循环环变变量量和和控控制制变变量量, ,并并判判断断循循环环是否结束是否结束, , 符合结束条件时符合结束条件时, ,跳出循环。跳出循环。 结束部分结束部分: : 这部分主要是对循环程序的结果进行分析、处理和存放。这部分主要是对循环程序的结果进行分析、处理和存放。 3.4.3.4 3.4.3.4 循环循环程序设计程序设计循环循环程序程序的这四个部分的这四个部分,
22、,流程有两种情况,如图流程有两种情况,如图4-24-2所示。所示。 图图3-4- 2 循环结构程序流程图循环结构程序流程图 【例3】:51单片机晶振为6MHz,分析下列循环进行了多少次?下面程序运行共需要多长时间? MOV R7,#00H ; 1机器周期 RYCL:NOP ; 1机器周期 NOP ; 1机器周期 NOP ; 1机器周期 DJNZ R7,RYCL ; 2机器周期 RET ; 2机器周期 程序运行共需要机器周期=1+5*256+2=1283 1机器周期=12/6M=2us 1283*2us=2566us3.4.3.5 3.4.3.5 查表程序设计查表程序设计 查查表表程程序序是是一
23、一种种常常用用程程序序, ,它它广广泛泛使使用用于于LEDLED显显示示控控制制、 打打印印机机打打印印控控制制、数数据据补补偿偿、数数值值计计算算、转转换换等等功功能能程程序序中中, , 这类程序具有简单、执行速度快等特点。这类程序具有简单、执行速度快等特点。 查查表表, , 首首先先要要求求建建立立一一个个表表格格。表表格格数数据据一一般般应应存存放放在在程程序序存存储储器器中中, ,在在编编程程时时可可以以很很方方便便地地通通过过DBDB或或DWDW伪伪指指令令实实现现。然然后后,根根据据自自变变量量x x(可可以以为为规规则则变变量量或或非非规规则则变变量量),通通过过查查表表指指令令
24、,在在表表格格中中查查找找与与其其相相对对应应的的值值y y(可可以以是是单单字字节节、多字节等情况)。多字节等情况)。 MCS MCS 51 51具有很强的查表功能,其查表指令有如下两条具有很强的查表功能,其查表指令有如下两条: : MOVC A, A+PC MOVC A, A+PC MOVC A, A+DPTR MOVC A, A+DPTR 【例3】:设设有有一一个个巡巡回回检检测测报报警警装装置置, , 需需对对1616路路输输入入进进行行控控制制, , 每每路路有有一一个个额额定定的的最最大大值值, , 是是双双字字节节数数。当当检检测测量量大大于于该该路路对对应应的的最最大大值值时时
25、, , 就就越越限限报报警警。假假设设 R2 R2 为为保保存存检检测测路路数数的的寄存器寄存器, , 将其对应的最大额定值存放于将其对应的最大额定值存放于31H31H和和32H32H单元中。单元中。 查找最大额定值查找最大额定值的程序如下的程序如下: : FMAX: MOV A, R2 FMAX: MOV A, R2 ADD A, R2 ; ADD A, R2 ;表中一个额定值为表中一个额定值为2 2个字节个字节 MOV 31H, AMOV 31H, A MOV DPTR, MOV DPTR, TAB ;TAB ;表首址表首址 MOVC A, A+DPTR ;MOVC A, A+DPTR ;
26、查表读取第一个字节查表读取第一个字节XCH A, 31H ;XCH A, 31H ;第一个字节内容存入第一个字节内容存入31H31H INC DPTRINC DPTR MOVC A, A+DPTR ;MOVC A, A+DPTR ;查表读取第二个字节查表读取第二个字节 MOV 32H, A ;MOV 32H, A ;第二字节的内容存入第二字节的内容存入32H32H ORG 2000H ORG 2000H TAB: DW 1230H, 1450H, 1020H,. TAB: DW 1230H, 1450H, 1020H,. DW 2230H, 2440H, 1356H,.DW 2230H, 24
27、40H, 1356H,. 3.4.3.64.3.6 子程序设计子程序设计 子程序的概念子程序的概念 在在程程序序设设计计的的实实践践中中,经经常常会会遇遇到到在在不不同同的的程程序序中中或或在在同同一一程程序序不不同同的的地地方方,要要求求实实现现某某些些相相同同的的操操作作,为为了了简简化化程程序序设设计计、缩缩短短程程序序设设计计的的周周期期、节节省省内内存存空空间间,通通常常把把这这些些基基本本操操作作编编写写为为独独立立的的、标标准准化化的的通通用用程程序序段段, , 以以供供不不同同程程序序或或同同一程序反复调用,这些独立的程序段称为子程序。一程序反复调用,这些独立的程序段称为子程序
28、。 子程序调用子程序调用 主主程程序序对对子子程程序序的的调调用用是是通通过过调调用用指指令令ACALLACALL或或LCALLLCALL实实现现的。子程序的首址必须有地址标号以供调用指令寻址。的。子程序的首址必须有地址标号以供调用指令寻址。 子程序执行结束后必须返回主程序,返回指令为子程序执行结束后必须返回主程序,返回指令为RETRET。 参数传递参数传递 为为使使子子程程序序具具有有通通用用性性,子子程程序序处处理理过过程程中中用用到到的的数数据据都都由由主主程程序序提提供供,主主程程序序在在调调用用子子程程序序时时必必须须将将具具体体的的数数据据传传递递给给子子程序,这些数据称为入口参数
29、。程序,这些数据称为入口参数。 另另一一方方面面,子子程程序序的的某某些些执执行行结结果果也也必必须须送送回回到到主主程程序序,供供主主程序使用,这些结果数据称为出口参数。程序使用,这些结果数据称为出口参数。参数传递的方法通常有:参数传递的方法通常有: 寄存器或累加器传递寄存器或累加器传递 寄存器间址传递寄存器间址传递 堆栈传递堆栈传递MCS-51MCS-51程序总体结构程序总体结构 MCS-51MCS-51汇汇编编语语言言源源程程序序一一般般由由主主程程序序、完完成成特特定定操操作作的的子子程程序序( (可可能能不不止止一一个个) )及及相相应应功功能能的的中中断断服服务务程程序序等等部部分
30、分组组成成,结构如下:结构如下:;-程序头程序头( (即定义变量和等值符号即定义变量和等值符号)-)-SCLSCLBIT P1.2BIT P1.2;定义定义SCLSCL位变量位变量ByteConByteConDATA 30HDATA 30H ;定义字节变量定义字节变量ByteConByteCon 3.3.4.4 4.4 单片机汇编语言程序设计单片机汇编语言程序设计举例举例补充:补充:;-程序区程序区- ORG 0000H ORG 0000H LJMP Main LJMP Main;-中断矢量区中断矢量区- - ORG 0003H ORG 0003H LJMP INT0 LJMP INT0 ;-
31、主程序主程序- - ORG ORG yyyyyyyy ; ;其中其中yyyyyyyy就是主程序代码存放区的首地址就是主程序代码存放区的首地址MainMain:MOV SP, #5FHMOV SP, #5FH ;初始化有关寄存器,如设置堆栈指针初始化有关寄存器,如设置堆栈指针SPSP、选择选择 ;工作寄存器组、初始化中断控制寄存器等;工作寄存器组、初始化中断控制寄存器等 ; ; 主程序实体,具体指令由程序功能决定主程序实体,具体指令由程序功能决定 LCALL SUB1LCALL SUB1 ; ; 调用子程序调用子程序1 1,其中,其中SUB1SUB1为子程序名为子程序名 ;-子程序结构子程序结构
32、- - ORG zzzz ORG zzzz ;其中其中zzzzzzzz就是子程序代码存放区的首地址,就是子程序代码存放区的首地址, ;可以不用;可以不用ORGORG指令,直接将子程序存放主程序后指令,直接将子程序存放主程序后SUB1SUB1:PUSH PSWPUSH PSWPUSH AccPUSH Acc ;通过通过PUSHPUSH指令保护子程序中用到的有关寄存器,指令保护子程序中用到的有关寄存器, ;如;如AccAcc、PSWPSW等,即保护现场。等,即保护现场。 ;子程序实体,具体指令由程序功能决定;子程序实体,具体指令由程序功能决定POP AccPOP AccPOP PSWPOP PSW
33、 ;恢复现场恢复现场RETRET ;子程序最后一条指令,使子程序指令运行结束子程序最后一条指令,使子程序指令运行结束 ;后,返回主程序断点;后,返回主程序断点;-中断服务程序结构中断服务程序结构- - ORG ORG kkkkkkkk;其中其中kkkkkkkk就是中断程序代码存放区的首地址就是中断程序代码存放区的首地址PUSH PSWPUSH PSWPUSH AccPUSH Acc;保护现场。保护现场。 ;中断服务程序实体,具体指令由程序功能决定;中断服务程序实体,具体指令由程序功能决定POP AccPOP AccPOP PSWPOP PSW;恢复现场恢复现场CLR TI CLR TI ;清除
34、中断标志清除中断标志( (在在MCS-51MCS-51中,对于电平触发的中,对于电平触发的 ;外中断;外中断INT0INT0和和INT1INT1、串行接收及发送中断串行接收及发送中断RIRI、 ;TITI等,不自动清除,需要通过等,不自动清除,需要通过CLRCLR指令清除。指令清除。RETIRETI;中断服务程序最后一条指令,返回主程序断点中断服务程序最后一条指令,返回主程序断点;-汇编结束汇编结束-END END 例:例:定时程序设计定时程序设计 在单片机的控制应用中,常有定时的需要,如定时中断、在单片机的控制应用中,常有定时的需要,如定时中断、定时检测和定时扫描等。定时功能除了可以使用定时
35、器定时检测和定时扫描等。定时功能除了可以使用定时器/ /计数器计数器实现之外,还可以使用软件定时程序来完成。实现之外,还可以使用软件定时程序来完成。 定时程序是典型的循环程序,它可以通过执行一个具有固定时程序是典型的循环程序,它可以通过执行一个具有固定延迟时间的循环体来实现延时。定延迟时间的循环体来实现延时。利用单循环实现短定时利用单循环实现短定时 DL: MOVDL: MOV R5,#TIME R5,#TIME LOOP: NOP LOOP: NOP NOP NOP DJNZ DJNZ R5,LOOP R5,LOOP RET RET设晶振频率为设晶振频率为6MHz,6MHz,则这个程序的最长
36、定时时间为:则这个程序的最长定时时间为:2568us2568us利用多重循环实现较长时间定时利用多重循环实现较长时间定时 多重循环,即在一个循环体中又包含了其它的循环,是多重循环,即在一个循环体中又包含了其它的循环,是实现延时程序的常用方法。实现延时程序的常用方法。 【例例2 2】设晶振频率为设晶振频率为12MHz12MHz,设计延迟时间为设计延迟时间为100ms100ms的子程序。的子程序。 使使用用“DJNZ”DJNZ”指指令令实实现现延延迟迟,晶晶振振频频率率为为12MHz12MHz,则则一一个个机机器器周周期期为为1us1us,执执行行一一条条DJNZ DJNZ RnRn,relrel
37、的的指指令令的的时时间间为为两两个个机机器器周周期期即即2s2s。即即使使指指定定寄寄存存器器或或存存储储单单元元初初值值为为FFHFFH,减减到到0 0的的延延迟迟时时间间也也只只有有2562s2562s,远远小小于于所所需需的的延延迟迟时时间间,因此需要双循环结构。因此需要双循环结构。 对对于于双双循循环环结结构构,在在知知道道系系统统的的晶晶振振频频率率之之后后,延延时时时时间主要与两个因素有关:间主要与两个因素有关: 1 1)内循环中指令的执行时间;)内循环中指令的执行时间; 2 2)外循环时间常数(内循环的循环次数)的设置。)外循环时间常数(内循环的循环次数)的设置。; *; *延迟
38、延迟100 ms100 ms子程序子程序*; ; 子程序名称:子程序名称:Delay100 Delay100 Delay100:Delay100: PUSH PSW PUSH PSW CLR RS0 CLR RS0 SETB RS1 SETB RS1 MOV R7,#0C7H MOV R7,#0C7H LOOP1:LOOP1: MOV R6,#0FAH MOV R6,#0FAHLOOP2:LOOP2: DJNZ R6, LOOP2 ; DJNZ DJNZ R6, LOOP2 ; DJNZ指令执行时间为指令执行时间为2 2个机器周期,而个机器周期,而R6R6初值初值 ;为;为FAH(FAH(即即250)250),则,则R6R6减到减到0 0,需,需500us500us。 DJNZ R7, LOOP1 ; DJNZ R7, LOOP1 ; 重装重装R6R6初值指令及初值指令及“DJNZ R7,LOOP1”DJNZ R7,LOOP1” ;执行时间为执行时间为3s3s,则需要进行则需要进行199199次,次, ;因此;因此R7R7初值设为初值设为C7HC7H POP PSW POP PSW RET RET 作业作业:P87页习题页习题 15,19