资源预览内容
第1页 / 共27页
第2页 / 共27页
第3页 / 共27页
第4页 / 共27页
第5页 / 共27页
第6页 / 共27页
第7页 / 共27页
第8页 / 共27页
第9页 / 共27页
第10页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第三章第三章 MCS-51MCS-51单片机汇编语言程序设计单片机汇编语言程序设计3.1 3.1 概述概述 5151系系列列单单片片机机支支持持写写入入单单片片机机或或仿仿真真调调试试的的目目标标程程序序有有两两种种文文件件格式:格式:.BIN.BIN文件和文件和 .HEX.HEX文件,文件, .BIN .BIN文件是由编译器生成的二进制文件,是程序的机器码,文件是由编译器生成的二进制文件,是程序的机器码, .HEX.HEX文文件件是是由由INTERINTER公公司司定定义义的的一一种种格格式式,这这种种格格式式包包括括地地址址、数数据据和和校校验验码码,并并用用ASCIIASCII码码来来存存储储,可可供供显显示示和和打打印印。.BIN.BIN文文件件需需通通过过符符号转换程序号转换程序OHS51OHS51变变换换成成. .HEXHEX格式的文件格式的文件。一、两种语言的操作过程一、两种语言的操作过程:连连接接/ /定定位位器器L L5 51 1汇编语言汇编语言源程序源程序汇汇编编器器A A5 51 1符符号号转转换换程程序序O OH HS S5 51 1绝对地址绝对地址目标程序目标程序 .BIN.BINC C语言程序语言程序浮动浮动地址地址目标目标程序程序编编译译器器C C5 51 1HEXHEX1二、汇编语言程序设计步骤:二、汇编语言程序设计步骤:1.1.分析任务,确定方案和计算方法。分析任务,确定方案和计算方法。2. 2. 按功能划分模块,确定各模块之间的相互关系及参数传递,画出按功能划分模块,确定各模块之间的相互关系及参数传递,画出程序流程图。程序流程图。3 3、合理分配寄存器和存储器单元,编写汇编语言源程序,并作必要、合理分配寄存器和存储器单元,编写汇编语言源程序,并作必要的注释,以方便阅读、调试和修改。的注释,以方便阅读、调试和修改。4 4、汇编语言源程序进行汇编和连接生成可执行的目标文件(、汇编语言源程序进行汇编和连接生成可执行的目标文件(.BIN.BIN或或.HEX.HEX)。)。5 5、仿真调试、修改程序,直至满足任务要求。、仿真调试、修改程序,直至满足任务要求。6 6、将调试好的目标文件(、将调试好的目标文件(BINBIN或或HEXHEX)烧录进单片机内,上电执行。)烧录进单片机内,上电执行。 目目前前很很多多公公司司将将编编辑辑器器、汇汇编编器器、编编译译器器、连连接接/ /定定位位器器、符符号号转转换换程程序序做做成成集集成成软软件件包包,用用户户进进入入该该集集成成环环境境,编编辑辑好好程程序序后后,只只需需点点击相应菜单就可以完成上述的各步,如击相应菜单就可以完成上述的各步,如WAVEWAVE、KEILKEIL等集成软件。等集成软件。汇编:将汇编语言源程序转换成机器语言目标程序的过程称为汇编。汇编:将汇编语言源程序转换成机器语言目标程序的过程称为汇编。汇编程序:能将汇编语言源程序转换成机器语言目标程序的系统软件称汇编程序:能将汇编语言源程序转换成机器语言目标程序的系统软件称为汇编程序。为汇编程序。汇编源程序:用汇编语言编的应用程序称为汇编语言源程序。汇编源程序:用汇编语言编的应用程序称为汇编语言源程序。2程序流程图表示程序结构和功能,一个典型分支程序流程如下:程序流程图表示程序结构和功能,一个典型分支程序流程如下: YN?开始开始开始结束框开始结束框处理框处理框判断框判断框转子框转子框输入输出框输入输出框结束结束流程线流程线3三、程序汇编的方法:三、程序汇编的方法:程序汇编的方法有两种:程序汇编的方法有两种:1 1、手工汇编:、手工汇编: 人工查指令表,查出程序中每条指令对应的机器代码。早期的计算机人工查指令表,查出程序中每条指令对应的机器代码。早期的计算机使用。使用。2 2、机器汇编:、机器汇编: 用计算机中的汇编程序对用户源程序进行汇编。用计算机中的汇编程序对用户源程序进行汇编。 用机器汇编要提供给汇编一些信息,遵循汇编程序的一些约定,这些用机器汇编要提供给汇编一些信息,遵循汇编程序的一些约定,这些由伪指令指定。由伪指令指定。3 3、汇编程序的主要任务:、汇编程序的主要任务:确定程序中每条汇编语言指令的指令机器码。确定程序中每条汇编语言指令的指令机器码。确定每条指令在存储器中的存放地址。确定每条指令在存储器中的存放地址。提供错误信息,指出源程序中的语法错误。提供错误信息,指出源程序中的语法错误。提供目标执行文件提供目标执行文件(*.OBJ/*.HEX(*.OBJ/*.HEX/*.BIN/*.BIN) )和列表文件和列表文件(*.LST)(*.LST)。 地址地址 机器码机器码 源程序源程序 ORG 2000HORG 2000H 2000H 78 30 2000H 78 30 MAIN MAIN:MOV R0MOV R0,#30H#30H 2002H E6 2002H E6 MOV AMOV A,R0 R0 41. 1. 机器指令:指令系统中的全部指令。每条机器指令都有对应的机器代机器指令:指令系统中的全部指令。每条机器指令都有对应的机器代码,可以被码,可以被CPUCPU执行。执行。2. 2. 伪指令:汇编控制指令,没有指令代码,只用于汇编过程,为汇编程伪指令:汇编控制指令,没有指令代码,只用于汇编过程,为汇编程序提供汇编信息,给编程提供方便。序提供汇编信息,给编程提供方便。3. 3. 宏指令:由多条指令通过宏汇编集合而产生的指令。宏指令:由多条指令通过宏汇编集合而产生的指令。 宏汇编功能:将需要反复多次执行的程序段定义成一个宏指令名宏汇编功能:将需要反复多次执行的程序段定义成一个宏指令名(宏定义)。编程时,可在程序中使用宏指令名来替代被定义的程序(宏定义)。编程时,可在程序中使用宏指令名来替代被定义的程序段(宏调用)。段(宏调用)。四、汇编语言指令类型四、汇编语言指令类型宏定义过程:宏定义过程: 宏指令名宏指令名 MACRO MACRO 形式参数形式参数 ;被定义的程序段;被定义的程序段 ENDMENDM 宏调用过程:宏调用过程: 宏指令名宏指令名 实际参数实际参数 宏指令名宏指令名 实际参数实际参数 MACRO_NAME MACRO X,Y MOV A,#X MOV B,#Y MUL AB ENDM 程序程序; ; MACRO_NAME 20H,30H ;宏调用53.2 3.2 伪指令伪指令 常用伪指令及功能:常用伪指令及功能:1 1、起始指令、起始指令 ORG nnORG nn功能:定义程序或数据块的起始地址。指示此语句后面的程序或数据块以功能:定义程序或数据块的起始地址。指示此语句后面的程序或数据块以nnnn为起始地址,连续存放在程序存储器中。为起始地址,连续存放在程序存储器中。 指令地址指令地址 机器码机器码 源程序源程序 ORG 2000H ORG 2000H 2000H 78 30 MAIN 2000H 78 30 MAIN:MOV R0MOV R0,#30H#30H 2002H E6 2002H E6 MOV AMOV A,R0R0 ORG 3000H ORG 3000H 3000H 23 TAB 3000H 23 TAB:DB 23HDB 23H,100100,A A 3001H 64 3001H 64 3002H 41 3002H 41 62 2、字节定义、字节定义 标号:标号: DBDB(字节常数,或字符或表达式)(字节常数,或字符或表达式) 功功能能:指指示示在在程程序序存存储储器器中中以以标标号号为为起起始始地地址址的单元里存放的数为字节数据(八位二进制数)。的单元里存放的数为字节数据(八位二进制数)。 例如例如 LNLN:DB 32DB 32,C C,25H25H,-1-1; 以以上上的的伪伪指指令令是是在在LNLNLN+3LN+3地地址址单单元元依依次次存存放放20H20H,43H43H,25H25H,FFHFFH。地址地址 数据数据LNLN2020LN+1LN+14343LN+2LN+22525LN+3LN+3FFFF3 3、 字定义字定义 标号:标号:DW DW (字常数或表达式)(字常数或表达式) 作用:作用: 指示在程序存储器中以标号为起始指示在程序存储器中以标号为起始地址的单元里存放的数为字数据(即地址的单元里存放的数为字数据(即1616位位 的二进制数)。的二进制数)。 例如:例如:GH GH :DW 1234HDW 1234H,5678H5678H,0808GHGH12123434GH+2GH+256567878GH+4GH+40000080876 6、等值指令、等值指令 标号标号 EQUEQU(数值表达式)(数值表达式) 表示表示EQUEQU两边的量等值,用于为标号或标识符赋值。两边的量等值,用于为标号或标识符赋值。 例如:例如: X1 X1 EQU 2000HEQU 2000H X2 X2 EQU 0FHEQU 0FH MAIN: MOV DPTR MAIN: MOV DPTR,#X1 ; DPTR=2000H #X1 ; DPTR=2000H ADD A ADD A,#X2 ; A=A+0FH#X2 ; A=A+0FH5 5、位定义、位定义 标号标号 BIT BIT 位地址位地址 作用:同作用:同EQUEQU指令,不过定义的是指令,不过定义的是 位操作地址。位操作地址。 例如:例如:YLED BIT P1.1YLED BIT P1.1;指明;指明YLEDYLED 就是就是 P1.1 P1.1 这一位。这一位。 4 4、保留字节、保留字节 标号:标号:DS DS (数值表达式)(数值表达式) 作用:指示在程序存储器中保留以作用:指示在程序存储器中保留以标号为起始地址的若干字节单元,其标号为起始地址的若干字节单元,其单元个数由数值表达式指定。单元个数由数值表达式指定。 例如:例如: L1L1:DS 32 ; DS 32 ; 从从L1L1地址开地址开 始保留始保留3232个存储单元。个存储单元。7 7、汇编结束、汇编结束 ENDEND作用:指示源程序段结束,作用:指示源程序段结束,ENDEND指令放在程序的最后。指令放在程序的最后。 A51A51汇编程序还有一些其它的伪指令,列在教材表汇编程序还有一些其它的伪指令,列在教材表3-13-1中,以备查阅。中,以备查阅。83.3 3.3 常用程序结构常用程序结构 有顺序程序、分支程序、循环程序、子程序等。有顺序程序、分支程序、循环程序、子程序等。1 1、顺序程序设计、顺序程序设计例例3-1 3-1 编程将外部数据存储器的编程将外部数据存储器的000EH000EH和和000FH000FH单元的内容单元的内容交交换。换。 分析分析: : 外部数据存储器的数据操作只能用外部数据存储器的数据操作只能用MOVXMOVX指令,且只能和指令,且只能和A A之间传送,因此必须用一个中间环节作暂存,设用之间传送,因此必须用一个中间环节作暂存,设用20H20H单元。用单元。用R0R0、R1R1指示两单元的低八位地址,高八位地址由指示两单元的低八位地址,高八位地址由P2P2指示。编程过程如下:指示。编程过程如下: ORG 0000HORG 0000H MOV P2,#0H ; MOV P2,#0H ;送地址高八位至送地址高八位至P2P2口口 MOV R0,#0EH ;R0=0EH MOV R0,#0EH ;R0=0EH MOV R1,#0FH ;R1=OFH MOV R1,#0FH ;R1=OFH MOVX A,R0 ;A=(000EH) MOVX A,R0 ;A=(000EH) MOV 20H,A ;(20H)=(000EH) MOV 20H,A ;(20H)=(000EH) MOVX A,R1 ;A=(000FH) MOVX A,R1 ;A=(000FH) XCH A,20H ;A=(000EH),(20H)=(000FH) XCH A,20H ;A=(000EH),(20H)=(000FH) MOVX R1,A MOVX R1,A MOV A,20H MOV A,20H MOVX R0,A ; MOVX R0,A ;交换后的数送各单元交换后的数送各单元 SJMP $SJMP $ END END93.4 3.4 顺序程序顺序程序 顺序程序顺序程序( (简单程序简单程序) ),程序走向只有一条路径。,程序走向只有一条路径。例例3-23-2:将:将R4R5R4R5双字节符号数求补码程序。双字节符号数求补码程序。 ORG 0000H ORG 0000H MOV A MOV A, ,R4R4 JB ACC JB ACC. .7 7, ,CPLL CPLL ; ;判符号位判符号位 SJMP $ SJMP $ ; ;正数的补码原码正数的补码原码 CPLL CPLL:CLR C:CLR C MOV AMOV A, ,R5 R5 ; ;取低字节取低字节 CPL A CPL A ADD A ADD A, ,#1 #1 ; ;低字节变补低字节变补 MOV R5 MOV R5, ,A A MOV A MOV A, ,R4 R4 ; ;取高字节取高字节 CPL A CPL A ADDC A ADDC A, ,#0 #0 ; ;高字节变补高字节变补 ORL A ORL A, ,#80H #80H ; ; 恢复负号恢复负号 MOV R4 MOV R4, ,A A SJMP $ SJMP $10例例3-3 3-3 分解压缩式分解压缩式BCDBCD码码, ,使其成为使其成为非压缩式非压缩式BCDBCD码。码。 ORG 0000H ORG 0000HMOV R0MOV R0, ,#40H#40H; ;设指针设指针MOV AMOV A, ,R0 R0 ; ;取一个字节取一个字节MOV R2MOV R2, ,A A ; ;暂存暂存ANL AANL A, ,#0FH #0FH ; ;高高4 4位位清清0 0INC R0INC R0MOV R0MOV R0, ,A A ; ;保存数据个位保存数据个位MOV AMOV A, ,R2R2SWAP A SWAP A ; ;十位换到低半字节十位换到低半字节ANL AANL A, ,#0FH#0FH ; ;高高4 4位位清清0 0INC R0INC R0MOV R0MOV R0, ,A A; ;保存数据十位保存数据十位SJMP $SJMP $656540H40H050541H41H060642H42H片内片内RAMRAM例例3-5 3-5 设变量放在片内设变量放在片内RAMRAM的的20H20H单元单元, ,其值为其值为00H00H- -05H05H之间之间, ,编查编查平方平方表表的的程程序序, ,查出变量的平方值查出变量的平方值, , 并放入片内并放入片内RAMRAM的的21H21H单元。单元。(用(用BCDBCD码)码)分析分析 :在程序存储器安排一张平方表,在程序存储器安排一张平方表,首地址为首地址为TABTAB,以,以DPTRDPTR指向表首址,指向表首址,A A存存放变量值,利用查表指令放变量值,利用查表指令 MOVC AMOVC A,A+DPTRA+DPTR,即可求得。,即可求得。表中数据用表中数据用BCDBCD码存放合乎人们的习惯码存放合乎人们的习惯. . ORG 0000HORG 0000H MOV DPTR,#TAB MOV DPTR,#TAB MOV A,20H MOV A,20H MOVC A,A+DPTR ; MOVC A,A+DPTR ;查表查表 MOV 21H,AMOV 21H,A SJMP $ SJMP $TAB:DB 00H,01H,04H,TAB:DB 00H,01H,04H, 09H,16H,25H 09H,16H,25H END END1TAB+10TAB25HTAB+516HTAB+49TAB+34TAB+2数据地址A ADPTRDPTR113.5 3.5 分支程序的设计分支程序的设计 由条件转移指令构成程序判断框部分,形成分支结构。由条件转移指令构成程序判断框部分,形成分支结构。3.5.1 3.5.1 单分支程序单分支程序例例1 1 求求8 8位有符号数的绝对值。位有符号数的绝对值。方法:正数不变,负数变补。方法:正数不变,负数变补。 ORG 0000H ORG 0000H MOV A MOV A, ,R2R2 JNB ACC JNB ACC. .7 7, ,N N ; ;为正数?为正数? CPL A CPL A ; ;负数变补负数变补 INC AINC A MOV R2 MOV R2, ,A A N N:SJMP $ SJMP $ 条件满足条件满足? ?N检测条件检测条件Y处理处理1 1处理处理2 2 例例2 2 用单片机加重力传感器作磅用单片机加重力传感器作磅秤,秤出重量后算出行李运费价格,秤,秤出重量后算出行李运费价格,计费的方式是:当重量小于等于计费的方式是:当重量小于等于20kg20kg时,每公斤的运费是时,每公斤的运费是3 3元,当超过元,当超过20kg20kg之后,超出部分每公斤之后,超出部分每公斤5 5元。元。 设设40H40H 存入行李重量存入行李重量; ; 42H41H 42H41H 装入应付费用。装入应付费用。 根据计价方法可列出算式(设根据计价方法可列出算式(设 W W 是行李重量):是行李重量): 20203+3+(W W- -2020) )5 5 当当W W2020M =M =W W3 3 ;当;当W20W2012 ORG 0100H ORG 0100H FRT FRT:MOV AMOV A,40H40H; ;取行李重量取行李重量CJNE A,#20CJNE A,#20,L0L0 ; ;判断是否大于规定值判断是否大于规定值 JMP L1 JMP L1 L0:JC L1 L0:JC L1 CLR C ; CLR C ; 处理大于规定重量处理大于规定重量 SUBB A,#20 ; SUBB A,#20 ;求出高出的重量求出高出的重量MOV B,#05H ;MOV B,#05H ;计算高出部分的价格计算高出部分的价格 MUL ABMUL ABADD A,#60 ;ADD A,#60 ;加上加上20kg20kg的运费的运费 MOV R0,A ; MOV R0,A ;暂存暂存A A MOV A,B ; MOV A,B ; ADDC A,#00H ; ADDC A,#00H ; 处理可能的进位处理可能的进位 MOV B,A; MOV B,A; 分别将高分别将高8 8位放到位放到B B MOV A,R0; MOV A,R0; 低低8 8位放入位放入A A JMP L2 JMP L2 ; ; 处理完跳出处理完跳出 L1:MOV B,03H L1:MOV B,03H ; ; 处理小于规定重量处理小于规定重量 MUL AB MUL ABL L2:L L2:MOV MOV 41H,41H,A A ; ;存运费存运费 MOV 42H,BMOV 42H,BRETRET13 A=40H(取重量) A 20A = A*3A = A - 20A=A*5A = A+6041H = A42H = B结束结束开始开始NY1. 1. 利用转移地址表实现转移利用转移地址表实现转移(先把(先把DPTRDPTR找好,再跳转)找好,再跳转) 例例3-7 3-7 根据根据R3R3的内容转向对应的程序,的内容转向对应的程序,R3R3的内容为的内容为0 0n,n,处理程序的入处理程序的入口符号地址分别为口符号地址分别为PRPRo oPRn (n128)PRn (n128)。 分析:将分析:将PRPRo o-PRn-PRn入口地址列在表格中,每一项占两个单元,入口地址列在表格中,每一项占两个单元,PRnPRn在表中的偏移量为在表中的偏移量为2n2n,因此将,因此将R3R3的内容乘的内容乘2 2即得即得PRnPRn在表中的偏移地址,在表中的偏移地址,从偏移地址从偏移地址2n2n和和2n+12n+1两个单元分别取出两个单元分别取出PRnPRn的高八位地址和低八位地的高八位地址和低八位地址送址送DPTRDPTR寄存器,用寄存器,用JMP A+DPTRJMP A+DPTR指令(指令(A A先清零)即转移到先清零)即转移到PRnPRn入口入口执行。执行。3.5.2 3.5.2 多分支散转程序的设计多分支散转程序的设计 有一类分支程序有一类分支程序, ,它根据不同的输入条件或不同的运算结果它根据不同的输入条件或不同的运算结果, ,转转向不同的处理程序向不同的处理程序, ,称之为散转程序。这类程序通常利用称之为散转程序。这类程序通常利用JMP A+DPTR JMP A+DPTR 间接转移指令实现转移。有如下两种设计方法:间接转移指令实现转移。有如下两种设计方法: 查转移地址表查转移地址表: : 将将转移地址转移地址列成表格,将表格的内容作转移的目标地址。列成表格,将表格的内容作转移的目标地址。 查转移指令表查转移指令表: : 将转移到不同程序的将转移到不同程序的转移指令转移指令列成表格,判断条件后查表,转列成表格,判断条件后查表,转到表中指令执行到表中指令执行, ,下面用两个例子说明。下面用两个例子说明。14 PR0 EQU 0110H ;PR0 EQU 0110H ;用伪指令定义用伪指令定义PRnPRn的具体地址的具体地址 PR1 EQU 0220HPR1 EQU 0220H PR2 EQU 0330H PR2 EQU 0330H ORG 0000HORG 0000HMOV R3MOV R3,#01H ; #01H ; 设要转入第设要转入第2 2个程序段个程序段MOV A,R3 ;R3AMOV A,R3 ;R3AADD A,ACC ;A*2ADD A,ACC ;A*2MOV DPTR,#TABMOV DPTR,#TABPUSH ACCPUSH ACCMOVC A,A+DPTR ;MOVC A,A+DPTR ;取地址表中高字节取地址表中高字节MOV B,A MOV B,A ; ;暂存于暂存于B BINC DPLINC DPLPOP ACCPOP ACCMOVC A,A+DPTR ;MOVC A,A+DPTR ;取地址表中低字节取地址表中低字节MOV DPL,AMOV DPL,AMOV DPH,B ;MOV DPH,B ;DPTRDPTR为表中地址为表中地址CLR A ;A=0CLR A ;A=0JMP A+DPTR ;JMP A+DPTR ;转移转移TAB:DW PR0,PR1,PR2;TAB:DW PR0,PR1,PR2;转移地址表转移地址表ORG 0220HORG 0220HSJMP $ SJMP $ END END .2020020210100101TABTABTAB+2TAB+2DPH DPLDPH DPL例如例如 R3=1R3=1的操作的操作02022020152. 2. 利用转移指令表实现转移(直接跳到一个跳转指令中去执行)利用转移指令表实现转移(直接跳到一个跳转指令中去执行) 例例3-8 3-8 设有五个按键设有五个按键 0 0、1 1、2 2、3 3、4 4其编码分别为其编码分别为3AH3AH、47H47H、65H65H、70H70H、8BH8BH,要求根据按下的键转向不同的处理程序,分别为,要求根据按下的键转向不同的处理程序,分别为PR0 PR0 、PR1PR1、PR2PR2、PR3PR3、PR4PR4,设按键的编码已在,设按键的编码已在B B寄存器中,编出程序。寄存器中,编出程序。分析分析: : 将键码排成表,将键码表中的值和将键码排成表,将键码表中的值和B B中的键编码比对,记下在中的键编码比对,记下在键码表中和键码表中和B B中的键编码相等的序号,另安排一个转移表中的键编码相等的序号,另安排一个转移表, ,安排安排AJMPAJMP指令指令( (机器码机器码) ),因每条,因每条AJMPAJMP指令占二字节,将刚才记下的序号乘指令占二字节,将刚才记下的序号乘2 2即即为转移表的偏移地址,利用为转移表的偏移地址,利用JMP A+DPTRJMP A+DPTR执行表内的执行表内的AJMPAJMP指令,从而指令,从而实现多分支转移,实现多分支转移, 设设JPTJPT的地址为的地址为001AH,001AH,PR0PR0入口地址为入口地址为0110H,0110H,则则AJMP AJMP PRO PRO 的机器码是的机器码是2110H2110H因为因为AJMP AJMP 的机器码是的机器码是: :a a1010a a9 9a a8 800001a00001a7 7a a6 6a a5 5a a4 4a a3 3a a2 2a a1 1a a0 0PR1PR1入口地址为入口地址为0220H,0220H,则则AJMP AJMP PR1 PR1 的机器码是的机器码是4120H4120H;PR2PR2入口地址为入口地址为0330H,0330H,则则AJMP AJMP PR2 PR2 的机器码是的机器码是6130H6130H。键码表键码表TABTAB8BHTAB+470HTAB+365HTAB+247HTAB+13AHTABA=2A=1A=2A=0B=65HA=3A=43061JPT+42041JPT+21021JPTAJMP PR0AJMP PR1AJMP PR2转移指令表转移指令表JPTJPT.JPT+616AJMP 可跳的地址是可跳的地址是2K的范围,的范围,11位,所以位,所以机器码除机器码除00001外,就是要转入的外,就是要转入的11位地址。位地址。 ORG 0000H ORG 0000H MOV DPTR,#TAB ; MOV DPTR,#TAB ;置键码表首址置键码表首址 MOV A,#0 ; MOV A,#0 ;表的起始位的偏移量为表的起始位的偏移量为0 0 NEXT: PUSH ACC NEXT: PUSH ACC MOVC A,A+DPTR ; MOVC A,A+DPTR ;A=A=键码表的编码键码表的编码,B,B是键值是键值 CJNE A,B,AGAN ;CJNE A,B,AGAN ;将将B B中值和键码表的值比较中值和键码表的值比较 POP ACC POP ACC RL A ; RL A ;如相等如相等, ,序号乘序号乘2 2得分支表内偏移量得分支表内偏移量 MOV DPTR,#JPT ; MOV DPTR,#JPT ;置分支表首址置分支表首址 JMP A+DPTR JMP A+DPTR AGAN: POP ACC ; AGAN: POP ACC ;不相等比较下一个不相等比较下一个 INC A ; INC A ;序号加序号加1 1 CJNE A,#5,NEXT CJNE A,#5,NEXT SJMP $ ; SJMP $ ;键码查完还没有键码查完还没有B B中按键编码程序结束中按键编码程序结束 JPT: AJMP PR0 ; JPT: AJMP PR0 ;分支转移表分支转移表 AJMP PR1 AJMP PR1 AJMP PR2 AJMP PR2 AJMP PR3 AJMP PR3 AJMP PR4 AJMP PR4 TAB: DB 3AH,47H,65H,70H,8BH ; TAB: DB 3AH,47H,65H,70H,8BH ;键码表键码表 END END 17 PR0 EQU 0110H ; PR0 EQU 0110H ;用伪指令定义用伪指令定义PRnPRn的具体地址的具体地址 PR1 EQU 0220HPR1 EQU 0220H PR2 EQU 0330H PR2 EQU 0330H PR4 EQU 0440H PR4 EQU 0440H3.5 3.5 循环程序设计循环程序设计 当程序中的某些指令需要反复执行多次时,采用循环程序的方式,这当程序中的某些指令需要反复执行多次时,采用循环程序的方式,这样会使程序缩短,节省存储单元(但不节省执行时间)。样会使程序缩短,节省存储单元(但不节省执行时间)。 循环次数的控制,有两种控制方式循环次数的控制,有两种控制方式: :第一种方法第一种方法 先判断再处理,即先判断满不满足循环条件,如不满足,就不循环,先判断再处理,即先判断满不满足循环条件,如不满足,就不循环,多以循环条件作为控制。多以循环条件作为控制。第二种方法第二种方法 先处理再判断,即循环执行一遍后,下一轮还需不需要进行,通过计先处理再判断,即循环执行一遍后,下一轮还需不需要进行,通过计算循环次数来控制。算循环次数来控制。 循环可以有单重循环和多重循环,在多重循环中,内外循环不能交叉,循环可以有单重循环和多重循环,在多重循环中,内外循环不能交叉,也不允许外循环跳入内循环。下面通过几个实例说明循环程序的设计方法。也不允许外循环跳入内循环。下面通过几个实例说明循环程序的设计方法。18例例 3-93-9, 设计一个延时设计一个延时10ms10ms的延时子程序,已知单片机使用的晶振为的延时子程序,已知单片机使用的晶振为6MHz6MHz。 分析:延时时间与两个因素有关分析:延时时间与两个因素有关: :晶振频率和循环次数。由于晶振采用晶振频率和循环次数。由于晶振采用6MHz6MHz,一个机器周期是,一个机器周期是2s2s,用单循环可以实现,用单循环可以实现1ms1ms延时,外循环延时,外循环1010次次即可达即可达10ms10ms延时。延时。 内循环如何实现内循环如何实现1ms1ms延时呢,程序中可先以未知数延时呢,程序中可先以未知数MTMT代替,从附录代替,从附录A A查每条指令机器周期计算程序的执行时间。查每条指令机器周期计算程序的执行时间。 ORG 0020H ORG 0020H MOV R0 MOV R0,#0AH #0AH ;外循环外循环1010次次DL2DL2:MOV R1MOV R1,#MT #MT ;内循环内循环MTMT次次DL1DL1:NOP NOP NOP NOP ;空操作指令空操作指令 DJNZ R1DJNZ R1,DL1 DL1 DJNZ R0 DJNZ R0,DL2 DL2 RET RET内循环内循环DL1DL1到指令到指令DJNZ R1DJNZ R1,DL1DL1的计算:的计算: (1+1+21+1+2)2S2SMT=1000SMT=1000S MT=125=7DH MT=125=7DH将将7DH7DH代入上面程序的代入上面程序的MTMT,计算总的延,计算总的延时时间:时时间:1+1+1+1+(1+1+2)1+1+2)125+2125+210102S2S =10062S=10.062mS =10062S=10.062mS19例例3-10 3-10 编写多字节数编写多字节数1010程程序。序。 内部内部RAMRAM以以20H20H为首址的为首址的一片单元中存放着一个多字一片单元中存放着一个多字节无符号数,字节数存放在节无符号数,字节数存放在R7R7中,存放方式为低位字节中,存放方式为低位字节在低地址,高位字节在高地在低地址,高位字节在高地址,要求乘址,要求乘1010后的积仍存放后的积仍存放在这一片单元中。在这一片单元中。 分析:用分析:用R1R1作该多字节的作该多字节的地址指针,部分积的低位仍地址指针,部分积的低位仍存放于本单元,部分积的高存放于本单元,部分积的高位存放于位存放于R2R2,以便和下一位,以便和下一位的部分积的低位相加。以的部分积的低位相加。以R7R7作字节数计数。作字节数计数。 编程如下:编程如下: ORG 0000H ORG 0000H CLR C CLR C ;清进位位清进位位C C MOV R1 MOV R1,#20H #20H ;R1R1指示地址指示地址 MOV R2 MOV R2,#00H #00H ;存存放放积高八位积高八位的的寄存器寄存器R2R2清清0 0S10:MOV A, S10:MOV A, R1 ;R1 ;取一字节送取一字节送A A MOV B MOV B,#0AH #0AH ;1010送送B B PUSH PSW PUSH PSW MUL AB MUL AB ;字节乘字节乘1010 POP PSW POP PSW ADDC A ADDC A,R2 R2 ;上次积高八位加本次积低八位上次积高八位加本次积低八位 MOV R1MOV R1,A A ;送原存储单元送原存储单元 MOV R2MOV R2,B B ;积的高八位送积的高八位送R2R2 INC R1 INC R1 ;指向下一字节指向下一字节 DJNZ R7DJNZ R7,S10 S10 ;未乘完去未乘完去S10S10,否则向下执行,否则向下执行 MOV R1 MOV R1,B B ;存最高字节积的高位存最高字节积的高位 SJMP $SJMP $203.6 3.6 位操作程序设计位操作程序设计 MCS-51MCS-51单片机有着优异的位逻辑功能单片机有着优异的位逻辑功能, ,可以方便的实现各种复杂的逻可以方便的实现各种复杂的逻辑运算辑运算. .这种用软件替代硬件的方法这种用软件替代硬件的方法, ,可以大大简化甚至完全不用硬件可以大大简化甚至完全不用硬件, ,但但比硬件要多花运算时间。比硬件要多花运算时间。例例3-17 3-17 编写一程序编写一程序, ,以实现图以实现图3-73-7中的逻辑运算电路。中的逻辑运算电路。 其中其中P1P1.1.1和和P2.2P2.2分别是端口线上的信息分别是端口线上的信息,TF0,TF0和和IE1IE1分别是分别是定时器定时器0 0定时溢出标志和外部中定时溢出标志和外部中断断1 1请求标志请求标志, 25H, 25H和和26H26H分别是分别是两个位地址两个位地址, , 运算结果由端口线运算结果由端口线P1.3P1.3输出。输出。21程序如下:程序如下:START:MOV C,P2.2START:MOV C,P2.2 ORL C,TF0 ORL C,TF0 ANL C,P1.1 ANL C,P1.1 MOV F0,C MOV F0,C MOV C,IE1 MOV C,IE1 ORL C,/25H ORL C,/25H ANL C,F0 ANL C,F0 ANL C,/26H ANL C,/26H MOV P1.3,C MOV P1.3,C SJMP $ SJMP $22Y=X0X1X2+X0X1X2+X0X1X2X3+X4X5X6X7Y=X0X1X2+X0X1X2+X0X1X2X3+X4X5X6X7 X0 BIT ACC.0X0 BIT ACC.0 X1 BIT ACC.1 X1 BIT ACC.1 X2 BIT ACC.2 X2 BIT ACC.2 X3 BIT ACC.3 X3 BIT ACC.3 X4 BIT ACC.4 X4 BIT ACC.4 X5 BIT ACC.5 X5 BIT ACC.5 X6 BIT ACC.6 X6 BIT ACC.6 X7 BIT ACC.7 X7 BIT ACC.7 ORG 0000HORG 0000HMOV C,X0MOV C,X0ANL C,X1ANL C,X1ANL C,X2ANL C,X2MOV 00H,C ;X0X1X2MOV 00H,C ;X0X1X2MOV C,X0MOV C,X0ANL C,/X1ANL C,/X1MOV 01H,C ;X0X1MOV 01H,C ;X0X1ANL C,/X2ANL C,/X2ORL C,00HORL C,00HMOV 00H,C MOV 00H,C MOV C,X2MOV C,X2ANL C,01H ANL C,01H ANL C,X3 ;X0X1X2X3ANL C,X3 ;X0X1X2X3ORL C,/00HORL C,/00HMOV 00H,C MOV 00H,C MOV C,X7MOV C,X7ANL C,/X6ANL C,/X6ANL C,/X5ANL C,/X5ANL C,/X4 ; X4X5X6X7ANL C,/X4 ; X4X5X6X7ORL C,00H ; ORL C,00H ; 最终结果最终结果YCYCSJMP $ SJMP $ 例例3-18 3-18 设累加器设累加器A A的各位的各位ACC.0ACC.0ACC.7ACC.7分别记为分别记为X0X0X7X7,编制程序用软件实,编制程序用软件实现下式现下式: : 233.7 3.7 子程序子程序 当一段程序需多次应用当一段程序需多次应用, ,或为多人应用时或为多人应用时, ,这段程序编为子程序。这段程序编为子程序。 子程序是构成单片机应用程序必不可少的部分,通过子程序是构成单片机应用程序必不可少的部分,通过ACALLACALL和和LCALLLCALL两条子程序调用指令,可以十分方便地用来调用任何地址处的子程序。两条子程序调用指令,可以十分方便地用来调用任何地址处的子程序。 子程序节省占用的存储单元,使程序简短、清晰,灵活地使用子程子程序节省占用的存储单元,使程序简短、清晰,灵活地使用子程序,是程序设计的重要技巧之一。子程序必须以序,是程序设计的重要技巧之一。子程序必须以RETRET指令结尾。指令结尾。 在调用子程序时,有以下几点应注意:在调用子程序时,有以下几点应注意: 1 1)保护现场:如果在调用前主程序已经使用了某些存储单元或寄存器,)保护现场:如果在调用前主程序已经使用了某些存储单元或寄存器,在调用时,这些寄存器和存储单元又有其他用途,就应先把这些单元或在调用时,这些寄存器和存储单元又有其他用途,就应先把这些单元或寄存器中的内容压入堆栈保护,调用完后再从堆栈中弹出以便加以恢复。寄存器中的内容压入堆栈保护,调用完后再从堆栈中弹出以便加以恢复。如果有较多的寄存器要保护,应使主、子程序使用不同的寄存器组。如果有较多的寄存器要保护,应使主、子程序使用不同的寄存器组。 2 2)设置入口参数和出口参数:用之前主程序要按子程序的要求设置好地)设置入口参数和出口参数:用之前主程序要按子程序的要求设置好地址单元或存储器(称为入口参数),以便子程序从指定的地址单元或存址单元或存储器(称为入口参数),以便子程序从指定的地址单元或存储器获得输入数据;子程序经运算或处理后的结果存放到指定的地址单储器获得输入数据;子程序经运算或处理后的结果存放到指定的地址单元或寄存器(称为出口参数),主程序调用后从指定的地址单元或寄存元或寄存器(称为出口参数),主程序调用后从指定的地址单元或寄存器读取运算或处理后的结果。器读取运算或处理后的结果。 3 3)子程序中可包括对另外子程序的调用,称为子程序嵌套。)子程序中可包括对另外子程序的调用,称为子程序嵌套。 24例例3-19 3-19 用程序实现用程序实现c=ac=a2 2+b+b2 2,设,设a,ba,b均小于均小于1010。a a存放在存放在31H31H单元,单元,b b存放在存放在32H32H单元,把单元,把c c存入存入34H34H和和33H33H单元。(和要求为单元。(和要求为BCDBCD码)。码)。解:因该算式两次用到平方值,所以在程序中采用把求平方编为子程序的方解:因该算式两次用到平方值,所以在程序中采用把求平方编为子程序的方法。求平方采用查表法法。求平方采用查表法, ,主程序和子程序编写如下:主程序和子程序编写如下:主程序:主程序: ORG 0000H ORG 0000H MOV SPMOV SP,#3FH #3FH MOV AMOV A,31H 31H ;取;取a aLCALL SQR ;LCALL SQR ;求求a a方方MOV R1MOV R1,A AMOV AMOV A,32H 32H ;取;取b bLCALL SQR ; LCALL SQR ; 求求b b方方ADD AADD A,R1 ; R1 ; 求和求和DA A DA A ;调整;调整MOV 33HMOV 33H,A A MOV AMOV A,#0#0ADDC AADDC A,0 0MOV 34HMOV 34H,A A SJMP $ SJMP $ 子程序:子程序: ORG 0030HORG 0030HSQRSQR:INC A INC A MOVC A MOVC A,A+PC A+PC RET RETTABTAB:DB 00H,01H,04HDB 00H,01H,04H DB 09H 16H,25H, DB 09H 16H,25H, DB 36H,49H,64H,81H DB 36H,49H,64H,81H END END0035h0033h0031h04010034h00220032h83040030h090037h16.0036h十六进制表十六进制表253.8 3.8 小小 结结1 1、程序设计的关键在于指令熟悉和算法、程序设计的关键在于指令熟悉和算法( (思路思路) )正确、清晰,对复杂正确、清晰,对复杂的程序应先画出流程图。只有多做练习多上机调试,熟能生巧,的程序应先画出流程图。只有多做练习多上机调试,熟能生巧,才能编出高质量的程序。才能编出高质量的程序。2 2、伪指令是非执行指令,提供汇编程序以汇编信息,应正确使用。、伪指令是非执行指令,提供汇编程序以汇编信息,应正确使用。 3 3、本章应掌握顺序程序、分支程序、循环程序、子程序等各类程序、本章应掌握顺序程序、分支程序、循环程序、子程序等各类程序的设计方法,并能熟练应用查表技术简化程序的设计。的设计方法,并能熟练应用查表技术简化程序的设计。2627
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号