中大单片机_第4章 MCS-51汇编语言程序设计
《中大单片机_第4章 MCS-51汇编语言程序设计》由会员分享,可在线阅读,更多相关《中大单片机_第4章 MCS-51汇编语言程序设计(60页珍藏版)》请在装配图网上搜索。
1、第第4 4章章 MCS-51MCS-51汇编语言程序设计汇编语言程序设计 汇编语言是面向机器硬件的语言汇编语言是面向机器硬件的语言,要求程序设计者对,要求程序设计者对MCS-51MCS-51单片机具有很好的单片机具有很好的“软、硬结合软、硬结合”的功底。的功底。 介绍介绍程序设计的基本知识程序设计的基本知识及如何及如何使用汇编语言来进行使用汇编语言来进行基本的程序设计。基本的程序设计。4.1 4.1 汇编语言程序设计概述汇编语言程序设计概述 4.1.1 4.1.1 机器语言、汇编语言和高级语言机器语言、汇编语言和高级语言用于程序设计的用于程序设计的语言基本上分为语言基本上分为3 3种:机器语言
2、、汇编种:机器语言、汇编语言和高级语言语言和高级语言。 1.1.机器语言机器语言 二进制代码表示的指令、数字和符号简称为机器语言二进制代码表示的指令、数字和符号简称为机器语言 不易懂,难记忆,易出错。不易懂,难记忆,易出错。 2汇编语言汇编语言 英文助记符表示的指令称为英文助记符表示的指令称为符号语言符号语言或或汇编语言汇编语言将汇编语言程序转换成为二进制代码表示的机器语言将汇编语言程序转换成为二进制代码表示的机器语言程序称为程序称为汇编程序汇编程序经汇编程序经汇编程序“汇编(翻译)汇编(翻译)”得到的机器语言程序称得到的机器语言程序称为为目标程序目标程序,原来的汇编语言程序称为,原来的汇编语
3、言程序称为源程序源程序。汇编语言特点汇编语言特点:(1)(1) 面向机器的语言,程序设计员须对面向机器的语言,程序设计员须对MCS-51MCS-51的硬件的硬件有相当深入的了解。有相当深入的了解。(2)(2) 助记符指令和机器指令一一对应,用汇编语言编助记符指令和机器指令一一对应,用汇编语言编写的写的程序效率高程序效率高,占用,占用存储空间小存储空间小,运行,运行速度快速度快,用汇编语言能编写出最优化的程序。用汇编语言能编写出最优化的程序。 能直接管理和控制硬件设备(功能部件),它能处理能直接管理和控制硬件设备(功能部件),它能处理中断,也能直接访问存储器及中断,也能直接访问存储器及I/OI/
4、O接口电路。接口电路。汇编语言和机器语言都脱离不开具体机器的硬件,均汇编语言和机器语言都脱离不开具体机器的硬件,均是面向是面向“机器机器”的语言,缺乏通用性。的语言,缺乏通用性。3 3高级语言高级语言不受具体机器的限制不受具体机器的限制, ,使用了许多数学公式和数学计算使用了许多数学公式和数学计算上的习惯用语,上的习惯用语,非常擅长于科学计算。非常擅长于科学计算。常用的如常用的如BASICBASIC、FORTRANFORTRAN以及以及C C语言等。语言等。高级语言优点:通用性强,直观、易懂、易学,可读高级语言优点:通用性强,直观、易懂、易学,可读性好。性好。使用使用C C语言(语言(C51C
5、51)、)、PL/MPL/M语言来进行语言来进行MCS-51MCS-51的应用程的应用程序设计。序设计。 对于程序的空间和时间要求很高的场合,汇编语言仍对于程序的空间和时间要求很高的场合,汇编语言仍是必不可缺的。是必不可缺的。 C C语言和汇编语言混合编程语言和汇编语言混合编程 在很多需要直接控制硬件的应用场合,则更是非用汇在很多需要直接控制硬件的应用场合,则更是非用汇编语言不可编语言不可 使用汇编语言编程,是单片机程序设计的使用汇编语言编程,是单片机程序设计的基本功之一基本功之一4.1.2 4.1.2 汇编语言语句的种类和格式汇编语言语句的种类和格式两种基本类型:指令语句和伪指令语句两种基本
6、类型:指令语句和伪指令语句(1 1)指令语句)指令语句已在第已在第3 3章介绍章介绍每一条指令语句在汇编时都产生一个指令代码每一条指令语句在汇编时都产生一个指令代码机机器代码器代码(2 2)伪指令语句)伪指令语句 是为汇编服务的。在汇编时是为汇编服务的。在汇编时没有机器代码与之对应。没有机器代码与之对应。 MCS-51MCS-51的汇编语言的的汇编语言的四分段格式四分段格式如下:如下: 标号字段标号字段 操作码字段操作码字段 操作数字段操作数字段 注释字段注释字段规则:规则:(1 1)标号字段和操作字码段之间要有冒号)标号字段和操作字码段之间要有冒号“:”相隔;相隔;(2 2)操作码字段和操作
7、数字段间的分界符是空格;)操作码字段和操作数字段间的分界符是空格;(3 3)双操作数之间用逗号相隔;)双操作数之间用逗号相隔; (4 4)操作数字段和注释字段之间的分界符用分号)操作数字段和注释字段之间的分界符用分号“;”相隔。相隔。操作码字段为必选项,其余各段为任选项。操作码字段为必选项,其余各段为任选项。例例4-14-1 下面是一段汇编语言程序的四分段书写格式下面是一段汇编语言程序的四分段书写格式 标号字段标号字段 操作码字段操作码字段 操作数字段操作数字段 注释字段注释字段 START: MOV A,#00H ;0A MOV R1,#10 ;10R1 MOV R2,#00000011B
8、;3R2 LOOP:ADD A,R2 ;(;(A)+(R2)A DJNZ R1,LOOP;R1内容减内容减1不不 为零,则循环为零,则循环 NOP HERE: SJMP HERE基本语法规则:基本语法规则:1 1标号字段标号字段是语句所在地址的标志符号是语句所在地址的标志符号 (1 1)标号后边必须跟以冒号)标号后边必须跟以冒号“:” (2 2)由)由1 18 8个个ASCIIASCII字符组成字符组成(3 3)同一标号在一个程序中只能定义一次)同一标号在一个程序中只能定义一次 (4 4)不能使用汇编语言已经定义的符号作为标号)不能使用汇编语言已经定义的符号作为标号 2 2操作码字段操作码字段
9、 是汇编语言指令中唯一不能空缺的部分。汇编程序就是汇编语言指令中唯一不能空缺的部分。汇编程序就是根据这一字段来生成机器代码的。是根据这一字段来生成机器代码的。3 3操作数字段操作数字段 通常有单操作数、双操作数和无操作数三种情况。如通常有单操作数、双操作数和无操作数三种情况。如果是双操作数,则操作数之间,要以逗号隔开。果是双操作数,则操作数之间,要以逗号隔开。(1 1)十六进制、二进制和十进制形式的操作数表示)十六进制、二进制和十进制形式的操作数表示 采用十六进制形式来表示采用十六进制形式来表示 ,某些特殊场合才采用二,某些特殊场合才采用二进制或十进制的表示形式进制或十进制的表示形式 。十六进
10、制,后缀十六进制,后缀“H H” 。二进制,后缀二进制,后缀“B B” 。十进制,后缀十进制,后缀“D D”,也可省略也可省略。若十六进制的若十六进制的操作数以字符操作数以字符A AF F中的某个开头时,则中的某个开头时,则需在它需在它前面加一个前面加一个 “0 0”,以便在汇编时把它和字,以便在汇编时把它和字符符A AF F区别开来。区别开来。(2 2)工作寄存器和特殊功能寄存器的表示)工作寄存器和特殊功能寄存器的表示采用工作寄存器和特殊功能寄存器的代号来表示,也采用工作寄存器和特殊功能寄存器的代号来表示,也可用其地址来表示。可用其地址来表示。 例如,累加器可用例如,累加器可用A A(或(或
11、AccAcc)表示。也可用)表示。也可用0E0H0E0H来表来表示,示,0E0H0E0H为累加器为累加器A A的地址。的地址。(3 3)美元符号)美元符号$ $的使用的使用用于表示该转移指令操作码所在的地址。例如,如下用于表示该转移指令操作码所在的地址。例如,如下指令:指令: JNB F0JNB F0, $ $与如下指令是等价的:与如下指令是等价的:HEREHERE:JNB F0JNB F0,HEREHERE 再如:再如:HEREHERE:SJMP HERESJMP HERE可写为:可写为: SJMP $SJMP $4 4注释字段注释字段 必须以分号必须以分号“;”开头,换行书写,但必须注意也
12、要开头,换行书写,但必须注意也要以分号以分号“;”开头。开头。 汇编时,注释字段不会产生机器代码。汇编时,注释字段不会产生机器代码。4.1.3 4.1.3 伪指令伪指令在在MCS-51 MCS-51 汇编语言源程序中应有向汇编程序发出的指汇编语言源程序中应有向汇编程序发出的指示信息,告诉它如何完成汇编工作,这是通过使用示信息,告诉它如何完成汇编工作,这是通过使用伪指令来实现的。伪指令来实现的。也称为汇编程序控制命令。只有在汇编前的源程序中也称为汇编程序控制命令。只有在汇编前的源程序中才有伪指令。经过汇编得到目标程序(机器代码)才有伪指令。经过汇编得到目标程序(机器代码)后,伪指令已无存在的必要
13、,所以后,伪指令已无存在的必要,所以“伪伪”体现在汇体现在汇编时,编时,伪指令没有相应的机器代码产生伪指令没有相应的机器代码产生。常用的伪指令常用的伪指令: 1.ORG1.ORG(ORiGinORiGin)汇编起始地址命令)汇编起始地址命令 在汇编语言源程序的开始,通常都用一条在汇编语言源程序的开始,通常都用一条ORGORG伪指令伪指令来实现规定程序的起始地址。如不用来实现规定程序的起始地址。如不用ORGORG规定,则规定,则汇编得到的目标程序将从汇编得到的目标程序将从0000H0000H开始。开始。例如:例如: ORG 2000HORG 2000HSTARTSTART:MOV A,#00HM
14、OV A,#00H规定标号规定标号STARTSTART代表地址为代表地址为2000H2000H开始。开始。在一个源程序中,可多次使用在一个源程序中,可多次使用ORGORG指令,来规定不同指令,来规定不同的程序段的起始地址。但是,的程序段的起始地址。但是,地址必须由小到大排地址必须由小到大排列,地址不能交叉、重叠列,地址不能交叉、重叠。例如:。例如:ORG 2000HORG 2000H ORG 2500HORG 2500H ORG 3000HORG 3000H2. 2. END(END of assembly)END(END of assembly)汇编终止命令汇编终止命令汇编语言源程序的结束标
15、志,用于终止源程序的汇汇编语言源程序的结束标志,用于终止源程序的汇编工作。在整个源程序中只能有一条编工作。在整个源程序中只能有一条ENDEND命令,且命令,且位于程序的最后。位于程序的最后。3 3DBDB(Define ByteDefine Byte)定义字节命令)定义字节命令在程序存储器的连续单元中定义字节数据。在程序存储器的连续单元中定义字节数据。 ORG 2000HORG 2000HDB 30HDB 30H,40H40H,2424,“C C”,“B B”汇编后:汇编后:(2000H2000H)=30H=30H(2001H2001H)=40H=40H(2002H2002H)=18H=18H
16、(1010进制数进制数2424)(2003H2003H)=43H=43H(字符(字符“C C”的的ASCIIASCII码)码)(2004H2004H)=42H=42H(字符(字符“B B”的的ASCIIASCII码)码)DBDB功能是从指定单元开始定义(存储)若干个字节,功能是从指定单元开始定义(存储)若干个字节,1010进制数自然转换成进制数自然转换成1616进制数,字母按进制数,字母按ASCIIASCII码存码存储。储。4 4DWDW(Define WordDefine Word)定义数据字命令)定义数据字命令从指定的地址开始,在程序存储器的连续单元中定义从指定的地址开始,在程序存储器的连
17、续单元中定义1616位的数据字。例如:位的数据字。例如:ORG 2000HORG 2000HDW 1246HDW 1246H,7BH7BH,1010汇编后:汇编后:(2000H2000H)=12H=12H;第;第1 1个字个字(2001H2001H)=46H =46H (2002H2002H)=00H=00H;第;第2 2个字个字(2003H2003H)=7BH=7BH(2004H2004H)=00H=00H;第;第3 3个字个字(2005H2005H)=0AH =0AH 5 5EQUEQU(EQUateEQUate)赋值命令)赋值命令用于给标号赋值。赋值以后,其标号值在整个程序有用于给标号赋
18、值。赋值以后,其标号值在整个程序有效。例如:效。例如:TEST EQU 2000HTEST EQU 2000H表示标号表示标号TEST=2000HTEST=2000H,在汇编时,凡是遇到标号,在汇编时,凡是遇到标号TESTTEST时,均以时,均以2000H2000H来代替。来代替。 4.1.4 4.1.4 汇编语言程序设计步骤汇编语言程序设计步骤(1 1)分析问题,确定算法)分析问题,确定算法(2 2)根据算法,画出程序框图)根据算法,画出程序框图(3 3)分配内存工作区及有关端口地址)分配内存工作区及有关端口地址(4 4)编写程序)编写程序养成在程序的适当位置上加上注释的好习惯。养成在程序的
19、适当位置上加上注释的好习惯。(5 5)上机调试)上机调试编写完毕的程序,必须编写完毕的程序,必须“汇编汇编”成机器代码,才能调成机器代码,才能调试和运行,调试与硬件有关程序还要借助于仿真开试和运行,调试与硬件有关程序还要借助于仿真开发工具并与硬件连接。发工具并与硬件连接。4.2 4.2 汇编语言源程序的汇编汇编语言源程序的汇编汇编语言源程序汇编语言源程序 “翻译翻译”成机器代码(指令代码)的成机器代码(指令代码)的过程称为过程称为“汇编汇编”。汇编可分为。汇编可分为手工汇编手工汇编和和机器汇机器汇编编两类两类: :4.2.1 4.2.1 手工汇编手工汇编人工查表翻译指令人工查表翻译指令。但遇到
20、的相对转移指令的偏移量。但遇到的相对转移指令的偏移量的计算,要根据转移的目标地址计算偏移量,不但的计算,要根据转移的目标地址计算偏移量,不但麻烦,且容易出错。麻烦,且容易出错。4.2.2 4.2.2 机器汇编机器汇编用编辑软件进行源程序的编辑。编辑完成后,生成一用编辑软件进行源程序的编辑。编辑完成后,生成一个个ASCIIASCII码文件,扩展名为码文件,扩展名为“.ASM.ASM”。然后在微计算。然后在微计算机上运行汇编程序,把汇编语言源程序翻译成机器机上运行汇编程序,把汇编语言源程序翻译成机器代码。代码。交叉汇编交叉汇编汇编后的机器代码是在另一台计算机(这汇编后的机器代码是在另一台计算机(这
21、里是单片机)上运行。里是单片机)上运行。 MCS-51MCS-51单片机的应用程序的完成,应经过三个步骤;单片机的应用程序的完成,应经过三个步骤;(1 1)在微计算机上,运行编辑程序进行源程序的输入)在微计算机上,运行编辑程序进行源程序的输入 和编辑;和编辑; (2 2)对源程序进行交叉汇编得到机器代码;)对源程序进行交叉汇编得到机器代码;(3 3)通过微计算机的串行口(或并行口)把机器代码)通过微计算机的串行口(或并行口)把机器代码传送到传送到用户样机(或在线仿真器用户样机(或在线仿真器)进行程序的调试)进行程序的调试和运行。和运行。第(第(1 1)步,只需在微计算机上使用通用的编辑软件)步
22、,只需在微计算机上使用通用的编辑软件即可完成。即可完成。第(第(2 2)步的交叉汇编所用的汇编程序可在购买单片)步的交叉汇编所用的汇编程序可在购买单片机的仿真开发工具时,由厂商提供。机的仿真开发工具时,由厂商提供。第(第(3 3)步骤的实现要借助于单片机仿真开发工具进)步骤的实现要借助于单片机仿真开发工具进行。行。反汇编反汇编分析现成产品的程序,要将二进制的机器分析现成产品的程序,要将二进制的机器代码语言程序翻译成汇编语言源程序。代码语言程序翻译成汇编语言源程序。例例4-24-2 下面是一段源程序的汇编结果,读者可通过查下面是一段源程序的汇编结果,读者可通过查第第3 3章的表章的表3-33-3
23、至表至表3-7 3-7 ,进行手工汇编,来验证下,进行手工汇编,来验证下面的汇编结果是否正确。面的汇编结果是否正确。 见表见表4-14-1(P75P75) 4.3 4.3 汇编语言实用程序设计汇编语言实用程序设计 4.3.1 4.3.1 汇编语言程序的基本结构形式汇编语言程序的基本结构形式常采用以下几种基本结构:常采用以下几种基本结构: 顺序结构、分支结构和循环结构,再加上广泛使用顺序结构、分支结构和循环结构,再加上广泛使用的子程序和中断服务子程序。的子程序和中断服务子程序。 1 1顺序结构顺序结构 2 2分支结构分支结构 程序中含有转移指令,程序中含有转移指令, 无条件分支,有条件分支无条件
24、分支,有条件分支。 有条件分支又分为:有条件分支又分为:单分支单分支结构和结构和多分支多分支结构。结构。 3 3循环结构循环结构 4 4子程序子程序 5 5中断服务子程序中断服务子程序4.3.2 4.3.2 子程序的设计子程序的设计一、子程序设计原则和应注意的问题一、子程序设计原则和应注意的问题 一种能完成某一特定任务的程序段一种能完成某一特定任务的程序段。其资源要为所。其资源要为所有调用程序共享。因此,子程序在结构上应具有独有调用程序共享。因此,子程序在结构上应具有独立性和通用性,立性和通用性,在编写子程序时应注意以下问题:在编写子程序时应注意以下问题: 1 1子程序的第一条指令的地址称为子
25、程序的入口地子程序的第一条指令的地址称为子程序的入口地址。该指令前址。该指令前必须有标号必须有标号。 2 2主程序调用子程序主程序调用子程序 两条子程序调用指令:两条子程序调用指令: (1 1)绝对调用指令:)绝对调用指令:ACALL addr11ACALL addr11 (2 2)长调用指令:)长调用指令:LCALL addr16LCALL addr163 3注意设置堆栈指针和现场保护注意设置堆栈指针和现场保护4 4最后一条指令必须是最后一条指令必须是RETRET指令指令5 5子程序可以嵌套,即子程序可以调用子程序子程序可以嵌套,即子程序可以调用子程序6 6在子程序调用时,还要注意参数传递的
26、问题在子程序调用时,还要注意参数传递的问题 二、二、 子程序的基本结构子程序的基本结构 MAINMAIN: ;MAINMAIN为主程序或调用程序标号为主程序或调用程序标号 LCALL SUB LCALL SUB ;调用子程序;调用子程序SUBSUB SUBSUB:PUSH PSWPUSH PSW ;现场保护;现场保护 PUSH ACCPUSH ACC ; 子程序处理程序段子程序处理程序段POP ACCPOP ACC;现场恢复;现场恢复POP PSWPOP PSW; RETRET;最后一条指令必须为;最后一条指令必须为RETRET例例4-34-3 单字节有符号数的加减法子程序(自己阅读)单字节有
27、符号数的加减法子程序(自己阅读) 本例中参数传递是通过累加器本例中参数传递是通过累加器A A完成的,主程序将完成的,主程序将被转换的数送到被转换的数送到A A中,子程序将中,子程序将A A中的有符号数求补中的有符号数求补后存于后存于A A中,主程序再将结果放回原来的单元。中,主程序再将结果放回原来的单元。 例例4-44-4 4 4位位BCDBCD码的减法程序(自己阅读)码的减法程序(自己阅读) 主程序通过地址寄存器主程序通过地址寄存器R0R0和和R1R1将参加运算的将参加运算的BCDBCD码的地码的地址传递给子程序,子程序则通过累加器将差传递给址传递给子程序,子程序则通过累加器将差传递给主程序
28、。主程序。4.3.3 4.3.3 查表程序设计查表程序设计 数据补偿、修正、计算、转换等各种功能,具有程序数据补偿、修正、计算、转换等各种功能,具有程序简单、执行速度快等优点。简单、执行速度快等优点。查表就是根据自变量查表就是根据自变量x,x,在表格中寻找在表格中寻找y,y,使使y=f(x)y=f(x)。执行查表指令时,发出读程序存储器选通脉冲执行查表指令时,发出读程序存储器选通脉冲/PSEN/PSEN。在在MCS-51MCS-51的指令系统中,给用户提供了的指令系统中,给用户提供了两条极为有两条极为有用的查表指令:用的查表指令: MOVC AMOVC A,A+DPTRA+DPTR MOVC
29、A MOVC A,A+PCA+PC指令指令“MOVC AMOVC A,A+DPTRA+DPTR”完成把完成把A A中的内容作为一个中的内容作为一个无符号数与无符号数与DPTRDPTR中的内容相加,所得结果为某一程中的内容相加,所得结果为某一程序序存储单元的地址,然后把该地址单元中的内容送到累存储单元的地址,然后把该地址单元中的内容送到累加器加器A A中。中。指令指令“MOVC AMOVC A,A+PCA+PC”以以PCPC作为基址寄存器,作为基址寄存器,PCPC的内的内容和容和A A的内容作为无符号数,相加后所得的数作为的内容作为无符号数,相加后所得的数作为某一程序存储器单元的地址,根据地址取
30、出程序存某一程序存储器单元的地址,根据地址取出程序存储器相应单元中的内容送到累加器储器相应单元中的内容送到累加器A A中。中。指令执行完指令执行完,PC,PC的内容不发生变化,仍指向查表指令的内容不发生变化,仍指向查表指令的下一条指令。的下一条指令。优点优点在于预处理较少且不影响其它在于预处理较少且不影响其它特殊功能寄存器的值,所以不必保护其它特殊功能特殊功能寄存器的值,所以不必保护其它特殊功能寄存器的原先值。寄存器的原先值。缺点缺点在于该表格只能存放在这条在于该表格只能存放在这条指令的地址指令的地址X3X2X1X0X3X2X1X0以下的以下的0000FFHFFH之中。表格之中。表格所所在的程
31、序空间受到了限制。在的程序空间受到了限制。例例4-54-5 子程序的功能为:根据累加器子程序的功能为:根据累加器A A中的数中的数x x(0 09 9之间)查之间)查x x的平方表的平方表y y,根据,根据x x的值查出相应的平方的值查出相应的平方y y。x x和和y y均为单字节数。均为单字节数。 地地 址址 子程序子程序Y3Y2Y1Y0 ADD A,#01HY3Y2Y1Y0 ADD A,#01H Y3Y2Y1Y0+2 MOVC A,A+PC Y3Y2Y1Y0+2 MOVC A,A+PCY3Y2Y1Y0+3 RETY3Y2Y1Y0+3 RET Y3Y2Y1Y0+4 DB 00H,01H,04
32、H,09H,10H Y3Y2Y1Y0+4 DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H DB 19H,24H,31H,40H,51H第第1 1条指令条指令 ADD AADD A,#01H #01H 的作用是加上偏移量,可以的作用是加上偏移量,可以根据根据A A的内容查出的内容查出X X对应的平方。对应的平方。 MOVC AMOVC A,+DPTR +DPTR 这条指令的应用范围较为广泛,一般这条指令的应用范围较为广泛,一般情况下,大多使用该指令,使用该指令时不必计算情况下,大多使用该指令,使用该指令时不必计算偏移量,使用该指令的优点是表格可以设在偏
33、移量,使用该指令的优点是表格可以设在64K64K程序程序存储器空间内的任何地方,而不像存储器空间内的任何地方,而不像 MOVC AMOVC A,A+PCA+PC那样只设在那样只设在PCPC下面的下面的256256个单元中,使用较方便。个单元中,使用较方便。 上面的程序可改成如下形式:上面的程序可改成如下形式: PUSH DPH PUSH DPH ;保存;保存DPHDPH PUSH DPL PUSH DPL ;保存;保存DPLDPL MOV DPTR MOV DPTR,#TAB1#TAB1 MOVC A MOVC A,A+DPTRA+DPTR POP DPL POP DPL ;恢复;恢复DPLD
34、PL POP DPH POP DPH ;恢复;恢复DPHDPH RET RETTAB1: DB 00HTAB1: DB 00H,01H01H,04H04H,09H09H,10H 10H DB 19H DB 19H,24H24H,31H31H,40H40H,51H51H例例4-64-6 在一个以在一个以MCS-51MCS-51为核心的温度控制器中,温度为核心的温度控制器中,温度传感器输出的电压与温度为非线性关系,传感器输传感器输出的电压与温度为非线性关系,传感器输出的电压已由出的电压已由A/DA/D转换为转换为1010位二进制数。根据测得的位二进制数。根据测得的不同温度下的电压值数据构成一个表,
35、表中放温度不同温度下的电压值数据构成一个表,表中放温度 值值y y,x x为电压值数据。设测得的电压值为电压值数据。设测得的电压值x x放入放入R2R3R2R3中,中,根据电压值根据电压值x x,查找对应的温度值,查找对应的温度值y y,仍放入,仍放入R2R3R2R3中。中。本例的本例的x x和和y y均为双字节无符号数。程序如下:均为双字节无符号数。程序如下: LTB2LTB2:MOV DPTR,#TAB2MOV DPTR,#TAB2 MOV A,R3 MOV A,R3 CLR C CLR C RLC A RLC A MOV R3,A MOV R3,A XCH A,R2 XCH A,R2 R
36、LC A RLC A XCH R2,A XCH R2,A ADD ADD A,DPL A,DPL ;(;(R2R3R2R3)+ +(DPTRDPTR) (DPTRDPTR) MOV DPL,AMOV DPL,A MOV A,DPH MOV A,DPH ADDC A,R2 ADDC A,R2 MOV DPH,A MOV DPH,A CLR A CLR A MOVC A,A+DPTR MOVC A,A+DPTR ;查第一字节;查第一字节 MOV R2,A MOV R2,A ;第一字节存入;第一字节存入R2R2中中 CLR ACLR A INC DPTR INC DPTR MOVC A,A+DPTR
37、 MOVC A,A+DPTR ;查第二字节;查第二字节 MOV R3,A MOV R3,A ;第二字节存入;第二字节存入R3R3中中 RETRET TAB2:DW TAB2:DW ;温度值表;温度值表例例4-74-7 设有一个巡回检测报警装置,需对设有一个巡回检测报警装置,需对1616路输入进路输入进行检测,每路有一最大允许值,为双字节数。运行行检测,每路有一最大允许值,为双字节数。运行时,需根据测量的路数,找出每路的最大允许值。时,需根据测量的路数,找出每路的最大允许值。看输入值是否大于最大允许值,如大于就报警。根看输入值是否大于最大允许值,如大于就报警。根据上述要求,编一个查表程序。据上述
38、要求,编一个查表程序。 取路数为取路数为x(0 x15),yx(0 x15),y为最大允许值,放在表格中。为最大允许值,放在表格中。设进入查表程序前,路数设进入查表程序前,路数x x已放于已放于R2R2中,查表后最中,查表后最大值大值y y放于放于R3R4R3R4中。本例中的中。本例中的x x为单字节数,为单字节数,y y为双为双字节数。查表程序如下:字节数。查表程序如下:TB3:TB3: MOV A,R2MOV A,R2 ADD A,R2 ADD A,R2 ;(R2)(R2)* *2(A)2(A) MOV R3,A MOV R3,A ;保存指针;保存指针 ADD A,#6 ADD A,#6
39、;加偏移量;加偏移量MOVC A,A+PC MOVC A,A+PC ;查第一字节;查第一字节XCH A,R3XCH A,R3 ADD A,#3ADD A,#3 MOVC A,A+PC MOVC A,A+PC ;查第二字节;查第二字节 MOV R4,AMOV R4,ARETRET TAB3: TAB3: DW 1520DW 1520,37213721,4264542645,7580 7580 ;最大值;最大值 ;表;表 DW 3483DW 3483,3265732657,883883,99439943 DW 10000 DW 10000,4051140511,67586758,89318931
40、DW 4468 DW 4468,58715871,1328413284,2780827808表格长度不能超过表格长度不能超过256256个字节,且表格只能存放于个字节,且表格只能存放于MOVC MOVC A,A+PCA,A+PC指令以下的指令以下的256256个单元中。个单元中。4.3.4 4.3.4 关键字查找程序设计关键字查找程序设计顺序检索和对分检索顺序检索和对分检索一、顺序检索一、顺序检索 从第从第1 1项开始逐项顺序查找,判断所取数据是否与关键项开始逐项顺序查找,判断所取数据是否与关键字相等。字相等。例例4-84-8 从从5050个字节的无序表中查找一个关键字个字节的无序表中查找一个
41、关键字”H H。 ORG 1000HORG 1000HMOV 30HMOV 30H,# #H H;关键字;关键字H H送送30H30H单元单元MOV R1MOV R1,#50#50;查找次数送;查找次数送R1R1MOV AMOV A,#14#14;修正值送;修正值送A A MOV DPTRMOV DPTR,#TAB4 #TAB4 ;表首地址送;表首地址送DPTRDPTRLOOPLOOP:PUSH ACCPUSH ACC MOVC A MOVC A, A+PC A+PC;查表结果送;查表结果送A A CJNE A CJNE A,40H40H,LOOP1LOOP1;(;(40H40H)不等于关键)
42、不等于关键字则转字则转LOOP1LOOP1 MOV R2 MOV R2,DPHDPH ;已查到关键字,把该字;已查到关键字,把该字 ;的地址送;的地址送R2R2,R3R3 MOV R3 MOV R3,DPL DPL ;DONEDONE:RETRETLOOP1LOOP1:POP ACCPOP ACC ;修正值弹出;修正值弹出 INC AINC A ;A+1AA+1A INC DPTR INC DPTR ;修改数据指针;修改数据指针DPTRDPTR DJNZ R1 DJNZ R1,LOOP LOOP ;R10R10,未查完,继续查找,未查完,继续查找 MOV R2MOV R2,#00H#00H ;
43、R1=0R1=0,清,清“0 0” R2 R2 和和R3R3 MOV R3 MOV R3,#00H#00H ;表中;表中5050个数已查完个数已查完 AJMPAJMP DONE DONE;从子程序返回;从子程序返回TAB4TAB4:DB DB , ;5050个无序数据表个无序数据表二、对分检索二、对分检索前提:前提:检索的数据表已经排好序,如何进行数据的排检索的数据表已经排好序,如何进行数据的排序,将在本节稍后介绍。序,将在本节稍后介绍。方法:方法:取数据表中间位置的数与关键字进行比较,如取数据表中间位置的数与关键字进行比较,如相等,则查找到;如果所取的数大于关键字,则下相等,则查找到;如果所
44、取的数大于关键字,则下次对分检索的范围是从数据区起点到本次取数。如次对分检索的范围是从数据区起点到本次取数。如果取数小于关键字,则下次对分检索的范围是从本果取数小于关键字,则下次对分检索的范围是从本次取数数据区起点到数据区终点。依此类推,逐渐次取数数据区起点到数据区终点。依此类推,逐渐缩小检索范围,减少次数,大大提高了查找速度。缩小检索范围,减少次数,大大提高了查找速度。4.3.5 4.3.5 数据极值查找程序设计数据极值查找程序设计在指定的数据区中找出最大值(或最小值)。在指定的数据区中找出最大值(或最小值)。进行数值大小的比较,从这批数据中找出最大值(或进行数值大小的比较,从这批数据中找出
45、最大值(或最小值)并存于某一单元中。最小值)并存于某一单元中。例例4-94-9 片内片内RAMRAM中存放一批数据,查找出最大值并存中存放一批数据,查找出最大值并存放于首地址中。设放于首地址中。设R0R0中存首地址,中存首地址,R2R2中存放字节数,中存放字节数,程序框图如图程序框图如图4-14-1所示。所示。程序如下:程序如下: MOV R2MOV R2,n n;n n为要比较的数据字节数为要比较的数据字节数MOV AMOV A,R0R0;存首地址指针;存首地址指针MOV R1MOV R1,A ADEC R2DEC R2; MOV AMOV A,R1 R1 LOOP:LOOP: MOV R3
46、 MOV R3, A A INC R1 INC R1 CLR C CLR C SUBB A SUBB A,R1R1;两个数比较;两个数比较 JNC LOOP1JNC LOOP1;C=0C=0,A A中的数大,跳中的数大,跳LOOP1LOOP1 MOV A MOV A,R1R1;C=1C=1,则大数送,则大数送A A SJMP LOOP2 SJMP LOOP2LOOP1:MOV ALOOP1:MOV A,R3 R3 LOOP2:DJNZ R2, LOOPLOOP2:DJNZ R2, LOOP;是否比较结束?;是否比较结束? MOV R0MOV R0, A A ;存最大数;存最大数 RET RET
47、 4.3.6 4.3.6 数据排序程序设计数据排序程序设计升序排,降序排升序排,降序排。仅介绍无符号数据升序排。仅介绍无符号数据升序排。冒泡法:冒泡法:相邻数互换的排序方法,类似水中气泡上相邻数互换的排序方法,类似水中气泡上浮浮 。排序时从前向后进行相邻两个数的比较,次。排序时从前向后进行相邻两个数的比较,次序与要求的顺序不符时,就将两个数互换;顺序符序与要求的顺序不符时,就将两个数互换;顺序符合要求不互换。合要求不互换。 假设有假设有7 7个原始数据的排列顺序为:个原始数据的排列顺序为:6 6、4 4、1 1、2 2、5 5、7 7、3 3。第一次冒泡的过程是:。第一次冒泡的过程是:6 6、
48、4 4、1 1、2 2、5 5、7 7、3 3 ;原始数据的排列;原始数据的排列4 4、6 6、1 1、2 2、5 5、7 7、3 3 ;逆序,互换;逆序,互换4 4、1 1、6 6、2 2、5 5、7 7、3 3 ;逆序,互换;逆序,互换 4 4、1 1、2 2、6 6、5 5、7 7、3 3 ;逆序,互换;逆序,互换4 4、1 1、2 2、5 5、6 6、7 7、3 3 ;逆序,互换;逆序,互换4 4、1 1、2 2、5 5、6 6、7 7、3 3 ;正序,不互换;正序,不互换4 4、1 1、2 2、5 5、6 6、3 3、7 7 ;逆序,互换,第一次冒;逆序,互换,第一次冒泡结束泡结束如
49、此进行,各次冒泡的结果如下:如此进行,各次冒泡的结果如下:第第1 1次冒泡结果:次冒泡结果:4 4、1 1、2 2、5 5、6 6、3 3、7 7第第2 2次冒泡结果:次冒泡结果:1 1、2 2、4 4、5 5、3 3、6 6、7 7第第3 3次冒泡结果:次冒泡结果:1 1、2 2、4 4、3 3、5 5、6 6、7 7第第4 4次冒泡结果:次冒泡结果:1 1、2 2、3 3、4 4、5 5、6 6、7 7 ;已完成排序;已完成排序第第5 5次冒泡结果:次冒泡结果:1 1、2 2、3 3、4 4、5 5、6 6、7 7第第6 6次冒泡结果:次冒泡结果:1 1、2 2、3 3、4 4、5 5、6
50、 6、7 7 对于对于n n个数,理论上应进行(个数,理论上应进行(n-1n-1)次冒泡,有时不到)次冒泡,有时不到(n-1n-1)次就已完成排序)次就已完成排序 。如何判定排序是否已完成,看各次冒泡中是否有互换如何判定排序是否已完成,看各次冒泡中是否有互换发生,如果有数据互换,则排序还没完成。发生,如果有数据互换,则排序还没完成。在程序设计中,常使用设置互换标志的方法,该标志在程序设计中,常使用设置互换标志的方法,该标志的状态表示在一次冒泡中是否有互换进行。的状态表示在一次冒泡中是否有互换进行。例例4-10 4-10 一批单字节无符号数,以一批单字节无符号数,以R0R0为首地址指针,为首地址
51、指针,R2R2中为字节数,将这批数进行升序排列。程序框图中为字节数,将这批数进行升序排列。程序框图如图如图4-24-2所示。所示。SORTSORT:MOV AMOV A,R0 R0 ;MOV R1MOV R1,A AMOV AMOV A,R2R2;字节数送入;字节数送入R5R5MOV R5MOV R5,A ACLR F0CLR F0;互换标志位;互换标志位F0F0清零清零DEC R5DEC R5;MOV AMOV A,R1R1; LOOP:LOOP:MOV R3MOV R3,A A;INC R1INC R1;CLR CCLR C;MOV AMOV A,R1R1;比较大小;比较大小SUBB AS
52、UBB A,R3R3;JNC LOOP1JNC LOOP1;SETB F0SETB F0;互换标志位;互换标志位F0F0置置1 1MOV AMOV A,R3R3;XCH AXCH A,R1R1;两个数互换;两个数互换DEC R1DEC R1;XCH AXCH A,R1R1;INC R1 INC R1 LOOP1LOOP1:MOV AMOV A,R1 R1 DJNZ R5DJNZ R5,LOOP LOOP JB F0JB F0,SORT SORT RETRET4.3.7 4.3.7 分支转移程序设计分支转移程序设计特点是程序中含有转移指令,转移指令有分为特点是程序中含有转移指令,转移指令有分为无
53、条件无条件转移转移和和有条件转移有条件转移,因此分支程序也可分为无条件,因此分支程序也可分为无条件分支转移程序和有条件分支转移程序。有条件分支分支转移程序和有条件分支转移程序。有条件分支转移程序按结构类型来分,又分为转移程序按结构类型来分,又分为单分支转移单分支转移结构结构和和多分支转移多分支转移结构结构。一、分支转移结构一、分支转移结构 1 1单分支转移结构单分支转移结构 仅有两个出口,两者选一。仅有两个出口,两者选一。例例4-114-11 求单字节有符号数的二进制补码求单字节有符号数的二进制补码参考程序参考程序:CMPTCMPT:JNB Acc.7,RETURNJNB Acc.7,RETU
54、RN;(;(A A)00,不需转换,不需转换MOV CMOV C,Acc.7Acc.7;符号位保存;符号位保存CPL ACPL A;(;(A A)求反,加)求反,加1 1ADD AADD A,#1#1; MOV Acc.7MOV Acc.7,C C;符号位存;符号位存A A的最高位的最高位RETURNRETURN:RETRET此外,单分支选择结构还有如图此外,单分支选择结构还有如图4-44-4、图、图4-54-5等所示的等所示的几种形式:几种形式: 2多分支转移结构多分支转移结构 程序的判别部分有两个以上的出口流向。程序的判别部分有两个以上的出口流向。常见的两种形式。如图常见的两种形式。如图4
55、-64-6和图和图4-74-7。 指令系统提供了非常有用的两种多分支选择指令指令系统提供了非常有用的两种多分支选择指令: : 间接转移指令间接转移指令: JMP A+DPTR;: JMP A+DPTR;比较转移指令比较转移指令: CJNE A,direct,rel: CJNE A,direct,rel; CJNE A,#data,relCJNE A,#data,rel; CJNE Rn,#data,relCJNE Rn,#data,rel; CJNE Ri,#data,relCJNE Ri,#data,rel;最简单的分支转移程序的设计,一般常采用逐次比较最简单的分支转移程序的设计,一般常采用
56、逐次比较法,就是把所有不同的情况一个一个的进行比较,法,就是把所有不同的情况一个一个的进行比较,发现符合就转向对应的处理程序。这种方法的主要发现符合就转向对应的处理程序。这种方法的主要缺点是程序太长,有缺点是程序太长,有n n种可能的情况,就需有种可能的情况,就需有n n个判个判断和转移。断和转移。 例例4-12 4-12 求符号函数的值。求符号函数的值。 程序框图如图程序框图如图4-64-6所示。所示。 程序程序略。略。 在实际的应用中,经常遇到的图在实际的应用中,经常遇到的图4-74-7结构形式的分支结构形式的分支转移程序的设计转移程序的设计 。需根据某一单元的内容是需根据某一单元的内容是
57、0 0,1 1,n n,来分别转,来分别转向处理程序向处理程序0 0,处理程序,处理程序1 1,处理程序处理程序n n。一个。一个典型的例子就是当单片机系统中的键盘按下时,典型的例子就是当单片机系统中的键盘按下时,就会得到一个键值,根据不同的键值,跳向不同就会得到一个键值,根据不同的键值,跳向不同的键处理程序入口。对于这种情况,可用直接转的键处理程序入口。对于这种情况,可用直接转移指令(移指令(LJMPLJMP或或AJMPAJMP指令)组成一个转移表,然指令)组成一个转移表,然后把该单元的内容读入累加器后把该单元的内容读入累加器A A,转移表首地址放,转移表首地址放入入DPTRDPTR中,再利
58、用间接转移指令实现分支转移。中,再利用间接转移指令实现分支转移。 例例4-124-12 根据寄存器根据寄存器R2R2的内容,转向各个处理程序的内容,转向各个处理程序PRGXPRGX(X=0X=0n n)。)。(R2R2)=0=0,转,转PRG0PRG0(R2R2)=1=1,转,转PRG1PRG1 (R2R2)=n, =n, 转转PRGnPRGn4.3.8 4.3.8 循环程序设计循环程序设计 特点是程序中含有可以反复执行的程序段,该程序段特点是程序中含有可以反复执行的程序段,该程序段通常称为循环体。例如求通常称为循环体。例如求100100个数的累加和,则没个数的累加和,则没有必要连续安排有必要
59、连续安排100100条加法指令,可以只用一条加条加法指令,可以只用一条加法指令并使其循环执行法指令并使其循环执行100100次。次。 (1 1)可大大缩短程序长度()可大大缩短程序长度(2 2)使程序所占的内存单)使程序所占的内存单元数量少(元数量少(3 3)使程序结构紧凑和可读性变好。)使程序结构紧凑和可读性变好。一、循环程序的结构一、循环程序的结构循环结构程序主要由以下四部分组成。循环结构程序主要由以下四部分组成。 1 1循环初始化循环初始化循环初始化程序段用于完成循环前的的准备工作。例循环初始化程序段用于完成循环前的的准备工作。例如,循环控制计数初值的设置、地址指针的起始地如,循环控制计
60、数初值的设置、地址指针的起始地址的设置、为变量预置初值等。址的设置、为变量预置初值等。 2 2循环处理循环处理循环程序结构的核心部分,完成实际的处理工作,是循环程序结构的核心部分,完成实际的处理工作,是需反复循环执行的部分,故又称循环体。这部分程需反复循环执行的部分,故又称循环体。这部分程序的内容,取决于实际处理问题的本身。序的内容,取决于实际处理问题的本身。 3 3循环控制循环控制在重复执行循环体的过程中在重复执行循环体的过程中, ,不断修改循环控制变量,不断修改循环控制变量,直到符合结束条件直到符合结束条件, ,就结束循环程序的执行。循环就结束循环程序的执行。循环结束控制方法分为循环计数控
61、制法和条件控制法结束控制方法分为循环计数控制法和条件控制法 4 4循环结束循环结束这部分是对循环程序执行的结果进行分析、处理和存这部分是对循环程序执行的结果进行分析、处理和存放。放。 二、循环结构的控制二、循环结构的控制 图图4-84-8是计数循环控制结构,图是计数循环控制结构,图4-94-9是条件控制结构。是条件控制结构。 1 1计数循环结构计数循环结构计数循环控制结构是依据计数器的值来决定循环次计数循环控制结构是依据计数器的值来决定循环次数,一般为减数,一般为减“1 1” 计数器,计数器减到计数器,计数器减到“0 0”时,时,结束循环。计数器的初值是在初始化时设定。结束循环。计数器的初值是
62、在初始化时设定。MCS-51MCS-51的指令系统提供了功能极强的循环控制指令:的指令系统提供了功能极强的循环控制指令: DJNZ Rn,relDJNZ Rn,rel;工作寄存器作控制计数器;工作寄存器作控制计数器 DJNZ direct,relDJNZ direct,rel;以直接寻址单元作控制计数;以直接寻址单元作控制计数 器。器。例如,计算例如,计算n n个数据的和。个数据的和。 程序框图见图程序框图见图4-10 4-10 。 计数控制方法只有在循环次数已知的情况下才计数控制方法只有在循环次数已知的情况下才适用。对循环次数未知的问题,不能用循环次数适用。对循环次数未知的问题,不能用循环次
63、数来控制。往往需要根据某种条件来判断是否应该来控制。往往需要根据某种条件来判断是否应该终止循环。终止循环。2 2条件控制结构条件控制结构例例4-154-15 设有一串字符,依次存放在内部设有一串字符,依次存放在内部RAMRAM从从30H30H单单元开始的连续单元中,该字符串以元开始的连续单元中,该字符串以0AH0AH为结束标志,为结束标志,编写测试字符串长度的程序。编写测试字符串长度的程序。本例采用逐个字符依次与本例采用逐个字符依次与“0AH0AH”比较的方法。为此设比较的方法。为此设置一个长度计数器和一个字符串指针。长度计数器置一个长度计数器和一个字符串指针。长度计数器用来累计字符串的长度,
64、字符串指针用于指定字符。用来累计字符串的长度,字符串指针用于指定字符。如果指定字符与如果指定字符与“0AH0AH”不相等,则长度计数器和字不相等,则长度计数器和字符串指针都加符串指针都加1 1,以便继续往下比较;如果比较相,以便继续往下比较;如果比较相等,则表示该字符为等,则表示该字符为“0AH0AH”,字符串结束,长度计,字符串结束,长度计数器的值就是字符串的长度。程序略。数器的值就是字符串的长度。程序略。最常见的多重循环是由最常见的多重循环是由DJNZDJNZ指令构成的软件延时程序,指令构成的软件延时程序,它是常用的程序之一。它是常用的程序之一。 例例4-164-16 50ms 50ms延
65、时程序。延时程序。 延时程序与延时程序与MCS-51MCS-51指令执行时间有很大的关系。指令执行时间有很大的关系。在使用在使用12MHz12MHz晶振时,一个机器周期为晶振时,一个机器周期为1 1s,s,执行一执行一条条DJNZDJNZ指令的时间为指令的时间为2 2s s。这时,可用双重循环方。这时,可用双重循环方法写出下面如下的延时法写出下面如下的延时50ms50ms的程序:的程序:DEL: MOV R7,#200DEL: MOV R7,#200DEL1: MOV R6,#125DEL1: MOV R6,#125DEL2: DJNZ R6,DEL2 DEL2: DJNZ R6,DEL2 ;
66、125125* *2=2502=250s s DJNZ R7,DEL1 DJNZ R7,DEL1 ;0.25ms0.25ms* *200=50ms200=50ms RET RET 以上延时程序不太精确,它没有考虑到除以上延时程序不太精确,它没有考虑到除“DJNZ DJNZ R6,DEL2 R6,DEL2 ”指令外的其它指令的执行时间,如把其指令外的其它指令的执行时间,如把其它指令的执行时间计算在内,它的延时时间为:它指令的执行时间计算在内,它的延时时间为: (250+1+2250+1+2)* *200+1=50.301ms200+1=50.301ms 如果要求比较精确的延时,可按如下修改:如果要求比较精确的延时,可按如下修改:DEL: MOV R7,#200DEL: MOV R7,#200DEL1: MOV R6,#123DEL1: MOV R6,#123 NOP NOPDEL2: DJNZ R6,DEL2 DEL2: DJNZ R6,DEL2 ;2 2* *123+2=248123+2=248s s DJNZ R7,DEL1 DJNZ R7,DEL1 ;(248+2)(248+2)*
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。