收藏 分销(赏)

2022年单片机教程-4.ppt

上传人:二*** 文档编号:12674913 上传时间:2025-11-22 格式:PPT 页数:71 大小:415.54KB 下载积分:5 金币
下载 相关 举报
2022年单片机教程-4.ppt_第1页
第1页 / 共71页
本文档共71页,全文阅读请下载到手机保存,查看更方便
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第4章 89C51汇编语言程序设计,汇编语言是面向机器硬件的语言,,要求程序设计者对89C51单片机具有很好的,“软、硬结合”,的功底。,介绍,程序设计的基本知识,及如何,使用汇编语言来进行基本的程序设计。,4.1 汇编语言程序设计概述,程序是若干指令的有序集合,单片机的运行就是执行这一指令序列的过程,编写这一指令序列的过程称为,程序设计,。,4.1.1 机器语言、汇编语言和高级语言,用于程序设计的,语言基本上分为3种:机器语言、汇编语言和高级语言,。,二进制代码表示的指令、数字和符号简称为机器语言不易懂,难记忆,易出错。,2汇编语言,英文助记符表示的指令称为,符号语言,或,汇编语言,将汇编语言程序转换成为二进制代码表示的机器语言程序称为,汇编程序,经汇编程序“汇编(翻译)”得到的机器语言程序称为,目标程序,,原来的汇编语言程序称为,源程序,。,汇编语言特点,:,面向机器的语言,程序设计员须对,89C51,的硬件有相当深入的了解。,助记符指令和机器指令一一对应,用汇编语言编写的,程序效率高,,占用,存储空间小,,运行,速度快,,用汇编语言能编写出最优化的程序。,能,直接管理和控制硬件设备,(功能部件),它能处理中断,也能直接访问存储器及,I/O,接口电路。,汇编语言和机器语言都脱离不开具体机器的硬件,均是面向“机器”的语言,缺乏通用性。,3高级语言,不受具体机器的限制,使用了许多数学公式和数学计算上的习惯用语,,非常擅长于科学计算。,常用的如,BASIC、FORTRAN,以及,C,语言等。,高级语言,优点,:通用性强,直观、易懂、易学,可读性好。,计算机不能直接识别和执行高级语言,需要将其“翻译”成机器语言才能识别和执行,进行“翻译”的专用程序称为,编译程序,。,使用,C,语言(C51)、,BASIC,语言来进行AT89C51的应用程序设计。,对于程序的空间和时间要求很高的场合,汇编语言仍是必不可缺的。,C语言和汇编语言混合编程,在很多需要,直接控制硬件,的应用场合,则更是非用汇编语言不可,使用,汇编语言编程,,是单片机程序设计的,基本功之一,4.1.2 汇编语言语句的种类和格式,两种基本类型:,指令语句,和,伪指令语句,(1)指令语句,已在第3章介绍,每一条指令语句在汇编时都产生一个指令代码机器代码,(2)伪指令语句,是为汇编(翻译)服务的。在汇编时,没有机器代码与之对应。,AT89C51的汇编语言的,四分段格式,如下:,标号字段 操作码字段 操作数字段 注释字段,规则:,(1)标号字段和操作字码段之间要有冒号“:”相隔;,(2)操作码字段和操作数字段间的分界符是空格;,(3)双操作数之间用逗号相隔;,(4)操作数字段和注释字段之间的分界符用分号“;”相隔。,(5)一条语句可以没有标号,标号的有无取决于本程序中的其他语句是否访问该条语句。,操作码字段为必选项,其余各段为任选项。,例4-1,下面是一段汇编语言程序的四分段书写格式,标号字段,操作码字段,操作数字段,注释字段,START:MOV A,#00H ;0A,MOV R1,#10 ;10R1,MOV R2,#00000011B ;3R2,LOOP:ADD A,R2 ;(A)+(R2)A,DJNZ R1,LOOP;R1内容减1不为零,则循环,NOP,HERE:SJMP HERE,基本语法规则:,1标号字段,是语句所在地址的标志符号,(1)标号后边必须跟以冒号“:”,(2)由1-8个ASCII字符组成,(3)同一标号在一个程序中只能定义一次,(4)不能使用汇编语言已经定义的符号作为标号,2操作码字段,是汇编语言指令中,唯一不能空缺,的部分。汇编程序就是,根据这一字段来生成机器代码,的。,3操作数字段,通常有单操作数、双操作数和无操作数三种情况。如果是双操作数,则操作数之间,要以逗号隔开。,(1)十六进制、二进制和十进制形式的操作数表示,采用十六进制形式来表示,某些特殊场合才采用二进制或十进制的表示形式。,十六进制,后缀“H”,。,二进制,后缀“B”,。,十进制,后缀“D”,,,也可省略,。,若十六进制的,操作数以字符A,-,F,中的某个开头时,则需在它,前面加一个“0”,,以便在汇编时把它和字符A,F区别开来。,(2)工作寄存器和特殊功能寄存器的表示,采用工作寄存器和特殊功能寄存器的代号来表示,也可用其地址来表示。,例如,,累加器可用,A(或Acc),表示。也可用,0E0H,来表示,0E0H为累加器A的地址。,4注释字段,必须以分号“;”开头,换行书写,但必须注意也要以分号“;”开头。,汇编时,注释字段不会产生机器代码。,4.1.3 伪指令,在AT89C51 汇编语言源程序中应有向汇编程序发出的指示信息,告诉它,如何完成汇编工作,,这是通过使用伪指令来实现的。,也称为汇编程序控制命令。只有在汇编前的源程序中才有伪指令。,经过汇编得到,目标程序(机器代码),后,伪指令,已无存在的必要,所以,“伪”,体现在汇编时,,伪指令没有相应的机器代码产生,。,常用的伪指令,:,1.ORG(ORiGin)汇编起始地址命令,在汇编语言源程序的开始,通常都用一条ORG伪指令来实现规定程序的起始地址。如不用ORG规定,则汇编得到的目标程序将从0000H开始。例如:,ORG 2000H,START:MOV A,#00H,规定标号START代表地址为2000H开始。,在一个源程序中,,可,多次,使用ORG指令,,来规定不同的程序段的起始地址。但是,,地址必须由小到大排列,地址不能交叉、重叠,。例如:,ORG 2000H,ORG 2500H,ORG 3000H,2.END(END of assembly)汇编终止命令,汇编语言源程序的结束标志,用于终止源程序的汇编工作。在整个源程序中只能有一条END命令,且位于程序的最后。,3DB(Define Byte)定义字节命令,在程序存储器的连续单元中定义字节数据。,ORG 2000H,DB 30H,40H,24,“C”,“B”,汇编后:,(2000H)=30H,(2001H)=40H,(2002H)=18H(10进制数24),(2003H)=43H(字符“C”的ASCII码),(2004H)=42H(字符“B”的ASCII码),DB功能是,从指定单元开始定义(存储)若干个字节,,汇编后:,(2000H)=,12H,;第1个字,(2001H)=,46H,(2002H)=00H;第2个字,(2003H)=7BH,(2004H)=00H;第3个字(2005H)=0AH,(2005H)=0AH,5EQU(EQUate)赋值命令,用于,给标号赋值,。赋值以后,其标号值在整个程序有效。,例如,:,TEST EQU 2000H,表示标号TEST=2000H,在汇编时,凡是遇到标号TEST时,均以2000H来代替。,4.2 汇编语言源程序的汇编,汇编语言源程序“翻译”成机器代码(指令代码)的过程称为“,汇编,”。汇编可分为,手工汇编,和,机器汇编,两类:,4.2.1 手工汇编,人工查表翻译指令,。但遇到的相对转移指令的偏移量的计算,要根据转移的目标地址计算偏移量,不但麻烦,且容易,出错。,4.2.2 机器汇编,用编辑软件进行源程序的,编辑,。编辑完成后,生成一个ASCII码文件,,扩展名为“.ASM”,。然后在微计算机上运行汇编程序,把汇编语言源程序翻译成机器代码。,交叉汇编,-汇编后的机器代码是在另一台计算机(这里是单片机)上运行。,反汇编,分析现成产品的程序,要将二进制的机器代码语言程序翻译成汇编语言源程序。,例4-2,下面是一段源程序的汇编结果,读者可通过查,第3章的指令表,,进行手工汇编,来验证下面的汇编结果是否正确。,见表4-1,4.3 AT89C51单片机汇编语言程序设计举例,4.3.1 子程序的设计,在实际的程序设计中,常常将那些需多次应用的、完成相同的某种基本运算或操作的程序段从整个程序中独立出来,,单独编成一个程序段,,需要时通过子程序调用指令进行调用。这样的程序段称为子程序。,采用子程序能,使整个程序结构简单,缩短程序的设计时间,减少占用的程序存储空间,。调用子程序的程序称为主程序或调用程序。,子程序在程序设计中非常重要,读者应熟练掌握子程序的设计方法。,1.子程序设计原则和应注意的问题,一种能完成某一特定任务的程序段,。其资源要为所有调用程序共享。因此,子程序在结构上应具有独立性和通用性。,编写子程序时应注意以下问题:,(1),子程序的第一条指令的地址称为子程序的入口地址。该指令前,必须有标号,。,(2),主程序调用子程序,两条子程序调用指令:,绝对调用指令:ACALL addr11,长调用指令:LCALL addr16,(3),注意设置堆栈指针和现场保护,(4),最后一条指令必须是RET指令,(5),子程序可以嵌套,即,子程序可以调用子程序,2.子程序的基本结构,MAIN:;MAIN为主程序或调用程序标号,LCALL SUB;调用子程序SUB,4.3.3 查表程序设计,数据补偿、修正、计算、转换等各种功能,具有程序简单、执行速度快等优点。,查表就是根据自变量,x,在表格中寻找,y,使y=f(x),。,执行查表指令时,发出,读程序存储器选通脉冲,PSEN,*,。指令系统,给用户提供了,两条极为有用的查表指令:,MOVCA,A+DPTR,MOVCA,A+PC,MOVC A,A+DPTR,完成把A中的内容作为一个无符号数与DPTR中的内容相加,所得结果为某一程序存储单元的地址,然后把该地址单元中的内容送到累加器A中。,MOVCA,A+PC,以PC作为基址寄存器,PC的内容和A的内容作为无符号数,相加后所得的数作为某一程序存储器单元的地址,根据地址取,出程序存储器相应单元中的内容送到累加器A中。,指令执行完,PC的内容不发生变化,仍指向查表指令的下一条指令。,优点,:预处理较少且不影响其它特殊功能寄存器的值,所以不必保护其它特殊功能寄存器的原先值,缺点:,在于该表格,只能存放在,这条指令的地址X3X2X1X0以下的,00FFH,之中。表格,所在的程序空间受到了限制。,例4-3,设计一子程序,功能为:根据累加器A中的数x(09之间)查x的平方表y,根据x的值查出相应的平方y。x和y均为单字节数。,地 址 子程序,Y3Y2Y1Y0 ADD A,#01H,Y3Y2Y1Y0+2,MOVC A,A+PC,Y3Y2Y1Y0+3 RET,Y3Y2Y1Y0+4,DB,00H,01H,04H,09H,10H,DB,19H,24H,31H,40H,51H,第1条指令,ADD A,#01H 的作用,是加上偏移量,可,以根据A的内容查出X对应的平方。,MOVCA,A+DPTR,这条指令的应用范围较为广泛,一般情况下,,大多使用该指令,,使用该指令时不必计算偏移量,使用该指令的,优点,是表格可以设,在64K程序存储器空间内的任何地方,,而不像 MOVC A,A+PC那样只设在PC下面的256个单元中,使用较方便。,上面的程序可改成如下形式:,PUSH DPH ;保存DPH,PUSH DPL ;保存DPL,例4-4,设有一个,巡回检测报警装置,,需对16路输入进行检测,,每路有一最大允许值,为双字节数。,运行时,需根据,测量的路数,找出每路的最大允许值。看输入值是否大于最大允许值,如大于就报警。根据上述要求,编一个查表程序。取路数为x(0 x15),y为最大允许值,放在表格中。设进入查表程序前,,路数x已放于,R2,中,,查表后,最大值,y,放于,R3、R4,中。本例中的,x为,单字节数,,,y为,双字节数,。查表程序如下:,TB3:MOV A,R2,ADD A,R2 ;(R2)*2(A),MOV R3,A ;保存指针,ADD A,#6 ;加偏移量,MOVC A,A+PC,;查第一字节,XCH A,R3,ADD A,#3,MOVC A,A+PC,;查第二字节,MOV R4,A,RET,TAB3:,DW,1520,3721,42645,7580,;最大值表,DW,3483,32657,883,9943,DW,10000,40511,6758,8931,DW,4468,5871,13284,27808,表格长度不能超过256个字节,且表格只能存放于MOVC A,A+PC指令以下的256个单元中。,如需要把表格放在64KB程序存储器空间的任何地方,,此时应使用指令“MOVC A,A+DPTR”,并对DPH、DPL进行运算,求出表格的目的地址。,例4-5,在一个以AT89C51单片机为核心的温度控制器中,温度传感器输出的,电压与温度为非线性关系,,传感器输出的电压已由A/D转换为10位二进制数。测得的不同温度下的电压值数据构成一个表,表中,温度值为y,(双字节无符号数),,x,(双字节无符号数),为电压值数据,。设,测得的电压值x,放入R2R3中,根据电压值x,,查找对应的温度值y,,仍放入R2R3中。,LTB2:MOVDPTR,#TAB2,MOV A,R3,CLR C,RLC A,MOV R3,A,XCH A,R2,RLC A,XCH R2,A,ADD A,DPL;(R2R3)+(DPTR)(DPTR),MOV DPL,A,MOV A,DPH,ADDC A,R2,MOV DPH,A,CLR A,MOVC A,A+DPTR;查第一字节,MOV R2,A;第一字节存入R2中,CLR A,INC DPTR,MOVC A,A+DPTR;查第二字节,MOV R3,A;第二字节存入R3中,RET,TAB2:DW;温度值表,由于,使用指令“MOVC A,A+DPTR,”,表TAB2可放入,64KB程序存储器空间的任何位置,,此外,表格的长度,可大于256B。,4.3.3 关键字查找程序设计,顺序检索和对分检索,1.顺序检索,从第1项开始逐项顺序查找,判断所取数据是否与关键字相等。,例4-6,从50个字节的无序表中查找一个关键字,XXH,。,ORG 1000H,MOV 30H,,#,XX,H,;关键字,XXH,送30H单元,MOV R1,#50,;查找次数送R1,MOV A,#14,;修正值送A,MOV DPTR,#TAB4,;表首地址送DPTR,LOOP:PUSH ACC,MOVC A,A+PC,;查表结果送A,CJNE A,40H,LOOP1;,(40H)不等于关键字则;转LOOP1,MOV R2,DPH;,已查到关键字,把该字,;的地址送R2,R3,MOV R3,DPL ;,DONE:RET,LOOP1:POP ACC,;修正值弹出,INC A,;A+1A,INC DPTR,;修改数据指针DPTR,DJNZ R1,LOOP,;R10,未查完,继续查找,MOV R2,#00H,;,R1=0,清“0”R2 和R3,MOV R3,#00H,;表中50个数已查完,AJMPDONE,;从子程序返回,TAB4:DB,,,;,50个无序数据表,4.3.4 数据极值查找程序设计,在指定的数据区中,找出最大值(或最小值)。,进行数值大小的比较,从这批数据中找出最大值(或最小值)并存于某一单元中。,例4-7,片内RAM中存放一批数据,查找出最大值并存放于首地址中。设,R0,中存首地址,,R2,中存放字节数,程序框图如,图4-1,所示。,程序如下:,MOV R2,#n,;n为要比较的数据字节数,MOV A,R0,;存首地址指针,图4-1,MOVR1,A,DEC R2;,MOV A,R1,LOOP:MOVR3,A,DECR1,CLRC,SUBBA,R1,;两个数比较,JNCLOOP1,;C=0,A中的数大,跳LOOP1,MOVA,R1,;C=1,则大数送A,SJMPLOOP2,LOOP1:MOVA,R3,LOOP2:DJNZR2,LOOP,;是否比较结束?,MOVR0,A,;存最大数,RET,4.3.5 数据排序程序设计,升序排,降序排,。仅介绍无符号数据,升序排,。,冒泡法:,相邻数互换的排序方法,类似水中气泡上浮。,排序时,从前向后进行相邻两个数的比较,次序与要求的顺序不符时,就将两个数互换;顺序符合要求不互换。,假设有7个原始数据的排列顺序为:6、4、1、2、5、7、3。,第一次冒泡的过程是,:,6、4、1、2、5、7、3,;原始数据的排列,4,、,6,、1、2、5、7、3,;逆序,互换,4、,1,、,6,、2、5、7、3,;逆序,互换,4、1、,2,、,6,、5、7、3,;逆序,互换,4、1、2、,5,、,6,、7、3,;逆序,互换,4、1、2、5、,6,、,7,、3,;正序,不互换,4、1、2、5、6、,3,、,7,;逆序,互换,第一次冒泡结束,如此进行,各次冒泡的结果如下,:,第1次冒泡结果:4、1、2、5、6、3、7,第2次冒泡结果:1、2、4、5、3、6、7,第3次冒泡结果:1、2、4、3、5、6、7,第4次冒泡结果:1、2、3、4、5、6、7;已完成排序,第5次冒泡结果:1、2、3、4、5、6、7,第6次冒泡结果:1、2、3、4、5、6、7,对于n个数,理论上应进行(n-1)次冒泡,有时不到(n-1)次就已完成排序。,如何判定,排序是否已完成,,看各次冒泡中是,否有互换发生,,如有数据互换,则排序未完成。,在程序设计中,常使用,设置互换标志,的方法,该标志的状态表示在一次冒泡中是否有互换进行。,例4-8,一批单字节无符号数,以R0为首地址指针,R2中为字节数,将这批数进行升序排列。程序框图如,图4-2,所示。,图4-2,SORT:MOV A,R0;,MOV R1,A,MOV A,R2;字节数送入R5,MOV R5,A,CLR F0;互换标志位F0清零,DEC R5;,MOV A,R1;,LOOP:MOV R3,A;,INC R1;,CLR C;,MOV A,R1;比较大小,SUBB A,R3;,JNC LOOP1;,SETB F0;互换标志位F0置1,MOV A,R3;,XCH A,R1;两个数互换,DEC R1;,XCH A,R1;,INC R1,LOOP1:MOV A,R1,DJNZ R5,LOOP,JB F0,SORT,RET,4.3.6 分支转移程序设计,特点是程序中含有转移指令,转移指令有分为,无条件转移,和,有条件转移,,因此分支程序也可分为无条件分支转移程序和有条件分支转移程序。有条件分支转移程序按结构类型来分,又分为,单分支转移,结构和,多分支转移,结构。,1单分支转移结构,仅有两个出口,两者选一。,例4-9,求单字节有符号数的二进制补码,程序框图如,图4-3,所示:,参考程序:,CMPT:JNB Acc.7,RETURN,;(A)0,不需转换,MOV C,Acc.7,;符号位保存,CPL A,;(A)求反,加1,ADD A,#1,;,MOV Acc.7,C;符号,位存A的最高位,RETURN:RET,图4-3,此外,单分支选择结构还有如,图4-4、图4-5,等所示的几种形式:,图4-4,图4-5,2多分支转移结构,程序的判别部分有两个以上的出口。,常见的两种形式。如,图4-6,和,图4-7,。,指令系统提供了非常有用的,两种多分支选择指令,:,间接转移指令:JMP A+DPTR;,比较转移指令:CJNE A,direct,rel;,CJNE A,#data,rel;,CJNE Rn,#data,rel;,CJNE Ri,#data,rel;,图4-6,图4-7,最简单的分支转移程序的设计,一般常采用,逐次比较法,,就是把所有不同的情况一个一个的进行比较,发现符合就转向对应的处理程序。这种方法的主要,缺点,是程序太长,有n种可能的情况,就需有n个判断和转移。,例4-10,求符号函数的值,。,符号函数定义(略):,X,存放在40H单元,,Y,存放在41H单元,程序框图如,图4-6,所示。,程序如下:,SIGNFUC:MOV A,40H,CJNE A,#00H,NZEAR,AJMP NEGT,NZEAR:JB Acc.7,POSI,MOV A,#01H,CMPT:JNB Acc.,操作码字段为必选项,其余各段为任选项。,PUSH ACC;,MOV R5,A,经汇编程序“汇编(翻译)”得到的机器语言程序称为目标程序,原来的汇编语言程序称为源程序。,LOOP:MOV A,R4,MOV R2,#n;,但是,地址必须由小到大排列,地址不能交叉、重叠。,”开头,换行书写,但必须注意也要以分号“;,ORG 2000H,DEL:MOV R7,#200,LOOP:MOV A,R4,只有在汇编前的源程序中才有伪指令。,间接转移指令:JMP A+DPTR;,MOV A,#14 ;,AJMP NEGT,POSI:MOV A,#81H,NEGT:MOV 41H,A,END,在实际的应用中,经常遇到的,图4-7,结构形式的分支转移程序的设计,需根据某一单元的内容是0,1,n,来分别转向处理程序0,处理程序1,处理程序n。,一个,典型的例子,就是当单片机系统中的,键盘按下时,,就会得到一个键值,,根据不同的键值,跳向不同的键处理程序入口。,对于这种情况,可用直接转移指令(LJMP或AJMP指令)组成一个转移表,然后把该单元的内容读入累加器A,转移表首地址放入DPTR中,再利用间接转移指令实现分支转移。,例4-12,根据寄存器R2的内容,转向各个处理程序PRGX(X=0-n)。,(R2)=0,转PRG0,(R2)=1,转PRG1,(R2)=n,转PRGn,4.3.7 循环程序设计,特点是程序中含有可以反复执行的程序段,该程序段通常称为循环体。例如求100个数的累加和,则没有必要连续安排100条加法指令,可以只用一条加法指令并使其循环执行100次。,(1)可大大缩短程序长度(2)使程序所占的内存单元数量少(3)使程序结构紧凑和可读性变好。,1.循环程序的结构,循环结构程序主要由以下四部分组成。,(1)循环初始化,循环初始化程序段用于完成循环前的的准备工作。例如,循环控制计数初值的设置、地址指针的起始地址的设置、为变量预置初值等。,(2)循环处理,循环程序结构的核心部分,完成实际的处理工作,是需反复循环执行的部分,故又称循环体。这部分程序的内容,取决于实际处理问题的本身。,(3)循环控制,在重复执行循环体的过程中,不断修改循环控制变量,直到符合结束条件,就结束循环程序的执行。循环结束控制方法分为循环计数控制法和条件控制法,(4)循环结束,这部分是对循环程序执行的结果进行分析、处理和存放。,2.,循环结构的控制,图4-8,是计数循环控制结构,,图4-9,是条件控制结构。,图4-8,图4-9,(1)计数循环结构,计数循环控制结构是依据计数器的值来决定循环次数,一般为减“1”计数器,计数器减到“0”时,结束循环。计数器的初值是在初始化时设定。,AT89C51的指令系统提供了功能极强的循环控制指令:,DJNZ Rn,rel;工作寄存器作控制计数器,DJNZ direct,rel;以直接寻址单元作控制计数,器。,计数控制方法只有在循环次数已知的情况下才适用。对循环次数未知的问题,不能用循环次数来控制。往往需要根据某种条件来判断是否应该终止循环。,例如,,计算n个数据的和。程序框图见,图4-10,。,例4-12,如果,xi,均为单字节数,并按,i,顺序存放在51单片机内部RAM从50H开始的单元中,,n,放在R2中,现将要求的和(双字节)放在R3R4中,程序如下:,ADD1:MOVR2,#n;加法次数,n,送R2,MOV R3,#0,MOV R4,#0,MOV R0,#50H,LOOP:MOV A,R4,ADD A,R0,MOV R4,A,INC R0,CLR A,ADDC A,R3,MOV R3,A,DJNZ R2,LOOP ;判加法循环次数是否已到?,计数控制方法只有在循环次数已知的情况下才适用。对循环次数未知的问题,不能用循环次数来控制,往往需要根据某种条件来判断是否应该终止循环。,图4-10,(2)条件控制结构,例4-13,设有一串字符,依次存放在内部RAM从30H单元开始的,连续单元中,该,字符串以0AH为结束标志,,编写测试字符,串长度的程序。,本例采用逐个字符,依次与“0AH”比较,的方法。为此设置一个长度计数器和一个字符串指针。,长度计数器用来累计字符串的长度,字符串指针用于指定字符。,如果指定字符与“0AH”,不相等,则长度计数器和字符串指针都加1,以便继续往下比较;如果比较相等,则表示该字符为“0AH”,字符串结束,长度计数器的值就是字符串的长度。程序如下:,MOV R4,#0FFH;长度计数器初值送R4,MOV R1,#2FH;字符串指针初值送R1,NEXT:INC R4,INC R1,CJNE R1,#0AH,NEXT;比较,不等则进行下一个,;字符比较,END,上面两个例子都是在一个循环程序中不再包含其他循环程序,则称该循环程序为,单循环程序,。,如果一个循环程序中包含了其他循环程序,则称为,多重循环程序,。这也是经常遇到的实际问题。,最常见的,多重循环,是由,DJNZ指令,构成的软件延时程序,,它是常用的程序之一。,例4-14,50ms延时程序。,延时程序与指令执行时间有很大的关系。在使用12MHz晶振时,一个机器周期为1s,执行一条DJNZ指令的时间为2s。这时,可用双重循环方法写出延时50ms的程序:,DEL:MOV R7,#200,DEL1:MOV R6,#125,DEL2:DJNZ R6,DEL2,;125*2=250s,DJNZ R7,DEL1,;0.25ms*200=50ms,RET,以上延时程序不太精确,它没有考虑到除“DJNZ R6,DEL2”指令外的其它指令的执行时间,如把其它指令的执行时间,计算在内,它的,延时时间为,:,如果要求比较精确的延时,应该考虑对上述程序进行修改,才能得到较为精确的延时时间。,注意,,用软件实现延时程序,不允许有中断,否则将严重影响定时的准确性。,对于需,延时更长的时间,,可采用更多重的循环,如1s延时,可用三重循环。,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 初中其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服