1、第3章 51单片机汇编语言程序设计第3章 汇编语言程序设计刘尊民刘尊民第3章 51单片机汇编语言程序设计内内 容容 提提 要要概述概述伪伪指令指令汇编语言程序设计步骤汇编语言程序设计步骤顺序程序设计顺序程序设计分支程序设计分支程序设计循环程序设计循环程序设计位操作程序设计位操作程序设计子程序子程序小结小结第3章 51单片机汇编语言程序设计3.1 概述概述 MCS-51单片机的编程语言可以是汇编语言也可以单片机的编程语言可以是汇编语言也可以是高级语言(如是高级语言(如C语言),高级语言编程快捷,但程语言),高级语言编程快捷,但程序长,占用存储空间大,执行慢;汇编语言产生的目序长,占用存储空间大,
2、执行慢;汇编语言产生的目标程序简短,占用存储空间小,执行快,能充分发挥标程序简短,占用存储空间小,执行快,能充分发挥计算机的硬件功能。无论是高级语言还是汇编语言,计算机的硬件功能。无论是高级语言还是汇编语言,源程序都要转换成目标程序(机器语言)单片机才能源程序都要转换成目标程序(机器语言)单片机才能执行。执行。第3章 51单片机汇编语言程序设计连接连接/定位器定位器L51汇编语言汇编语言源程序源程序汇编器汇编器A51符号转换程序符号转换程序OHS51绝对地址绝对地址目标程序目标程序.BINC语言程序语言程序浮浮动动地地址址目目标标程程序序编译器编译器C51 HEX图图 3-1 两种语言源程序转
3、换成目标程序两种语言源程序转换成目标程序第3章 51单片机汇编语言程序设计 目前很多公司将编辑器、汇编器、编译器、连接目前很多公司将编辑器、汇编器、编译器、连接/定位定位器、符号转换程序做成集成软件包,用户进入该集成环境,器、符号转换程序做成集成软件包,用户进入该集成环境,编辑好程序后,只需点击相应菜单就可以完成上述的各步,编辑好程序后,只需点击相应菜单就可以完成上述的各步,如如WAVEWAVE、KEIL KEIL,WAVEWAVE集成软件的使用见附录。集成软件的使用见附录。汇编汇编:将汇编语言:将汇编语言源程序源程序转换成机器语言转换成机器语言目标目标程序的程序的过程称为汇编。过程称为汇编。
4、汇编程序汇编程序:能将汇编语言:能将汇编语言源程序源程序转换成机器语言转换成机器语言目标目标程序的系统软件称为汇编程序。程序的系统软件称为汇编程序。第3章 51单片机汇编语言程序设计汇编的方法汇编的方法:汇编的方法有两种:汇编的方法有两种1.手工汇编手工汇编:人工查指令表,查出程序中每条指令对应的机人工查指令表,查出程序中每条指令对应的机器代码。早期的计算机使用。器代码。早期的计算机使用。2.机器汇编机器汇编:用计算机中的汇编程序对用户源程序进行汇编。用计算机中的汇编程序对用户源程序进行汇编。用机器汇编要提供给汇编一些信息,遵循汇编程用机器汇编要提供给汇编一些信息,遵循汇编程序的一些约定。这些
5、由伪指令指定。序的一些约定。这些由伪指令指定。第3章 51单片机汇编语言程序设计1)确定程序中每条汇编语言指令的指令机器码确定程序中每条汇编语言指令的指令机器码2)确定每条指令在存储器中的存放地址确定每条指令在存储器中的存放地址3)提供错误信息提供错误信息4)提供目标执行文件提供目标执行文件(*.OBJ/*.HEX)和列表文件和列表文件(*.LST)地址地址 机器码机器码源程序源程序 ORG 2000H 2000H 78 30 MAIN:MOV R0,#30H 2002H E6 MOV A,R0 第3章 51单片机汇编语言程序设计1.机器指令:指令系统中的全部指令。每条机器指令都机器指令:指令
6、系统中的全部指令。每条机器指令都有对应的机器代码,可以被有对应的机器代码,可以被CPU执行。执行。2.伪指令:伪指令:汇编控制指令,没有指令代码,只用于汇编汇编控制指令,没有指令代码,只用于汇编过程,为汇编程序提供汇编信息。过程,为汇编程序提供汇编信息。一、汇编语言指令类型一、汇编语言指令类型 宏汇编功能:将需要反复多次执行的程序段定义成一个宏宏汇编功能:将需要反复多次执行的程序段定义成一个宏指令名(宏定义)。编程时,可在程序中使用宏指令名来替指令名(宏定义)。编程时,可在程序中使用宏指令名来替代被定义的程序段(宏调用)。代被定义的程序段(宏调用)。3.2伪指令伪指令第3章 51单片机汇编语言
7、程序设计宏定义过程宏定义过程:宏调用过程:宏调用过程:宏指令名宏指令名 实际参数实际参数 宏指令名宏指令名 实际参数实际参数宏指令名宏指令名 MACRO 形式参数形式参数 ;被定义的程序段;被定义的程序段 ENDM第3章 51单片机汇编语言程序设计二伪指令二伪指令 常用伪指令及功能:常用伪指令及功能:1.起始指令起始指令 ORG nn功能:定义程序或数据块的起始地址。功能:定义程序或数据块的起始地址。指示此语句后面的程序指示此语句后面的程序或数据块以或数据块以nn为起始地址,连续存放在程序存储器中。为起始地址,连续存放在程序存储器中。指令地址指令地址 机器码机器码源程序源程序 ORG 2000
8、H 2000H 78 30 MAIN:MOV R0,#30H 2002H E6 MOV A,R0 ORG 3000H 3000H 23 TAB:DB 23H,100,A 3001H 64 3002H 41第3章 51单片机汇编语言程序设计2.字节定义字节定义 标号:标号:DB(字节常数,(字节常数,或字符或表达式)或字符或表达式)功能:功能:指示在程序存储器中以标号为起始地指示在程序存储器中以标号为起始地址的单元里存放的数为字节数据(八位二进址的单元里存放的数为字节数据(八位二进制数)。制数)。例如例如 LN:DB 32,C,25H,-1;LNLN+2 地址单元依次存放地址单元依次存放20H,
9、43H,25H,FFH地址地址 数据数据LN20LN+143LN+225LN+3FF3.字定义字定义 标号:标号:DW(字常数或表达式(字常数或表达式)作用:作用:指示在程序存储器中以标号为起始地址指示在程序存储器中以标号为起始地址的单元里存放的数为字数据(即的单元里存放的数为字数据(即16位的二进制数),位的二进制数),例如:例如:GH:DW 1234H,5678H,08GH1234GH+25678GH+40008第3章 51单片机汇编语言程序设计 5.等值指令等值指令 标号标号 EQU(数值表达式)(数值表达式)表示表示EQU两边的量等值,用于为标号或标识符赋值。两边的量等值,用于为标号或
10、标识符赋值。例如:例如:X1 EQU 2000H X2 EQU 0FH MAIN:MOV DPTR,#X1 ;DPTR=2000H ADD A,#X2 ;A=A+0FH4保留字节保留字节 标号:标号:DS(数值表达式)(数值表达式)作用:作用:指示在程序存储器中保留以标号为起始地指示在程序存储器中保留以标号为起始地址的若干字节单元,其单元个数由数值表达式指定。址的若干字节单元,其单元个数由数值表达式指定。例如例如 L1:DS 32;从从L1地址开始保留地址开始保留32个存储单元。个存储单元。第3章 51单片机汇编语言程序设计6.位定义位定义 标号标号 BIT 位地址位地址 作用:作用:同同EQ
11、U指令,不过定义的是位操作地址。指令,不过定义的是位操作地址。例如例如 AIC BIT P1.1。7.汇编结束汇编结束 END作用:作用:指示源程序段结束。指示源程序段结束。END指令放在程序的最后。指令放在程序的最后。A51汇编程序还有一些其它的伪指令,列在教材表汇编程序还有一些其它的伪指令,列在教材表3-1中,以中,以备查阅。备查阅。第3章 51单片机汇编语言程序设计汇编语言程序设计步骤汇编语言程序设计步骤一一.确定方案和计算方法确定方案和计算方法二二.了解应用系统的硬件配置、性能指标了解应用系统的硬件配置、性能指标三三.建立系统数学模型,确定控制算法和操作步骤建立系统数学模型,确定控制算
12、法和操作步骤四四.合理分配存储器单元和了解合理分配存储器单元和了解I/O接口地址接口地址五五.编制源程序编制源程序1.按功能设计程序,明确各程序之间按功能设计程序,明确各程序之间的相互关系的相互关系2.用流程图表示程序结构和功能用流程图表示程序结构和功能开始开始1 YN?3.程序中用注释说明指令在程序中的程序中用注释说明指令在程序中的作用,方便阅读、调试和修改作用,方便阅读、调试和修改第3章 51单片机汇编语言程序设计 顺序程序设计顺序程序设计例例3-1 编程将外部数据存储器编程将外部数据存储器的的000EH和和000FH单元的内单元的内容相换。容相换。常用程序结构常用程序结构 顺序程序、分支
13、程序、顺序程序、分支程序、循环程序、子程序循环程序、子程序000EH000FH000EH000FH000EH000FH000EH000FH分析分析:外部数据存储器的数据操外部数据存储器的数据操作只能用作只能用MOVX指令,且只能指令,且只能和和A之间传送,因此必须用一个之间传送,因此必须用一个中间环节作暂存,设用中间环节作暂存,设用20H单元。单元。用用R0、R1指示两单元的低八位指示两单元的低八位地址,高八位地址由地址,高八位地址由P2指示。指示。编程过程如下:编程过程如下:000EH000FH000EH000FH000EH000FH第3章 51单片机汇编语言程序设计 ORG 0000H M
14、OV P2,#0H ;送地址高八位至送地址高八位至P2口口 MOV R0,#0EH ;R0=0EH MOV R1,#0FH ;R1=OFH MOVX A,R0 ;A=(000EH)MOV 20H,A ;(20H)=(000EH)MOVX A,R1 ;A=(000FH)XCH A,20H ;A=(000EH),(20H)=(000FH)MOVX R1,A MOV A,20H MOVX R0,A ;交换后的数送各单元交换后的数送各单元 SJMP$END第3章 51单片机汇编语言程序设计 3.3 顺序程序设计顺序程序设计顺序程序顺序程序(简单程序简单程序),程序走向只有一条路径,程序走向只有一条路径
15、第3章 51单片机汇编语言程序设计例例3-3 分解压缩式分解压缩式BCD码码,使其成为非压缩式使其成为非压缩式BCD码。码。ORG 0000HMOV R0,#40H;设指针;设指针MOV A,R0;取一个字节;取一个字节MOV R2,A;暂存;暂存ANL A,#0FH;清;清0高半字节高半字节INC R0MOV R0,A ;保存数据个位;保存数据个位片内片内RAM42H41H40H65MOV A,R2SWAP A ;十位换到低半字节;十位换到低半字节ANL A,#0FHINC R0MOV R0,A;保存数据十位;保存数据十位END05050606第3章 51单片机汇编语言程序设计地址数据TAB
16、0TAB+11TAB+24TAB+39TAB+416HTAB+525H例例3-4 设变量放在片内设变量放在片内RAM的的20H单元单元,其值为其值为00H05H之间之间,要求编查表程序要求编查表程序,查出变量的平方值查出变量的平方值,并放入片内并放入片内RAM的的21H单元。单元。ORG 0000H MOV DPTR,#TAB MOV A,20H MOVC A,A+DPTR;查表查表 MOV 21H,A SJMP$TAB2:DB 00H,01H,04H,09H,16H,25H END分析分析:在程序存储器安排一张平方表,首地址为:在程序存储器安排一张平方表,首地址为TAB,以以DPTR指向表首
17、址,指向表首址,A存放变量值,利用查表指令存放变量值,利用查表指令MOVC A,A+DPTR,即可求得。,即可求得。表中数据用表中数据用BCD码存放合乎人们的习惯码存放合乎人们的习惯.如果平方值为两个字节,程序应如何编。如果平方值为两个字节,程序应如何编。DPTRA第3章 51单片机汇编语言程序设计 ORG 0000H ORG 0000H MOV A,R2 JNB ACC.7,N ;为正数?;为正数?CPL A ;负数变补;负数变补 INC A MOV R2,AN:SJMP$;结束;结束 3.4 3.4 分支程序的设计分支程序的设计 由条件转移指令构成程序判断框部分,形成分支结构由条件转移指令
18、构成程序判断框部分,形成分支结构3.5.1 3.5.1 单分支程序单分支程序一个判断决策框,两种分支结构图。一个判断决策框,两种分支结构图。条件满足条件满足?N影响条件影响条件Y处理段处理段条件满足条件满足?N影响条件影响条件Y处理处理1处理处理2例例1 1 求求8 8位有符号数的绝对值。位有符号数的绝对值。方法:正数不变,负数变补方法:正数不变,负数变补第3章 51单片机汇编语言程序设计 例例2 用单片机加重力传感器作磅秤,秤出重量后算出行李运用单片机加重力传感器作磅秤,秤出重量后算出行李运费价格,其秤出的重量以费价格,其秤出的重量以10kg为为1个计价单位个计价单位G,G已存入已存入40H
19、单元。计价方法单元。计价方法为为50kg以内按以内按3元元,50kg以上以上分段计价分段计价:50kg按按3元计价元计价,超过部分按,超过部分按2元计价。元计价。由此列出算式:由此列出算式:G3+(G-5)2;当当G5M=G3 ;当;当G5 3G因重复使用,先暂存在因重复使用,先暂存在R2。流程。流程见左见左,程序如下:程序如下:第3章 51单片机汇编语言程序设计 多分支散转程序的设计多分支散转程序的设计 有一类分支程序有一类分支程序,它根据不同的输入条件或不同的运算结果它根据不同的输入条件或不同的运算结果,转向不同的处理程序转向不同的处理程序,称之为散转程序。这类程序通常利用称之为散转程序。
20、这类程序通常利用JMPA+DPTR间接转移指令实现转移。有如下两种设计方法:间接转移指令实现转移。有如下两种设计方法:1.查转移地址表查转移地址表:将将转移地址转移地址列成表格,将表格的内容作转移的目标地址。列成表格,将表格的内容作转移的目标地址。2.查转移指令表查转移指令表:将转移到不同程序的将转移到不同程序的转移指令转移指令列成表格,判断条件后查表,列成表格,判断条件后查表,转到表中指令执行转到表中指令执行,下面用两个例子说明。下面用两个例子说明。第3章 51单片机汇编语言程序设计1.利用转移地址表实现转移利用转移地址表实现转移 例例3-7 根据根据R3的内容转向对应的程序,的内容转向对应
21、的程序,R3的内容为的内容为0n,处处理程序的入口符号地址分别为理程序的入口符号地址分别为PR0PRn(n128)。分析:将分析:将PR0PRn入口地址列在表格中,每一项占两个单入口地址列在表格中,每一项占两个单元,元,PRn在表中的偏移量为在表中的偏移量为2n,因此将,因此将R3的内容乘的内容乘2即得即得PRn在表中的偏移地址,从偏移地址在表中的偏移地址,从偏移地址2n和和2n+1两个单元分两个单元分别取出别取出PRn的高八位地址和低八位地址送的高八位地址和低八位地址送DPTR寄存器,寄存器,用用JMP A+DPTR指令(指令(A先清零)即转移到先清零)即转移到PRn入口执入口执行。行。第3
22、章 51单片机汇编语言程序设计ORG 0000HMOV A,R3 ;R3AADD A,ACC ;A*2MOV DPTR,#TABPUSH ACCMOVC A,A+DPTR;取地址表中高字节取地址表中高字节MOV B,A ;暂存于暂存于BINC DPTRPOP ACCMOVC A,A+DPTR;取地址表中低字节取地址表中低字节MOV DPL,AMOV DPH,B ;DPTR为表中地址为表中地址CLR A ;A=0JMP A+DPTR ;转移转移TAB:DW PR0,PR1,PR2,.,PRn;转移地址转移地址表表END01100220.TABTAB+2DPH DPL例如例如 R3=1的操作的操作
23、0220第3章 51单片机汇编语言程序设计2.利用转移指令表实现转移利用转移指令表实现转移 例例3-8 设有五个按键设有五个按键 0、1、2、3、4其编码分别为其编码分别为3AH、47H、65H、70H、8BH,要求根据按下的键转向不同的处,要求根据按下的键转向不同的处理程序,分别为理程序,分别为PR0、PR1/PR2、PR3、PR4,设按键,设按键的编码已在的编码已在B寄存器中,编出程序。寄存器中,编出程序。分析分析:将键码排成表,将键码表中的值和将键码排成表,将键码表中的值和B中的键编码比对,中的键编码比对,记下在键码表中和记下在键码表中和B中的键编码相等的序号,另安排一个转移中的键编码相
24、等的序号,另安排一个转移表表,安排安排AJMP指令指令(机器码机器码),因每条,因每条AJMP指令占二字节,将指令占二字节,将刚才记下的序号乘刚才记下的序号乘2即为转移表的偏移地址,利用即为转移表的偏移地址,利用JMP A+DPTR执行表内的执行表内的AJMP指令,从而实现多分支转移,指令,从而实现多分支转移,设设JPT的地址为的地址为001AH、PR0入口地址为入口地址为0110H、,参考,参考2.4.2节,求节,求AJMP PR0的机器码的机器码0000 0001 0001 0000 001 00001 0000(2110h)a10a9a8a7a6a5a4a3a2a1a0 第3章 51单片
25、机汇编语言程序设计AJMP PR0的机器码为的机器码为2110H,PR1入口地址为入口地址为0220H AJMP PR1的机器码为的机器码为4120H,转移指令表转移指令表JPT的内容如下所的内容如下所示。设示。设B=65H,键值为键值为2:2041JPT+42002JPT+21021JPTAJMP PR0AJMP PR1AJMP PR2TAB3AHTAB+147HTAB+265HTAB+370H转移指令表转移指令表JPT键码表键码表TAB65HA2B2AA=1A=2A=065H65H第3章 51单片机汇编语言程序设计 ORG 0000H MOV DPTR,#TAB ;置键码表首址置键码表首址
26、 MOV A,#0 ;表的起始位的偏移量为表的起始位的偏移量为0 NEXT:PUSH ACC MOVC A,A+DPTR ;A=键码表的编码键码表的编码 CJNE A,B,AGAN ;将将B中值和键码表的值比较中值和键码表的值比较 POP ACC RL A ;如相等如相等,序号乘序号乘2得分支表内偏移量得分支表内偏移量 MOV DPTR,#JPT ;置分支表首址置分支表首址 JMP A+DPTR AGAN:POP ACC ;不相等比较下一个不相等比较下一个 INC A ;序号加序号加1 CJNE A,#5,NEXT SJMP$;键码查完还没有键码查完还没有B中按键编码程序结中按键编码程序结束束
27、 JPT:AJMP PR0 ;分支转移表分支转移表 AJMP PR1 AJMP PR2 AJMP PR3 AJMP PR4 TAB:DB 3AH,47H,65H,70H,8BH ;键码表键码表 END第3章 51单片机汇编语言程序设计 当程序中的某些指令需要反复执行多次时,采用循环程当程序中的某些指令需要反复执行多次时,采用循环程序的方式,这样会使程序缩短,节省存储单元(并不节省序的方式,这样会使程序缩短,节省存储单元(并不节省执行时间)。执行时间)。循环次数的控制,有两种控制方式循环次数的控制,有两种控制方式:第一种方法第一种方法先判断再处理即先判断满不满足循环条件,如不满足,就先判断再处理
28、即先判断满不满足循环条件,如不满足,就不循环,多以循环条件控制。不循环,多以循环条件控制。第二种方法第二种方法先处理再判断,即循环执行一遍后,下一轮还需不需要进先处理再判断,即循环执行一遍后,下一轮还需不需要进行,多以计循环次数控制。循环可以有单重循环和多重循行,多以计循环次数控制。循环可以有单重循环和多重循环,在多重循环中,内外循环不能交叉,也不允许外循环环,在多重循环中,内外循环不能交叉,也不允许外循环跳入内循环。下面通过几个实例说明循环程序的设计方法。跳入内循环。下面通过几个实例说明循环程序的设计方法。3.5 循循 环环 程程 序序 设设 计计第3章 51单片机汇编语言程序设计例例 3-
29、9 设计一个延时设计一个延时10ms的延时子程序,已知单片机使用的的延时子程序,已知单片机使用的晶振为晶振为6MHz。分析分析:延时时间与两个因素有关延时时间与两个因素有关:晶振频率和循环次数。由于晶振频率和循环次数。由于晶振采用晶振采用6MHz,一个机器周期是,一个机器周期是2s,用单循环可以实现,用单循环可以实现1ms延时,外循环延时,外循环10次即可达次即可达10ms延时。延时。内循环如何实现内循环如何实现1ms延时呢,程序中可先以未知数延时呢,程序中可先以未知数MT代替,从附录代替,从附录A查每条指令机器周期计算程序的执行时间。查每条指令机器周期计算程序的执行时间。第3章 51单片机汇
30、编语言程序设计 ORG 0020H MOV R0,#0AH ;外循环;外循环10次次 DL2:MOV R1,#MT ;内循环;内循环MT次次 DL1:NOP NOP ;空操作指令;空操作指令 DJNZ R1,DL1 DJNZ R0,DL2 RET内循环内循环DL1到指令到指令DJNZ R1,DL1的计算:的计算:(1+1+2)2SMT=1000S MT=125=7DH将将7DH代入上面程序的代入上面程序的MT,计算总的延时时间:,计算总的延时时间:1+1+(1+1+2)125+2*102S =10062S=10.062mS若需要延时更长时间,可以采用多重循环。若需要延时更长时间,可以采用多重循
31、环。内内外外第3章 51单片机汇编语言程序设计例例3-10 编写多字节数编写多字节数10程序。程序。内部内部RAM以以20H为首址的一片单元中存放着一个多字为首址的一片单元中存放着一个多字节符号数,字节数存放在节符号数,字节数存放在R7中,存放方式为低位字节在低中,存放方式为低位字节在低地址,高位字节在高地址,要求乘地址,高位字节在高地址,要求乘10后的积仍存放在这一后的积仍存放在这一片单元中。片单元中。分析分析 用用R1作该多字节的作该多字节的地址指针,部分积的低位仍地址指针,部分积的低位仍存放于本单元,部分积的高存放于本单元,部分积的高位存放于位存放于R2,以便和下一,以便和下一位的部分积
32、的低位相加。位的部分积的低位相加。以以R7作字节数计数。作字节数计数。编程如下:编程如下:345 H 0A H 32 H 28 H 2B H 1E H 20B H第3章 51单片机汇编语言程序设计 ORG 0000H CLR C ;清进位位;清进位位C MOV R1,#20H ;R1指示地址指示地址 MOV R2,#00H ;存积的高八位寄存器;存积的高八位寄存器R2清清0S10:MOV A,R1 ;取一字节送;取一字节送A MOV B,#0AH ;10送送B PUSH PSW MUL AB ;字节乘;字节乘10 POP PSW ADDC A,R2 ;上次积高八位加本次积低八位;上次积高八位加
33、本次积低八位 MOV R1,A ;送原存储单元;送原存储单元 MOV R2,B ;积的高八位送;积的高八位送R2 INC R1 ;指向下一字节;指向下一字节 DJNZ R7,S10 ;未乘完去;未乘完去SH10,否则向下执行,否则向下执行 MOV R1,B ;存最高字节积的高位;存最高字节积的高位 SJMP$第3章 51单片机汇编语言程序设计 MCS-51单片机有着优异的位逻辑功能单片机有着优异的位逻辑功能,可以方便的实可以方便的实现各种复杂的逻辑运算现各种复杂的逻辑运算.这种用软件替代硬件的方法这种用软件替代硬件的方法,可以可以大大简化甚至完全不用硬件大大简化甚至完全不用硬件,但比硬件要多花
34、运算时间。但比硬件要多花运算时间。例例3-17 编写一程序编写一程序,以实现图以实现图3-4中的逻辑运算电路中的逻辑运算电路.3.6 位操作程序设计位操作程序设计第3章 51单片机汇编语言程序设计P1.311&1P1.1P2.2TF0IE125H(位)26H(位)其中其中P1.1和和P2.2分别是端口线上的信息分别是端口线上的信息,TF0和和IE1分别是分别是定时器定时溢出标志和外部中请求标志定时器定时溢出标志和外部中请求标志,25H和和26H分别是两个分别是两个位地址位地址,运算结果由端口线运算结果由端口线P1.3输出。输出。图图3-4 硬件逻辑运算电路硬件逻辑运算电路第3章 51单片机汇编
35、语言程序设计程序如下:程序如下:START:MOV C,P2.2 ORL C,TF0 ANL C,P1.1 MOV F0,C MOV C,IE1 ORL C,/25H ANL C,F0 ANL C,/26H MOV P1.3,C SJMP$第3章 51单片机汇编语言程序设计例例3-18 设累加器设累加器A的各位的各位ACC.0ACC.7分别记为分别记为X0X7,编制程序用软件实现下式编制程序用软件实现下式:Y=X0X1X2+X0 X1 X2+X0X1X2X3+X4 X5 X6X7 X0 BIT ACC.0 X1 BIT ACC.1 X2 BIT ACC.2 X3 BIT ACC.3 X4 BI
36、T ACC.4 X5 BIT ACC.5 X6 BIT ACC.6 X7 BIT ACC.7第3章 51单片机汇编语言程序设计 ORG 0000H MOV C,X0ANL C,X1ANL C,X2MOV 00H,C ;X0X1X2MOV C,X0ANL C,/X1 MOV 01H,C ;X0X1ANL C,/X2ORL C,00HMOV 00H,C MOV C,X2ANL C,01H ANL C,X3 ;X0X1X2X3 ORL C,/00H MOV 00H,C MOV C,X7ANL C,/X6ANL C,/X5ANL C,/X4 ;X4 X5 X6 X7ORL C,00H ;最终结果最终结
37、果 YC SJMP$第3章 51单片机汇编语言程序设计 子程序是构成单片机应用程序必不可少的部分,通过子程序是构成单片机应用程序必不可少的部分,通过ACALL和和LCALL两条子程序调用指令,可以十分方便地两条子程序调用指令,可以十分方便地用来调用任何地址处的子程序。用来调用任何地址处的子程序。子程序节省占用的存储单元,使程序简短、清晰,善子程序节省占用的存储单元,使程序简短、清晰,善于灵活的使用子程序,是程序设计的重要技巧之一。于灵活的使用子程序,是程序设计的重要技巧之一。子程序必须以子程序必须以RET指令结尾指令结尾.在调用子程序时,有以下几点应在调用子程序时,有以下几点应注意注意:3.7
38、 子程序子程序 当一段程序需多次应用当一段程序需多次应用,或为多人应用时或为多人应用时,这段程序编为子这段程序编为子程序程序.第3章 51单片机汇编语言程序设计 1)保护现场。)保护现场。如果在调用前主程序已经使用了某些存储单元或寄存器,在调用如果在调用前主程序已经使用了某些存储单元或寄存器,在调用时,这些寄存器和存储单元又有其他用途,就应先把这些单元或寄时,这些寄存器和存储单元又有其他用途,就应先把这些单元或寄存器中的内容压入堆栈保护,调用完后再从堆栈中弹出以便加以恢存器中的内容压入堆栈保护,调用完后再从堆栈中弹出以便加以恢复。如果有较多的寄存器要保护,应使主、子程序使用不同的寄存复。如果有
39、较多的寄存器要保护,应使主、子程序使用不同的寄存器组。器组。2)设置入口参数和出口参数。)设置入口参数和出口参数。用之前主程序要按子程序的要求设置好地址单元或存储器(称为用之前主程序要按子程序的要求设置好地址单元或存储器(称为入口参数),以便子程序从指定的地址单元或存储器获得输入数据;入口参数),以便子程序从指定的地址单元或存储器获得输入数据;子程序经运算或处理后的结果存放到指定的地址单元或寄存器子程序经运算或处理后的结果存放到指定的地址单元或寄存器(称为出口参数),主程序调用后从指定的地址单元或寄存器读取(称为出口参数),主程序调用后从指定的地址单元或寄存器读取运算或处理后的结果,只有这样,
40、才能完成子程序和主程序间的数运算或处理后的结果,只有这样,才能完成子程序和主程序间的数据的正确传递。据的正确传递。第3章 51单片机汇编语言程序设计3)子程序中可包括对另外子程序的调用,称为子程序嵌套。)子程序中可包括对另外子程序的调用,称为子程序嵌套。例例3-19 用程序实现用程序实现c=a2+b2,设,设a,b均小于均小于10。a存放在存放在31H单元,单元,b存放在存放在32H单元,把单元,把c存入存入34H和和33H单元。(和要求为单元。(和要求为BCD码)。码)。解解:因该算式两次用到平方值,所以在程序中采用把求平方:因该算式两次用到平方值,所以在程序中采用把求平方编为子程序的方法。
41、求平方采用查表法编为子程序的方法。求平方采用查表法,主程序和子程序编写如主程序和子程序编写如下:下:第3章 51单片机汇编语言程序设计主程序:主程序:ORG 0000H MOV SP,#3FH MOV A,31H ;取;取aLCALL SQR ;求求a方方 MOV R1,AMOV A,32H ;取;取bLCALL SQR ;求求b方方ADD A,R1 ;求和求和DA A ;调整;调整MOV 33H,A MOV A,#0ADDC A,0 MOV 34H,A SJMP$子程序:子程序:ORG 0030HSQR:INC A MOVC A,A+PC RETTAB:DB 00H,01H,04H DB 0
42、9H 16H,25H,DB 36H,49H64H,81H END第3章 51单片机汇编语言程序设计3.8 小小 结结1、程序设计的关键在于指令熟悉和算法、程序设计的关键在于指令熟悉和算法(思路思路)正确、清晰,正确、清晰,对复杂的程序应先画出流程图。只有多做练习多上机调试,对复杂的程序应先画出流程图。只有多做练习多上机调试,熟能生巧,才能编出高质量的程序。熟能生巧,才能编出高质量的程序。2、伪指令是非执行指令,提供汇编程序以汇编信息,应正确、伪指令是非执行指令,提供汇编程序以汇编信息,应正确使用。使用。3、本章应掌握顺序程序、分支程序、循环程序、子程序等各、本章应掌握顺序程序、分支程序、循环程序、子程序等各类程序的设计方法,并能熟练应用查表技术简化程序的设类程序的设计方法,并能熟练应用查表技术简化程序的设计。计。