




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章汇编语言程序设计教学目标4.1单片机汇编语言与指令格式4.2源程序的设计步骤和汇编4.3汇编语言程序设计本章小结思考题与习题第4章汇编语言程序设计教学目标1教学目标
通过本章教学,要求达到以下目标:1.熟悉汇编语言的语句结构;2.了解手工汇编,计算偏移量及转移地址的方法;3.了解程序设计的步骤,会画程序流程图;4.掌握顺序程序、分支程序、循环程序、子程序等基本程序的编制方法。
教学目标通过本章教24.1MCS51单片机汇编语言与指令格式4.1.1程序设计语言程序设计语言机器语言汇编语言高级语言4.1MCS51单片机汇编语言与指令格式4.1.1程序3机器语言
由于构成计算机的电子器件特性所决定,计算机只能识别二进制代码。这种以二进制代码来描述指令功能的语言,称之为机器语言,
用机器语言组成的程序,称为目标程序。计算机就是按照机器语言的指令来完成各种功能操作的,它具有程序简捷、占用存储空间小、执行速度快、控制功能强等特点。机器语言由于构成计算机的电子器件特4汇编语言用来替代机器语言的进行程序设计的一种语言,由助记符、保留字和伪指令等组成。很容易让人们所识别、记忆和读写。汇编语言编写出的程序是汇编语言源程序,可由“汇编程序”翻译成机器语言程序(即目标代码)。汇编语言用来替代机器语言的进行程序设计的一种语5MCS-51单片机汇编语言程序设计课件6汇编程序容易让人们所识别、记忆和读写,但不能为机器直接识别执行001010010101010101010101机器语言程序(即目标代码,机器可以识别执行010101010101)010101010101汇编程序容易让人们所识别、记忆和读写,001010010107高级语言
是面向过程和问题并能独立于机器的通用程序设计语言,是一种接近人们自然语言和常用数学表达式的计算机语言。高级语言编写的程序是不能被机器直接执行的,但可以被常驻在内存或磁盘上的解释程序或编译程序等编译成目标代码后才能被机器所执行。高级语言是面向过程和问题并能独立于机器的8独立于机器,可移植性强结构化设计,程序清晰,但是占用存储空间大编译程序001010010101010101010101机器语言程序(即目标代码,机器可以识别执行010101010101)010101010101独立于机器,可移植性强结构化设计,程序清晰,但是占用存储空间94.1.2格汇编语言格式MCS—51单片机汇编语言指令的标准格式如下:[标号:]操作码[目的操作数][,源操作数][;注释]例如:LOOP:ADDA,#10H;(A)←(A)+10H(1)方括号[]表示该项是可选项,可有可无。(2)标号是用户设定的符号,它实际代表该指令所在的地址。标号必须以字母开头,其后跟1~8个字母或数字,并以“:”结尾。
4.1.2格汇编语言格式MCS—51单片机汇编语言指令的标10(3)操作码是用英文缩写的指令功能助记符。它确定了本条指令完成什么样的操作功能。如:ADD表示加法操作。任何一条指令都必须有该助记符项,不得省略。(4)目的操作数提供操作的对象,并表示操作结果存放单元的地址,它与操作码之间必须以一个或几个空格分隔。如上例中A表示操作对象是累加器A的内容,并指出操作结果又回送A存放。[标号:]操作码[目的操作数][,源操作数][;注释]例如:LOOP:ADDA,#10H;(A)←(A)+10H(3)操作码是用英文缩写的指令功能助记符。它确定了11(5)源操作数指出的是一个源地址(或立即数),表示操作的对象或操作数来自何处。它与目的操作数之间要用“,”号隔开。(6)注释部分是在编写程序时,为了增加程序的可读性,由用户拟写对该条指令或该段程序功能的说明。它以分号“;”开头,可以用中文、英文或某些符号来表示,显然它不存入计算机,只出现在源程序中。[标号:]操作码[目的操作数][,源操作数][;注释]例如:LOOP:ADDA,#10H;(A)←(A)+10H(5)源操作数指出的是一个源地址(或立即数),表示操作的12操作数的5种合法形式1、数字形式:二进制、十进制、十六进制
#01001100B,#20D,#0A0H2、工作寄存器和特殊功能寄存器
R0~R7,ACC,SFR3、标号地址
MOVA,M ;设M已定义过 4、带加减算符的表达式
MOVA,M+15、采用$符
JNBTF0,$[标号:]操作码[目的操作数][,源操作数][;注释]例如:LOOP:ADDA,#10H;(A)←(A)+10H操作数的5种合法形式1、数字形式:二进制、十进制、十六进制[13指令性语句使CPU执行一个具体的操作。伪指令不要求计算机做任何操作,也没有对应的机器码,不产生目标程序,不影响程序的执行,仅仅是能够帮助进行汇编的一些指令。4.1.3汇编语言构成指令性语句:111条指令的助记符语句。指示性语句:伪指令语句。指令性语句使CPU执行一个具体的操作。4.1.3汇编语言1415
常用伪指令单片机汇编语言程序设计中,除了使用指令系统规定的指令外,还要用到一些伪指令。伪指令又称指示性指令,具有和指令类似的形式,但汇编时伪指令并不产生可执行的目标代码,只是对汇编过程进行某种控制或提供某些汇编信息。下面对常用的伪指令作一简单介绍。15常用伪15
用来指定程序或数据的起始位置;
给出一些连续存放数据的地址;
为中间运算结果保留一部分存储空间;
为源程序中的符号和标号赋值;
表示源程序结束等等。
不同版本的汇编语言,伪指令的符号和含义可能有所不同,但基本用法是相似的。伪指令可以用来指定程序或数据的起始位置;伪指令可16伪指令列表1、ORG--设置目标程序起始地址伪指令2、END--结束汇编伪指令3、DB--定义字节伪指令4、DW--定义字伪指令
5、DS--预留存储空间伪指令6、EQU--等值伪指令7、DATA--数据地址赋值8、BIT--位地址定义伪指令伪指令列表1、ORG--设置目标程序起始地址伪指令1718一、汇编起始指令ORG指令格式为:ORGnn该伪指令的功能是规定其后面的目标程序或数据块的起始地址。它放在一段源程序(主程序、子程序)或数据块的前面,说明紧跟在其后的程序段或数据块的起始地址就是ORG后面给出的地址。例如:
ORG2000H START:MOVA,#7FH
。。。。。。。18一、汇编起始指令ORG18例如:
ORG2000H START:MOVA,#7FH…格式:[标号:]ORG地址(十六进制表示)2000H1FFFH2001H机器码:747FH例如:…格式:[标号:]ORG地址(十六进制表示)201920
例:ORG2000HMOVSP,#60HMOVR0,#2FHMOVR2,#0FFHORG伪指令说明其后面程序的目标代码在存储器中存放的起始地址是2000H,即存储器地址程序代码
2000H7581602003H782F2005H7AFF20例:ORG2021二、汇编结束指令END指令格式:
[标号:]END地址或标号格式中标号以及END后面的地址或标号可有可无。功能:
提供汇编结束标志。汇编程序遇到END后就停止汇编,对END以后的语句不予处理,故END应放在程序的结束处。21二、汇编结束指令END2122三、等值指令EQU(Equal)指令格式:字符名称EQU数字或汇编符号功能:使指令中的字符名称等价于给定的数字或汇编符号。特别注意:必须先赋值后使用,同一个标号只能赋值一次。例:PAEQU8001H
即给字符PA赋值为8001H。22三、等值指令EQU(Equal)22书:131页。编程好习惯之一:上下对齐! ORG0500HAA EQUR1BB EQU10HDELAYEQU07E6H MOVR0,BB;R0←(10H)
MOVA,AA ;A←R1 ······················· LCALLDELAY;调07E6H子程序书:131页。编程好习惯之一:上下对齐!23
该伪指令的功能与EQU类似,可以将DATA右边表达式的值赋给左边的字符名称。表达式可以是常数、地址标号或表达式,但不可以是一个汇编符号(如R1等)。
DATA和EQU的主要区别是:EQU中的字符名称是先定义后使用,而DATA中的字符名称没有这种限制。
定义8位数据用DATA,定义16位数据用XDATA。格式:字符名称DATA表达式格式:字符名称EQU数字或汇编符号四、数据赋值指令DATA该伪指令的功能与EQU类似,可以将DATA右边2425五、定义字节指令DB指令格式:
[标号:]DB8位二进制数表功能:
把8位二进制数表依次存入从标号开始的连续的存储单元中。
标号区段可有可无,DB指令之后的8位二进制数表是一个字节常数或用逗号隔开的字节串,也可以是用引号括起来的ASCII码字符串
(一个ASCII字符相当于一个字节)。25五、定义字节指令DB25 ORG2000HTAB1:DB30H,8AH,73DB01011010B,‘5’,‘A’2000H2001H2002H2003H2004H2005H
由于ORG2000H,所以TAB1的地址为2000H,因此,以上伪指令经汇编后,将对2000H开始的连续存储单元赋值:;十进制数73以十六进制数存放;01011010B=5AH;35H是数字5的ASCII码;41H是字母A的ASCII码 ORG2000H2000H2001H2002H22627六、定义字指令DW指令格式:[标号:]DW16位数据表功能:与DB相似,区别仅在于从指定地址开始存放的是指令中的16位数据。每个16位数据要占两个存储单元,高8位先存,低8位后存,这和MCS-51指令中的16位数据存放顺序是一致的。27六、定义字指令DW27ORG1500HTAB2:DW1234H,80H,10
1500H汇编以后:1501H1502H1503H1504H1505HORG1500H1500H2829
七.定义空间伪指令DS
格式:[标号:]DS表达式
功能:从指定的地址开始,保留若干个存储单元作为备用的空间。
29七.定义空间伪指令DS29ORG1000HSPC:DS20HDB30H,8FH汇编后从1000H开始,预留32(20H)个字节的内存单元,然后从1020H开始,按照下一条DB指令赋值,即(1020H)=30H,(1021H)=8FH。1000H1020H0FFFH1021H101FHORG1000H汇编后从10003031八、BIT位地址赋值伪指令格式:字符名称BIT位地址功能:把右边的位地址赋给左边的“字符名”。例如: ORG0300H A1BIT00H A2BITP1.0 MOVC,A1 MOVA2,C31八、BIT位地址赋值伪指令314.2源程序的设计步骤和汇编设计步骤1、拟定设计任务书2、建立数学模型3、确立算法4、绘制程序流程图5、编制汇编语言源程序6、上机调试4.2源程序的设计步骤和汇编设计步骤3233
单片机汇编语言程序设计的基本步骤如下:
(1)题意分析
(2)画出程序流程图熟悉并了解汇编语言指令的基本格式和主要特点,明确被控对象对软件的要求,设计出算法。程序流程图也称为程序框图,是根据控制流程设计的,它可以使程序清晰,结构合理,便于调试。33熟悉并了解汇编语言指令的基本格式和主要3334(3)分配内存工作区及有关端口地址
(4)编制汇编源程序。
(5)编译、仿真、调试程序。
(6)固化程序。
分配内存工作区,要根据程序区、数据区、暂存区、堆栈区等预计所占空间大小,对片内外存储区进行合理分配并确定每个区域的首地址,便于编程使用。34(3)分配内存工作区及有关端口地址344.2源程序的设计步骤和汇编
汇编(汇编程序)源程序目标码(汇编语言)(机器语言)反汇编(汇编程序)汇编和反汇编示意图4.2源程序的设计步骤和汇编354.2源程序的设计步骤和汇编汇编1、人工汇编2、机器汇编P136表4.2P137表4.3第一次汇编:翻译机器码第二次汇编:计算偏移量人工汇编4.2源程序的设计步骤和汇编汇编P136表4.2第一次汇36P136例4.1 ORG0100HSUM DATA1FHBLOCKDATA20HSTART:MOVR0,#BLOCK MOVA,@R0 CJNEA,#00H,LOOPHERE:SJMP$LOOP:CLRANEXT:INCR0 ADDA,@R0 DJNZBLOCK,NEXT MOVSUM,A SJMPHERE ENDRAM20H1FHSUMBLOCKLEN个单元内容求和编程好习惯之一:上下对齐,清晰易读!P136例4.1 ORG0100HRAM20H1FHSU37第一次汇编:翻译机器码SUM DATA1FHBLOCKDATA20H第一次汇编:翻译机器码SUM DATA1FH38第二次汇编:计算偏移量地址偏移量=目标地址-转移指令起始地址-转移指令字节数LOOP=1008-1003-03=02H$=1006-1006-2=-02H,补码为FEHNEXT=1009-100B-03=-05H,补码为FBH第二次汇编:计算偏移量地址偏移量=目标地址-转移指令起始地址394.2源程序的设计步骤和汇编汇编1、人工汇编2、机器汇编第一次汇编:翻译机器码第二次汇编:计算偏移量机器汇编汇编软件汇编源程序目标代码(机器语言)4.2源程序的设计步骤和汇编汇编第一次汇编:翻译机器码机器404.3.1简单程序设计4.3.2分支程序设计4.3.3散转程序设计4.3.4循环程序设计4.3.5查表程序设计4.3.6子程序设计和参数传递4.3汇编语言程序设计4.3.1简单程序设计4.3汇编语言程序设计41例1两个无符号双字节数相加。设被加数存放于内部RAM的40H(高位字节),41H(低位字节),加数存放于50H(高位字节),51H(低位字节),和数存入40H和41H单元中。4.3.1简单程序设计--没有分支、顺序执行的程序+CY例1两个无符号双字节数相加。4.3.1简单程序设42 ORG0000H LJMPMAIN ORG0100HMAIN:CLRC;将Cy清零
MOVR0,#41H;将被加数地址送数据指针R0MOVR1,#51H;将加数地址送数据指针R1AD1:MOVA,@R0;被加数低字节的内容送入AADDA,@R1;两个低字节相加MOV@R0,A;低字节的和存入被加数低字节中
DECR0;指向被加数高位字节
DECR1;指向加数高位字节
MOVA,@R0;被加数高位字节送入A
ADDCA,@R1;两个高位字节带Cy相加
MOV@R0,A;高位字节的和送被加数高位字节SJMP$
ENDR0R1 ORG0000HR0R143例2将两个半字节数合并成一个一字节数。设内部RAM40H,41H单元中分别存放着8位二进制数,要求取出两个单元中的低半字节,并成一个字节后,存入50H单元中(从40H单元取的数放在高4位,从41H单元取的数放在低4位)。40H41H50H例2将两个半字节数合并成一个一字节数。40H41H5044 ORG0000H LJMPSTART ORG0100HSTART:MOV R1,#40H;设置R1为数据指针
MOV A,@R1 ;取出第一个单元中的内容
ANL A,#0FH ;取第一个数的低半字节
SWAP A ;移至高半字节
INC R1 ;修改数据指针
XCH
A,@R1 ;取第二个单元中的内容
ANL A,#0FH ;取第二个数的低半字节
ORL A,@R1 ;拼字
MOV 50H,A ;存放结果SJMP$
END
40H41H50H ORG0000H40H41H45 ORG 0000H LJMP START
ORG 0500HSTART:MOV R0,#22H
MOV @R0,#00H ;22H清零 MOV A,20H ;20H中的BCD码送A XCHD A,@R0 ;低位BCD送22H ORL 22H,#30H ;完成低位BCD的转换 SWAP A ;高位BCD码送低4位 ORL A,#30H ;完成高位BCD的转换 MOV 21H,A ;存入21H SJMP $ ENDP138例4.2由BCD码→求ASCII码0→30H1→31H··9→39HBCD码→ASCII码20H21H22H ORG 0000HP138例4.2由BCD码→46P139例4.3:已知16位补码(负数),求原码的绝对值。ORG 0000HLJMP MIANORG 0300H
NUM DATA20HMAIN:MOV R0,#NUM MOV A,@R0 ;低8位→A
CPL A
ADD A,#01H MOV @R0,A INC R0
MOV A,@R0 ;高8位→A
CPL A
ADDC A,#00H ANL A,#7FH;去掉符号位
MOV @R0,A SJMP $ ;结束
END为什么不用INCA(P100)NUMNUM+1P139例4.3:已知16位补码(负数),求原码的绝对47分支结构框图(a)单分支流程(b)多分支流程4.3.2分支程序设计分支结构框图4.3.2分支程序设计48-+=011yP140例4.5例
设x存放在内部RAM的30H单元中,结果y存入31H单元.流程图存结果结束YA←+1YA←X开始N(A)=0?N(A)>0?A←-1-+=011yP140例4.5例设x存放在内部R49 ORG2000HSTART:MOVA,30H ;A←X JZ LP2;X=0转移
JNBACC.7,LP1;X>0转移
MOVA,#0FFH;X<0则Y=-1 SJMPLP2LP1:MOVA,#01;X>0则Y=1LP2:MOV31H,A;31H←YEND流程图存结果结束YA←+1YA←X开始N(A)=0?N(A)>0?A←-1 ORG2000H流程图存结果结束YA←50比较两个无符号数的大小。设外部RAM的存储单元ST1和ST2中存放两个不带符号的二进制数,找出其中的大数存入外部RAM中的ST3单元中。例P142例4.7ST1ST2ST3AR2比较两个无符号数的大小。设外部RAM的存储单元ST151程序如下:
ORG0000HLJMPSTART
ORG1000HST1 EQU0000HST2EQU0001HST3EQU0002HSTART:CLRC ;清零Cy MOVDPTR,#ST1;第一个数的指针
MOVXA,@DPTR;取第一个数
MOVR2,A ;保存
MOVDPTR,#ST2;第二个数的指针
MOVXA,@DPTR;取第二个数0000H0001H0002HAR2程序如下:0000H0001H0002HAR252CLRCSUBBA,R2;两数比较,相减后A中的值已变化JNCBIG1;若A>R2,
则转存AXCHA,R2;若A<R2,交换后A中为大数SJMPBIG0BIG1:MOVXA,@DPTR ;第二个数大,重新取出第二个数BIG0:MOVDPTR,#ST3MOVX@DPTR,A;存大数
SJMP$ END是否可以采用其他指令生成Cy位呢?CLRC是否可以采用其他指53比较是进行一次减法运算,但其差值不保存,两个数的原值不受影响,而标志位CY要受到影响。当data1<data2时,CY=1
当data1≥data2时,CY=0
利用CJNE生成Cy位,判断两个数大小比较是进行一次减法运算,但其差值不保存,两个数的原值不受影响54
CLRCCJNEA,02H,GOON;生成Cy位A、R2值都没变GOON:JNCBIG;Cy=0,A>R2,
则转存AXCHA,R2;Cy=1,A<R2,
交换后A中为大数BIG:MOVDPTR,#ST3MOVX@DPTR,A ;存大数SJMP$
END
ST1ST2ST3AR2CLRCST55P143例4.81、200名学生的外语成绩存放外部RAM的ENGLISH开始的单元2、100~95分为A级,统计结果存内部RAM的GRADA单元3、94~90分为B级,统计结果存内部RAM的GRADB单元P143例4.81、200名学生的外语成绩存放外部RAM的56
ORG0600HENGLISHXDATA0000HGRADADATA20HGRADBDATA21H
MOVGRADA,#00H MOVGRADB,#00H MOVR2,#200 ;参赛总人数200人
MOVDPTR,#ENGLISH;取存成绩的首址LOOP:MOVXA,@DPTR CJNEA,#95,LOOP1 ;与95比较,形成Cy ORG0600H57LOOP:MOVXA,@DPTR CJNEA,#95,LOOP1 ;与95比较,形成CyLOOP1:JNCNEXT1 ;>=95跳
CJNEA,#90,LOOP2;与90比较,形成CyLOOP2:JCNEXT ;<90跳
INCGRADB ;B级人数加1 SJMPNEXTNEXT1:INCGRADA;A级人数加1NEXT:INCDPTR;修改学生成绩指针
DJNZR2,LOOP;是否统计完,未完跳
SJMP$ ENDLOOP:MOVXA,@DPTR58
散转程序是分支程序的一种,它可根据运算结果或输入数据将程序转入不同的分支。4.3.3散转程序设计散转程序是分支程序的一种,它可根据运594.3.3散转程序设计指令:JMP@A+DPTR特点:由DPTR的内容决定分支转移程序的首地址,由累加器A的内容来动态选择其中的某一个分支转移程序。助记符格式机器码(B)相应操作指令说明机器周期JMP@A+DPTR01110011PCA+DPTR64KB内相对转移24.3.3散转程序设计指令:JMP@A+DPTR特点60P141例4.6N=128的分支程序。已知R3的值为00H~7FH中的一个,请编出根据R3中的值转移到相应分支程序的程序。指令0指令1指令127TAB+00H+01H+02H+03H+FEH+FFH设散转指令表首地址为:TAB,赋给DPTR各子程序入口地址为:ROUT00~ROUT127ROMJMP@A+DPTRR3=0,跳转到TAB处执行分支0R3=1,跳转到TAB+2处执行分支1R3=127,跳转到TAB+254处执行分支127P141例4.6N=128的分支程序。61P141例4.6 ORG0100H MOVA,R3;R3→A RLA;A←A×2 MOVDPTR,#TAB;表首地址送DPTR JMP@A+DPTR;根据A值转移
··········TAB:AJMPROUT00;当(R3)=0时转ROUT00执行
AJMPROUT01;当(R3)=1时转ROUT01执行
··········AJMP
ROUT127;当(R3)=127时转ROUT127执行ROUT00:········ROUT01:········
··········ROUT127:········ ENDP141例4.6 ORG0100H624.3.4循环程序设计
循环程序一般由四个主要部分组成:(1)初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。
(2)处理部分:
为反复执行的程序段,是循环程序的实体,也是循环程序的主体。
(3)循环控制部分:这部分的作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止。
(4)结束部分:这部分主要是对循环程序的结果进行分析、处理和存放。4.3.4循环程序设计循环程序一般由四个主要634.3.3循环程序设计先处理后判断先判断后处理一、单重循环4.3.3循环程序设计先处理后判断先判断后处理一、单重循64
例工作单元清零。在应用系统程序设计时,有时经常需要将存储器中部分地址单元作为工作单元,存放程序执行的中间值或执行结果,工作单元清零工作常常放在程序的初始化部分中。设有50个工作单元,其首址为外部存储器8000H单元,则其工作单元清零程序如下:CLEAR:CLRAMOVDPTR,#8000H;工作单元首址送指针
MOVR2,#50 ;置循环次数CLEAR1:MOVX@DPTR,AINCDPTR ;修改指针
DJNZR2,CLEAR1 ;控制循环
RET先处理后判断例工作单元清零。CLEAR:CLR65例设在内部RAM的BLOCK单元开始处有长度为LEN个的无符号数据块,试编一求和程序,并将和存入内部RAM的SUM单元(设和不超过8位)。BLOCKEQU20HSUMEQU19HLENEQU05HSTART:CLRA ;清累加器AMOVR2,#LEN ;数据块长度送R2MOVR1,#BLOCK ;数据块首址送R1
LOOP:ADDA,@R1 ;循环加法
INCR1 ;修改地址指针
DJNZR2,LOOP ;修改计数器并判断
MOVSUM,A ;存和
RET先处理后判断例设在内部RAM的BLOCK单元开始处有长度为LEN个的无661、上述程序属先处理后判断。2、当#LEN=0时,将出错。改正办法:先判断后处理。见书中例题P146例4.9(1),自学。说明:课后思考,本题若采用先处理后判断的控制,如何修改可以避免LEN=0的错误?1、上述程序属先处理后判断。说明:课后思考,6768图查找程序流程图NYNR0←R0+1N←0FFH结束开始R0←MR1←64HR1-1=0?(R0)=a?N←R0Y
例
查找程序。设在以M为起始地址的内部RAM中连续存放有100个单字节数,试编一程序查找一个为a的数,找到后把其地址送N单元,若这个数不存在,则把FFH送N单元。解:使用比较指令查找,编写成循环程序,其流程图如图所示,程序设计如下:68图查找程序流程图NYNR0←R0+1N←0FF6869图查找程序流程图NYNR0←R0+1N←0FFH结束开始R0←MR1←64HR1-1=0?(R0)=a?N←R0YORG 1800HMAIN:MOV R0,#M MOVR1,#64HLP1:CJNE@R0,#a,LP2;比较,不相等转移
MOV N,R0 ;找到,N←(R0) SJMPDONELP2:INCR0DJNZ R1,LP1 ;(R1)-1=/0则转移
MOVN,#0FFH ;未找到,N←0FFHDONE:SJMP$END
课后思考:修改程序,实现记录100数据中含有a的个数。69图查找程序流程图NYNR0←R0+1N←0FF6970
采用多重循环程序,即在一个循环体中又包含了其它的循环程序,这种方式是实现延时程序的常用方法。使用多重循环时,必须注意:(1)循环嵌套,必须层次分明,不允许产生内外层循环交叉。(2)外循环可以一层层向内循环进入,结束时由里往外一层层退出。
二、多重循环70采用多重循环程序,即在一个循环体中又包含了7071双重循环程序设计——延时程序设计
延时程序在单片机汇编语言程序设计中使用非常广泛,所谓延时,就是让CPU做一些与主程序功能无关的操作(例如将一个数字逐次减1直到为0)来消耗掉CPU的时间。由于我们知道CPU执行每条指令的准确时间,因此执行整个延时程序的时间也可以精确计算出来。也就是说,我们可以写出延时长度任意而且精度相当高的延时程序。71双重循环程序设计——延时程序设计7172例:单片机外接晶振频率12MHZ时的各种时序单位:
振荡周期=1/fosc=1/12MHZ=0.0833us
机器周期=12/fosc=12/12MHZ=1us
指令周期=(1-4)机器周期=1-4us72例:单片机外接晶振频率12MHZ时的各种时序单位:7273例:单片机外接晶振频率6MHZ时的各种时序单位:
振荡周期=1/fosc=1/12MHZ=0.1666us
机器周期=12/fosc=12/12MHZ=2us
指令周期=(1-4)机器周期=2-8us73例:单片机外接晶振频率6MHZ时的各种时序单位:73例10秒延时程序。延时程序与MCS-51执行指令的时间有关,如果使用6MHz晶振,一个机器周期为2μs,计算出一条指令以至一个循环所需要的执行时间,给出相应的循环次数,便能达到延时的目的。10秒延时程序如下:DELAY:MOVR5,#50
DEL0:MOVR6,#200
DEL1:MOVR7,#248
DEL2:DJNZR7,DEL2DJNZR6,
DEL1DJNZR5,DEL0RET1112222延时时间=4,990,150×2
=9,980,300μs10S=10,000,000uS误差=19700uS=19.7mS周期数=(((248×2)+1+2)×200+1+2)×50+1+2
=4990150指令执行周期数例10秒延时程序。DELAY:MOVR74冒泡排序程序设计也叫气泡排序、两两比较排序排序:将一组数据按从大到小、或从小到大进行排列基本原理:N个数据,进行N-1轮的两两数据比较第一轮:选出最大(最小)数,需比较N-1次。第二轮:选出次最大(次最小)数,需比较N-2次。
······
第N-1轮:选出最小(最大)数,需比较1次。设有D0~D5共6个数,随机放在RAM中,且已知:
D5>D4>D3>D2>D1>D0,
要求:进行从大到小的排序冒泡排序程序设计也叫气泡排序、两两比较排序排序:将一组数75第一轮比较
共比较5次,每次比较选出一个大数,与下一个数进行比较,最后选出最大数D5。设有D0~D5共6个数,随机放在RAM中,且:
D5>D4>D3>D2>D1>D0,
进行从大到小的排序第一轮比较共比较5次,每次比较选出一个大数,76第二轮比较
共比较4次,每次比较选出一个大数,与下一个数进行比较,最后选出次最大数D4。
实际编程时,往往还是比较n-1次(5次),只是最后1次比较数据不改变数据顺序。第二轮比较共比较4次,每次比较选出一个大数,与下一个77第三轮比较
共比较3次,每次比较选出一个大数,与下一个数进行比较,最后选出第三大数D3。
实际编程时,往往还是比较n-1次(5次),只是最后2次比较数据不改变数据顺序。第三轮比较共比较3次,每次比较选出一个大数,与下一个78第四轮比较共比较2次,选出第四大数D2。
实际编程时,往往还是比较n-1次(5次),只是最后3次比较数据不改变数据顺序。第四轮比较共比较2次,选出第四大数D2。实际编程79第五轮比较共比较1次,选出第五大数D1。经过五轮比较,完成排序工作。
实际编程时,往往还是比较n-1次(5次),只是最后4次比较数据不改变数据顺序。第五轮比较共比较1次,选出第五大数D1。经过五轮比较,完成排80结论:1、N个数据排序需进行N-1轮比较。2、第一轮进行N-1次比较,以后每轮比较次数减1。3、在某轮比较中,如不发生数据交换,排序即告完成。4、大多数情况下,并不需要进行完N-1比较就可完成排序。
为了简化程序结构,实际排序的做法是:
1、确定每轮比较次数:N-1次。
2、设置“数据交换标志”来判定排序是否结束:若有数据交换则使标志置位,若无数据交换则使标志清零。若某轮比较后标志=0,则排序结束。说明:在此不确定比较轮数,以交换数据标志做比较结束判断。结论:1、N个数据排序需进行N-1轮比较。为了简化程序结构81例在内部RAM中,ARRAY开始的单元中有一无符号数据块,其个数为SIZE个字节。试将这些无符号数按从小到大重新排列,并存入原存储区。排序后ARRAY排序前SIZEARRAYSIZE例在内部RAM中,ARRAY开始的单元中有一无符号82程序框图N结束开始A<=B?Y初始化设置数据起始地址及数据长度交换标志位CHANGE清零取当前数据给A取下一个数据给B交换标志位CHANGE置1数据交换一轮数据比较完?NY全部有序?YN程序框图N结束开始A<=B?Y初始化取当前数据给A取下一个数83例在内部RAM中,ARRAY开始的单元中有一无符号数据块,其个数为SIZE个字节。试将这些无符号数按从小到大重新排列,并存入原存储区。SIZEEQU10 ;数据个数ARRAYEQU50H;数据起始地址CHANGEBIT00H;交换标志
ORG0100HSORT:MOVR0,#ARRAYMOVR7,#SIZE-1 ;R7←N-1 CLRCHANGEN结束开始A<=B?Y初始化设置数据起始地址及数据长度交换标志位CHANGE清零取当前数据给A取下一个数据给B交换标志位CHANGE置1数据交换一轮数据比较完?NY全部有序?Y例在内部RAM中,ARRAY开始的单元中有一无符号84
GO_ON:MOVA,@R0 ;取第一个数
INCR0MOVB,@R0;取第二个数
CJNEA,B,NOTEQUAL
;不等→跳
SJMPNEXTNOTEQUAL:JCNEXT
;前小后大,不交换
SETBCHANGE;前大后小,置交换标志
XCHA,@R0DECR0
XCHA,@R0INCR0
NEXT:DJNZR7,GO_ON
JBCHANGE,SORT SJMP$ END(R0)ACC交换前(R0)ACC第2次交换后ARRAY排序后(R0)ACC第1次交换(R0)N结束开始A<=B?Y初始化设置数据起始地址及数据长度交换标志位CHANGE清零取当前数据给A取下一个数据给B交换标志位CHANGE置1数据交换一轮数据比较完?NY全部有序?YGO_ON:MOVA,@R0 ;取第一85
查表程序是一种常用程序,它广泛使用于LED显示控制、打印机打印控制、数据补偿、数值计算、转换等功能程序中,这类程序具有简单、执行速度快等特点。所谓查表法,就是预先将输入变量X与函数值Y之间关系的一张表求出,然后把这张表存于单片机的程序存储器ROM中,根据变量X在表格中查找对应的函数值Y,使Y=f(X)。4.3.5查表程序设计查表程序是一种常用程序,它广泛使用于LED86两条查表指令:MOVCA,@A+DPTR
MOVCA,@A+PC1、确定数据表格首地址→DPTR2、确定偏移量→ACC3、用MOVCA,@A+DPTR查表取数1、确定偏移量→ACC2、完成偏移量修正:ADDA,#data3、用MOVCA,@A+PC查表取数使得:PC+data=数据表首地址PC值为执行完MOVCA,@A+PC后的PC值
两条查表指令:MOVCA,@A+DPTRMOVC87两条查表指令:MOVCA,@A+DPTR
MOVCA,@A+PC1、确定数据表格首地址→DPTR2、确定偏移量→ACC3、用MOVCA,@A+DPTR查表取数1、确定偏移量→ACC2、完成偏移量修正:ADDA,#data3、用MOVCA,@A+PC查表取数使得:PC+data=数据表首地址PC值为执行完MOVCA,@A+PC后的PC值
TAB:ROM两条查表指令:MOVCA,@A+DPTRMOVC8889
例
在程序中定义一个0~9的平方表,利用查表指令找出20H单元内容的平方值,保存到21H。
查表程序的关键是表格的定义和如何实现查表。SHUEQU20HORG0100HMOVDPTR,#TABLE ;表首地址→DPTR
MOVA,SHU ;SHU→AMOVCA,@A+DPTR ;查表指令MOVSHU+1,A ;A→SHU+1SJMP$ ;程序暂停TABLE:DB 0,1,4,9,16,25,36,49,64,81;定义0~9平方表
END89例在程序中定义一个0~9的平方表,89
一个十六进制数存放在内部RAM的HEX单元的低4位中,将其转换成ASCII码并送回HEX+1单元。十六进制0~9的ASCII码为:30H~39HA~F的ASCII码为:41H~46H,
设ASCII码表格的首地址为:ASCTAB
要求用MOVCA,@A+PC指令实现查表程序的关键是表格的定义和如何实现查表。一个十六进制数存放在内部RAM的HEX单元的低90程序中,查表指令MOVCA,@A+PC到表头之间相隔2条指令,占用3个字节,故修改指针数据data=3。 ORG1000HHEXASC: MOVA,HEX ANLA,#0FH ADDA,#data;修改指针
MOVCA,@A+PC;指令码83H
MOVHEX+1,A
;指令码F5,HEX+1
RET
;指令码22HASCTAB: DB30H,31H,32H,33H,34H DB35H,36H,37H,38H,39H DB41H,42H,43H,44H,45H DB46H表头待具体指令确定后再求dataROM程序中,查表指令MOVCA,@A+PC到表头之间相隔291
通常把一些基本操作功能编制为程序段作为独立的子程序,以供不同程序或同一程序反复调用。4.3.6子程序和参数传递一、子程序的概念通常把一些基本操作功能编制为程序段作为独立的子程序,92注意:
子程序的第一条指令地址称为子程序的起始地址或入口地址,该指令前必须有标号,标号一般以子程序任务命名。注意:子程序的第一条指令地址称为子程序的起始地址或入口93
二、子程序的调用和返回(PC)←(PC)+3(SP)←(SP)+1((SP))←(PC7~0)(SP)←(SP)+1((SP))←(PC8~15)(PC)←addr16LCALLarrd16(PC)←(PC)+2(SP)←(SP)+1((SP))←(PC7~0)(SP)←(SP)+1((SP))←(PC8~15)(PC)←addr11ACALLarrd11(PC8~15)←((SP))(SP)←(SP)-1(PC7~0)←((SP))(SP)←(SP)-1RETSPSP+1SP+2RAMROMPCPC+3←(PC+3)_H←(PC+3)_LSP-1SP-1SPRAM→(PC)_H→(PC)_L二、子程序的调用和返回(PC)←(PC)+3LCALL94参数传递利用寄存器或片内RAM传递参数利用寄存器传递参数的地址利用堆栈传递参数利用位地址传递参数
子程序调用中,主程序应先把有关的参数存入约定的位置,子程序在执行时,可以从约定的位置取得参数,当子程序执行完,将得到的结果再存入约定的位置,返回主程序后,主程序可以从这些约定的位置上取得需要的结果,这就是参数的传递。参数传递利用寄存器或片内RAM传递参数子程序调95例4.16P156
求:c=a2+b2,设a<10,b<10MDAMDBMDC ORG 1000HMDA DATA 20HMDB DATA 21HMDC DATA 22H MOV A,MDA ACALL SQR MOV R1,A MOV A,MDB ACALL SQR ADD A,R1 MOV MDC,A SJMP $
SQR: ADD A,#01H MOVC A,@A+PC
RET
;字节数=1SQRTAB:DB0,1,4,9,16,25,36,48,64,81END本例利用ACC传递参数例4.16P156求:c=a2+b2,设a<10,b96
在HEX单元中存有两个十六进制数,将其转换成ASCII码,存放在内部RAM的ASC,ASC+1两个单元中。HEXASCASC+1
例4.17P156
相关指令功能:PUSH:SP←SP+1,(direct)→(SP)POP:direct←(SP),SP←SP-1ACALL:PC←PC+2SP←SP+1,PCL→(SP)SP←SP+1,PCH→(SP)RET:PCH←(SP),SP←SP-1PCL←(SP),SP←SP-1本例利用堆栈传递参数在HEX单元中存有两个十六进制数,将其转换成ASC97 ORG1200HMAIN:PUSH
HEX
ACALLHASC
POP
ASC
MOVA,HEXSWAPA
PUSH
ACC
ACALLHASC
POPASC+1SJMP$SPSP+1SP+21200H1202H1204H1206H1208H1209H120BH120DH120FH
例4.17P156
SP+1SP+2SP+3SPHEXASCASC+1SP+3第一次调用 ORG1200HSPSP+1SP+212098HASC:DECSPDECSPPOPACCANLA,#0FH;保留低半字节
ADDA,#07H;修改A值
MOVCA,@A+PC
;查表
PUSHACCINCSPINCSPRETTAB:DB‘0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’DB‘8’,‘9’,‘A’,
‘B’,
‘C’,
‘D’,‘E’,‘F’ENDSP+1SP+2SP+3SPSP+1SP+2SP+3SPSP+1SP+2SP+3SPPC=1204H2221HASC:DECSPSP+1SP+2SP+3SP99 ORG1200HMAIN:PUSH
HEX
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 45439-2025燃气气瓶和燃气瓶阀溯源二维码应用技术规范
- 社区妇幼健康服务模式试题及答案
- 虚拟化技术的基本概念试题及答案
- 深入了解全媒体运营师试题及答案
- 动物外科操作不良反应及解决方法试题及答案
- 妇幼保健员岗位职责与技能要求分析试题及答案
- 茶艺师的创意茶饮研发试题及答案
- 高玩解析健康管理师试题及答案
- 2025年健康管理师考试注意事项试题及答案
- 二零二五企业法人变更责任免除合同模板发布
- 2025年度画家经纪业务合作协议书模板
- DB37-T 5310-2025《城镇排水管渠养护维修服务规范》
- 微笑面对挫折(课件)六年级心理健康(苏科版)
- 2025届小米全球校园招聘启动(即将笔试)笔试参考题库附带答案详解
- 胆管癌手术护理
- 2025 年小学劳动技术新课程标准(2022 版)标准试题
- 第10课传承与创新中国近现代美术课件-高中美术人教版美术鉴赏
- 2025年安全员C证考试题库及答案-
- 清华大学第二弹:DeepSeek赋能职场-从提示语技巧到多场景应用
- 16J914-1 公用建筑卫生间
- 教学课件:《新时代新征程》
评论
0/150
提交评论