《哈工大单片机张毅刚第4章PPT课件》由会员分享,可在线阅读,更多相关《哈工大单片机张毅刚第4章PPT课件(60页珍藏版)》请在金锄头文库上搜索。
1、第第4 4章章 MCS-51 MCS-51汇编语言程序设计汇编语言程序设计 汇编语言是面向机器硬件的语言汇编语言是面向机器硬件的语言,要求程序设计者对,要求程序设计者对MCS-51MCS-51单片机具有很好的单片机具有很好的“软、硬结合软、硬结合”的功底。的功底。 介绍介绍程序设计的基本知识程序设计的基本知识及如何及如何使用汇编语言来进行使用汇编语言来进行基本的程序设计。基本的程序设计。4.1 4.1 汇编语言程序设计概述汇编语言程序设计概述 4.1.1 4.1.1 机器语言、汇编语言和高级语言机器语言、汇编语言和高级语言用于程序设计的用于程序设计的语言基本上分为语言基本上分为3 3种:机器语
2、言、汇编种:机器语言、汇编语言和高级语言语言和高级语言。 1.1.机器语言机器语言 二进制代码表示的指令、数字和符号简称为机器语言二进制代码表示的指令、数字和符号简称为机器语言 不易懂,难记忆,易出错。不易懂,难记忆,易出错。 12汇编语言汇编语言 英文助记符表示的指令称为英文助记符表示的指令称为符号语言符号语言或或汇编语言汇编语言将汇编语言程序转换成为二进制代码表示的机器语言将汇编语言程序转换成为二进制代码表示的机器语言程序称为程序称为汇编程序汇编程序经汇编程序经汇编程序“汇编(翻译)汇编(翻译)”得到的机器语言程序称得到的机器语言程序称为为目标程序目标程序,原来的汇编语言程序称为,原来的汇
3、编语言程序称为源程序源程序。汇编语言特点汇编语言特点:(1)(1)面向机器的语言,程序设计员须对面向机器的语言,程序设计员须对MCS-51MCS-51的硬件的硬件有相当深入的了解。有相当深入的了解。(2)(2)助记符指令和机器指令一一对应,用汇编语言编助记符指令和机器指令一一对应,用汇编语言编写的写的程序效率高程序效率高,占用,占用存储空间小存储空间小,运行,运行速度快速度快,用汇编语言能编写出最优化的程序。用汇编语言能编写出最优化的程序。 2能直接管理和控制硬件设备(功能部件),它能处理能直接管理和控制硬件设备(功能部件),它能处理中断,也能直接访问存储器及中断,也能直接访问存储器及I/OI
4、/O接口电路。接口电路。汇编语言和机器语言都脱离不开具体机器的硬件,均汇编语言和机器语言都脱离不开具体机器的硬件,均是面向是面向“机器机器”的语言,缺乏通用性。的语言,缺乏通用性。3 3高级语言高级语言不受具体机器的限制不受具体机器的限制, ,使用了许多数学公式和数学计算使用了许多数学公式和数学计算上的习惯用语,上的习惯用语,非常擅长于科学计算。非常擅长于科学计算。常用的如常用的如BASICBASIC、FORTRANFORTRAN以及以及C C语言等。语言等。高级语言优点:通用性强,直观、易懂、易学,可读高级语言优点:通用性强,直观、易懂、易学,可读性好。性好。使用使用C C语言(语言(C51
5、C51)、)、PL/MPL/M语言来进行语言来进行MCS-51MCS-51的应用程的应用程序设计。序设计。 对于程序的空间和时间要求很高的场合,汇编语言仍对于程序的空间和时间要求很高的场合,汇编语言仍是必不可缺的。是必不可缺的。 3C C语言和汇编语言混合编程语言和汇编语言混合编程 在很多需要直接控制硬件的应用场合,则更是非用汇在很多需要直接控制硬件的应用场合,则更是非用汇编语言不可编语言不可 使用汇编语言编程,是单片机程序设计的使用汇编语言编程,是单片机程序设计的基本功之一基本功之一4.1.2 4.1.2 汇编语言语句的种类和格式汇编语言语句的种类和格式两种基本类型:指令语句和伪指令语句两种
6、基本类型:指令语句和伪指令语句(1 1)指令语句)指令语句已在第已在第3 3章介绍章介绍每一条指令语句在汇编时都产生一个指令代码每一条指令语句在汇编时都产生一个指令代码机机器代码器代码(2 2)伪指令语句)伪指令语句 是为汇编服务的。在汇编时是为汇编服务的。在汇编时没有机器代码与之对应。没有机器代码与之对应。 4MCS-51MCS-51的汇编语言的的汇编语言的四分段格式四分段格式如下:如下: 标号字段标号字段 操作码字段操作码字段 操作数字段操作数字段 注释字段注释字段规则:规则:(1 1)标号字段和操作字码段之间要有冒号)标号字段和操作字码段之间要有冒号“:”相隔;相隔;(2 2)操作码字段
7、和操作数字段间的分界符是空格;)操作码字段和操作数字段间的分界符是空格;(3 3)双操作数之间用逗号相隔;)双操作数之间用逗号相隔; (4 4)操操作作数数字字段段和和注注释释字字段段之之间间的的分分界界符符用用分分号号“;”相隔。相隔。操作码字段为必选项,其余各段为任选项。操作码字段为必选项,其余各段为任选项。例例4-14-1 下面是一段汇编语言程序的四分段书写格式下面是一段汇编语言程序的四分段书写格式 5 标号字段标号字段 操作码字段操作码字段 操作数字段操作数字段 注释字段注释字段 START: MOV A,#00H ;0A MOV R1,#10 ;10R1 MOV R2,#000000
8、11B ;3R2 LOOP:ADD A,R2 ;(;(A)+(R2)A DJNZ R1,LOOP;R1内容减内容减1不不 为零,则循环为零,则循环 NOP HERE: SJMP HERE基本语法规则:基本语法规则:1 1标号字段标号字段是语句所在地址的标志符号是语句所在地址的标志符号 6(1 1)标号后边必须跟以冒号)标号后边必须跟以冒号“:” ” (2 2)由)由1 18 8个个ASCIIASCII字符组成字符组成(3 3)同一标号在一个程序中只能定义一次)同一标号在一个程序中只能定义一次 (4 4)不能使用汇编语言已经定义的符号作为标号)不能使用汇编语言已经定义的符号作为标号 2 2操作码
9、字段操作码字段 是汇编语言指令中唯一不能空缺的部分。汇编程序就是汇编语言指令中唯一不能空缺的部分。汇编程序就是根据这一字段来生成机器代码的。是根据这一字段来生成机器代码的。3 3操作数字段操作数字段 通常有单操作数、双操作数和无操作数三种情况。如通常有单操作数、双操作数和无操作数三种情况。如果是双操作数,则操作数之间,要以逗号隔开。果是双操作数,则操作数之间,要以逗号隔开。(1 1)十六进制、二进制和十进制形式的操作数表示)十六进制、二进制和十进制形式的操作数表示 7采用十六进制形式来表示采用十六进制形式来表示 ,某些特殊场合才采用二,某些特殊场合才采用二进制或十进制的表示形式进制或十进制的表
10、示形式 。十六进制,后缀十六进制,后缀“H”“H” 。二进制,后缀二进制,后缀“B”“B” 。十进制,后缀十进制,后缀“D”“D”,也可省略也可省略。若十六进制的若十六进制的操作数以字符操作数以字符A A F F中的某个开头时,则中的某个开头时,则需在它需在它前面加一个前面加一个 “0” “0”,以便在汇编时把它和字,以便在汇编时把它和字符符A AF F区别开来。区别开来。(2 2)工作寄存器和特殊功能寄存器的表示)工作寄存器和特殊功能寄存器的表示采用工作寄存器和特殊功能寄存器的代号来表示,也采用工作寄存器和特殊功能寄存器的代号来表示,也可用其地址来表示。可用其地址来表示。 例如,累加器可用例
11、如,累加器可用A A(或(或AccAcc)表示。也可用)表示。也可用0E0H0E0H来表来表示,示,0E0H0E0H为累加器为累加器A A的地址。的地址。8(3 3)美元符号)美元符号$ $的使用的使用用用于于表表示示该该转转移移指指令令操操作作码码所所在在的的地地址址。例例如如,如如下下指令:指令: JNB F0JNB F0, $ $与如下指令是等价的:与如下指令是等价的:HEREHERE:JNB F0JNB F0,HEREHERE 再如:再如:HEREHERE:SJMP HERESJMP HERE可写为:可写为: SJMP $ SJMP $4 4注释字段注释字段 9必须以分号必须以分号“;
12、”开头,换行书写,但必须注意也要开头,换行书写,但必须注意也要以分号以分号“;”开头。开头。 汇编时,注释字段不会产生机器代码。汇编时,注释字段不会产生机器代码。4.1.3 4.1.3 伪指令伪指令在在MCS-51 MCS-51 汇编语言源程序中应有向汇编程序发出的指汇编语言源程序中应有向汇编程序发出的指示信息,告诉它如何完成汇编工作,这是通过使用示信息,告诉它如何完成汇编工作,这是通过使用伪指令来实现的。伪指令来实现的。也称为汇编程序控制命令。只有在汇编前的源程序中也称为汇编程序控制命令。只有在汇编前的源程序中才有伪指令。经过汇编得到目标程序(机器代码)才有伪指令。经过汇编得到目标程序(机器
13、代码)后,伪指令已无存在的必要,所以后,伪指令已无存在的必要,所以“伪伪”体现在汇体现在汇编时,编时,伪指令没有相应的机器代码产生伪指令没有相应的机器代码产生。常用的伪指令常用的伪指令: 1.ORG1.ORG(ORiGinORiGin)汇编起始地址命令)汇编起始地址命令 10在汇编语言源程序的开始,通常都用一条在汇编语言源程序的开始,通常都用一条ORGORG伪指令伪指令来实现规定程序的起始地址。如不用来实现规定程序的起始地址。如不用ORGORG规定,则汇规定,则汇编得到的目标程序将从编得到的目标程序将从0000H0000H开始。开始。例如:例如: ORG 2000HORG 2000HSTART
14、START:MOV A,#00HMOV A,#00H规定标号规定标号STARTSTART代表地址为代表地址为2000H2000H开始。开始。在在一一个个源源程程序序中中,可可多多次次使使用用ORGORG指指令令,来来规规定定不不同同的的程程序序段段的的起起始始地地址址。但但是是,地地址址必必须须由由小小到到大大排排列,地址不能交叉、重叠列,地址不能交叉、重叠。例如:。例如:ORG 2000HORG 2000H 11ORG 2500HORG 2500H ORG 3000HORG 3000H2. END(END of assembly)2. END(END of assembly)汇编终止命令汇编
15、终止命令汇编语言源程序的结束标志,用于终止源程序的汇编汇编语言源程序的结束标志,用于终止源程序的汇编工作。在整个源程序中只能有一条工作。在整个源程序中只能有一条ENDEND命令,且位命令,且位于程序的最后。于程序的最后。3 3DBDB(Define ByteDefine Byte)定义字节命令)定义字节命令在程序存储器的连续单元中定义字节数据。在程序存储器的连续单元中定义字节数据。 12 ORG 2000HORG 2000HDB 30HDB 30H,40H40H,2424,“C”“C”,“B”“B”汇编后:汇编后:(2000H2000H)=30H=30H(2001H2001H)=40H=40H
16、(2002H2002H)=18H=18H(1010进制数进制数2424)(2003H2003H)=43H=43H(字符(字符“C”“C”的的ASCIIASCII码)码)(2004H2004H)=42H=42H(字符(字符“B”“B”的的ASCIIASCII码)码)DBDB功功能能是是从从指指定定单单元元开开始始定定义义(存存储储)若若干干个个字字节节,1010进制数自然转换成进制数自然转换成1616进制数,字母按进制数,字母按ASCIIASCII码存储。码存储。134 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 145 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、序的适当位置上加上注释的好习惯。养成在程序的适当位置上加上注释的好习惯。15(5 5)上机调试)上机调试编写完毕的程序,必须编写完毕的程序,必须“汇编汇编”成机器代码,才能调成机器代码,才能调试和运行,调试与硬件有关程序还要借助于仿真开试和运行,调试与硬件有关程序还要借助于仿真开发工具并与硬件连接。发工具并与硬件连接。4.2 4.2 汇编语言源程序的汇编汇编语言源程序的汇编汇编语言源程序汇编语言源程序 “ “翻译翻译”成机器代码(指令代码)的成机器代码(指令代码)的过程称为过程称为“汇编汇编”。汇编可分为。汇编可分为手工汇编手工汇编和和机器汇机器汇编编两类两类: :4.2.1 4.2.1 手工
20、汇编手工汇编人工查表翻译指令人工查表翻译指令。但遇到的相对转移指令的偏移量。但遇到的相对转移指令的偏移量的计算,要根据转移的目标地址计算偏移量,不但的计算,要根据转移的目标地址计算偏移量,不但麻烦,且容易出错。麻烦,且容易出错。164.2.2 4.2.2 机器汇编机器汇编用编辑软件进行源程序的编辑。编辑完成后,生成一用编辑软件进行源程序的编辑。编辑完成后,生成一个个ASCIIASCII码文件,扩展名为码文件,扩展名为“.ASM”“.ASM”。然后在微计算。然后在微计算机上运行汇编程序,把汇编语言源程序翻译成机器机上运行汇编程序,把汇编语言源程序翻译成机器代码。代码。交叉汇编交叉汇编汇编后的机器
21、代码是在另一台计算机(这汇编后的机器代码是在另一台计算机(这里是单片机)上运行。里是单片机)上运行。 MCS-51MCS-51单片机的应用程序的完成,应经过三个步骤;单片机的应用程序的完成,应经过三个步骤;(1 1)在在微微计计算算机机上上,运运行行编编辑辑程程序序进进行行源源程程序序的的输输入入 和编辑;和编辑; (2 2)对源程序进行交叉汇编得到机器代码;)对源程序进行交叉汇编得到机器代码;(3 3)通通过过微微计计算算机机的的串串行行口口(或或并并行行口口)把把机机器器代代码码传传送送到到用用户户样样机机(或或在在线线仿仿真真器器)进进行行程程序序的的调调试试和运行。和运行。17第第(1
22、 1)步步,只只需需在在微微计计算算机机上上使使用用通通用用的的编编辑辑软软件件即可完成。即可完成。第第(2 2)步步的的交交叉叉汇汇编编所所用用的的汇汇编编程程序序可可在在购购买买单单片片机的仿真开发工具时,由厂商提供。机的仿真开发工具时,由厂商提供。第(第(3 3)步骤的实现要借助于单片机仿真开发工具进)步骤的实现要借助于单片机仿真开发工具进行。行。反汇编反汇编分析现成产品的程序,要将二进制的机器分析现成产品的程序,要将二进制的机器代码语言程序翻译成汇编语言源程序。代码语言程序翻译成汇编语言源程序。例例4-24-2 下面是一段源程序的汇编结果,读者可通过查下面是一段源程序的汇编结果,读者可
23、通过查第第3 3章的表章的表3-33-3至表至表3-7 3-7 ,进行手工汇编,来验证下,进行手工汇编,来验证下面的汇编结果是否正确。面的汇编结果是否正确。 见表见表4-14-1(P75P75) 184.3 4.3 汇编语言实用程序设计汇编语言实用程序设计 4.3.1 4.3.1 汇编语言程序的基本结构形式汇编语言程序的基本结构形式常采用以下几种基本结构:常采用以下几种基本结构: 顺序结构、分支结构和循环结构,再加上广泛使用顺序结构、分支结构和循环结构,再加上广泛使用的子程序和中断服务子程序。的子程序和中断服务子程序。 1 1顺序结构顺序结构 2 2分支结构分支结构 程序中含有转移指令,程序中
24、含有转移指令, 无条件分支,有条件分支无条件分支,有条件分支。 有条件分支又分为:有条件分支又分为:单分支单分支结构和结构和多分支多分支结构。结构。 3 3循环结构循环结构 4 4子程序子程序 195 5中断服务子程序中断服务子程序4.3.2 4.3.2 子程序的设计子程序的设计一、子程序设计原则和应注意的问题一、子程序设计原则和应注意的问题 一种能完成某一特定任务的程序段一种能完成某一特定任务的程序段。其资源要为所。其资源要为所有调用程序共享。因此,子程序在结构上应具有独有调用程序共享。因此,子程序在结构上应具有独立性和通用性,立性和通用性,在编写子程序时应注意以下问题:在编写子程序时应注意
25、以下问题: 1 1子程序的第一条指令的地址称为子程序的入口地子程序的第一条指令的地址称为子程序的入口地址。该指令前址。该指令前必须有标号必须有标号。 2 2主程序调用子程序主程序调用子程序 两条子程序调用指令:两条子程序调用指令: (1 1)绝对调用指令:)绝对调用指令:ACALL addr11ACALL addr11 20(2 2)长调用指令:)长调用指令:LCALL addr16LCALL addr163 3注意设置堆栈指针和现场保护注意设置堆栈指针和现场保护4 4最后一条指令必须是最后一条指令必须是RETRET指令指令5 5子程序可以嵌套,即子程序可以调用子程序子程序可以嵌套,即子程序可
26、以调用子程序6 6在子程序调用时,还要注意参数传递的问题在子程序调用时,还要注意参数传递的问题 二、二、 子程序的基本结构子程序的基本结构 MAINMAIN: ;MAINMAIN为主程序或调用程序标号为主程序或调用程序标号 LCALL SUB LCALL SUB ;调用子程序;调用子程序SUBSUB 21 SUBSUB:PUSH PSWPUSH PSW ;现场保护;现场保护 PUSH ACC PUSH ACC ; 子程序处理程序段子程序处理程序段POP ACCPOP ACC;现场恢复;现场恢复POP PSWPOP PSW; RETRET;最后一条指令必须为;最后一条指令必须为RETRET例例4
27、-34-3 单字节有符号数的加减法子程序(自己阅读)单字节有符号数的加减法子程序(自己阅读) 本例中参数传递是通过累加器本例中参数传递是通过累加器A A完成的,主程序将完成的,主程序将被转换的数送到被转换的数送到A A中,子程序将中,子程序将A A中的有符号数求补中的有符号数求补后存于后存于A A中,主程序再将结果放回原来的单元。中,主程序再将结果放回原来的单元。 例例4-44-4 4 4位位BCDBCD码的减法程序(自己阅读)码的减法程序(自己阅读) 22主程序通过地址寄存器主程序通过地址寄存器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的的指指令令系系统统中中,给给用用户户提提供供了了两两条条极极为为有有用的查表指令:用的查表指令: M
29、OVC A MOVC A,A+DPTRA+DPTR MOVC A MOVC A,A+PCA+PC指令指令“MOVC A“MOVC A,A+DPTR”A+DPTR”完成把完成把A A中的内容作为一个中的内容作为一个无符号数与无符号数与DPTRDPTR中的内容相加,所得结果为某一程中的内容相加,所得结果为某一程序序23存储单元的地址,然后把该地址单元中的内容送到累存储单元的地址,然后把该地址单元中的内容送到累加器加器A A中。中。指令指令“MOVC A“MOVC A,A+PC”A+PC”以以PCPC作为基址寄存器,作为基址寄存器,PCPC的的内容和内容和A A的内容作为无符号数,相加后所得的数作的
30、内容作为无符号数,相加后所得的数作为某一程序存储器单元的地址,根据地址取出程序为某一程序存储器单元的地址,根据地址取出程序存储器相应单元中的内容送到累加器存储器相应单元中的内容送到累加器A A中。中。指令执行完指令执行完,PC,PC的内容不发生变化,仍指向查表指令的内容不发生变化,仍指向查表指令的下一条指令。的下一条指令。优点优点在于预处理较少且不影响其它在于预处理较少且不影响其它特殊功能寄存器的值,所以不必保护其它特殊功能特殊功能寄存器的值,所以不必保护其它特殊功能寄存器的原先值。寄存器的原先值。缺点缺点在于该表格只能存放在这条在于该表格只能存放在这条指令的地址指令的地址X3X2X1X0X3
31、X2X1X0以下的以下的0000FFHFFH之中。表格之中。表格所所在的程序空间受到了限制。在的程序空间受到了限制。例例4-54-5 子程序的功能为:根据累加器子程序的功能为:根据累加器A A中的数中的数x x(0 09 9之间)查之间)查x x的平方表的平方表y y,根据,根据x x的值查出相应的平方的值查出相应的平方y y。x x和和y y均为单字节数。均为单字节数。 24 地地 址址 子程序子程序Y3Y2Y1Y0 ADD A,#01HY3Y2Y1Y0 ADD A,#01H Y3Y2Y1Y0+2 MOVC A,A+PC Y3Y2Y1Y0+2 MOVC A,A+PCY3Y2Y1Y0+3 RE
32、TY3Y2Y1Y0+3 RET Y3Y2Y1Y0+4 DB 00H,01H,04H,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 ADD A A,#01H #01H 的的作作用用是是加加上上偏偏移移量量,可可以以根据根据A A的内容查出的内容查出X X对应的平方。对应的平方。 MOVC AMOVC A,+DPTR +DPTR 这条指令的应用范围较为广泛,一般这条指令的应用范围较为广泛,一般情况下,大多使用该指令,使用该指令时不必计算情况
33、下,大多使用该指令,使用该指令时不必计算偏移量,使用该指令的优点是表格可以设在偏移量,使用该指令的优点是表格可以设在64K64K程序程序存储器空间内的任何地方,而不像存储器空间内的任何地方,而不像 MOVC A MOVC A,A+PCA+PC那样只设在那样只设在PCPC下面的下面的256256个单元中,使用较方便。个单元中,使用较方便。 25上面的程序可改成如下形式:上面的程序可改成如下形式: PUSH DPH PUSH DPH ;保存;保存DPHDPH PUSH DPL PUSH DPL ;保存;保存DPLDPL MOV DPTR MOV DPTR,#TAB1#TAB1 MOVC A MOV
34、C A,A+DPTRA+DPTR POP DPL POP DPL ;恢复;恢复DPLDPL 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转转换换为为10
35、10位位二二进进制制数数。根根据据测测得得的的不同温度下的电压值数据构成一个表,表中放温度不同温度下的电压值数据构成一个表,表中放温度 26值值y y,x x为为电电压压值值数数据据。设设测测得得的的电电压压值值x x放放入入R2R3R2R3中中,根根据据电电压压值值x x,查查找找对对应应的的温温度度值值y y,仍仍放放入入R2R3R2R3中中。本例的本例的x x和和y y均为双字节无符号数。程序如下:均为双字节无符号数。程序如下: LTB2 LTB2:MOV DPTR,#TAB2MOV DPTR,#TAB2 MOV A,R3 MOV A,R3 CLR C CLR C RLC A RLC A
36、 MOV R3,A MOV R3,A XCH A,R2 XCH A,R2 RLC A RLC A XCH R2,A XCH R2,A ADD ADD A,DPL A,DPL ;(;(R2R3R2R3)+ +(DPTRDPTR) (DPTRDPTR)27 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中中 CL
37、R A CLR A INC DPTR INC DPTR MOVC A,A+DPTR MOVC A,A+DPTR ;查第二字节;查第二字节 MOV R3,A MOV R3,A ;第二字节存入;第二字节存入R3R3中中 RET RET TAB2:DW TAB2:DW ;温度值表;温度值表28例例4-74-7 设设有有一一个个巡巡回回检检测测报报警警装装置置,需需对对1616路路输输入入进进行行检检测测,每每路路有有一一最最大大允允许许值值,为为双双字字节节数数。运运行行时时,需需根根据据测测量量的的路路数数,找找出出每每路路的的最最大大允允许许值值。看看输输入入值值是是否否大大于于最最大大允允许许
38、值值,如如大大于于就就报报警警。根根据上述要求,编一个查表程序。据上述要求,编一个查表程序。 取取路路数数为为x(0x15),yx(0x15),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)*2(A)(R2)*2(A) MOV R3,A MOV R3,A ;保存
39、指针;保存指针 ADD A,#6 ADD A,#6 ;加偏移量;加偏移量29MOVC 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 DW 15201520,37213721,4264542645,7580 7580 ;最最大大值值 ;表;表 DW 3483DW 3483,3265732657,883883,99439943 DW 10000 DW 10000,40
40、51140511,67586758,89318931 DW 4468 DW 4468,58715871,1328413284,278082780830表格长度不能超过表格长度不能超过256256个字节,且表格只能存放于个字节,且表格只能存放于MOVC MOVC A,A+PCA,A+PC指令以下的指令以下的256256个单元中。个单元中。4.3.4 4.3.4 关键字查找程序设计关键字查找程序设计顺序检索和对分检索顺序检索和对分检索一、顺序检索一、顺序检索 从第从第1 1项开始逐项顺序查找,判断所取数据是否与关键项开始逐项顺序查找,判断所取数据是否与关键字相等。字相等。例例4-84-8 从从50
41、50个字节的无序表中查找一个关键字个字节的无序表中查找一个关键字”H”H。 ORG 1000H ORG 1000HMOV 30HMOV 30H,#H#H;关键字;关键字HH送送30H30H单元单元MOV R1MOV R1,#50#50;查找次数送;查找次数送R1R1MOV AMOV A,#14#14;修正值送;修正值送A A 31 MOV DPTRMOV DPTR,#TAB4 #TAB4 ;表首地址送;表首地址送DPTRDPTRLOOPLOOP:PUSH ACCPUSH ACC MOVC A MOVC A, A+PC A+PC;查表结果送;查表结果送A A CJNE A CJNE A,40H4
42、0H,LOOP1LOOP1;(;(40H40H)不等于关键)不等于关键字则转字则转LOOP1LOOP1 MOV R2 MOV R2,DPHDPH ;已查到关键字,把该字;已查到关键字,把该字 ;的地址送;的地址送R2R2,R3R3 MOV R3 MOV R3,DPL DPL ;DONEDONE:RETRETLOOP1LOOP1:POP ACCPOP ACC ;修正值弹出;修正值弹出 INC A INC A ;A+1AA+1A INC DPTR INC DPTR ;修改数据指针;修改数据指针DPTRDPTR DJNZ R1 DJNZ R1,LOOP LOOP ;R10R10,未查完,继续查找,未
43、查完,继续查找 32 MOV R2MOV R2,#00H#00H ;R1=0R1=0,清,清“0” R2 “0” R2 和和R3R3 MOV R3 MOV R3,#00H#00H ;表中;表中5050个数已查完个数已查完 AJMP AJMPDONEDONE;从子程序返回;从子程序返回TAB4TAB4:DB DB , ;5050个无序数据表个无序数据表二、对分检索二、对分检索前提:前提:检索的数据表已经排好序,如何进行数据的排检索的数据表已经排好序,如何进行数据的排序,将在本节稍后介绍。序,将在本节稍后介绍。方法:方法:取数据表中间位置的数与关键字进行比较,如取数据表中间位置的数与关键字进行比较
44、,如相等,则查找到;如果所取的数大于关键字,则下相等,则查找到;如果所取的数大于关键字,则下次对分检索的范围是从数据区起点到本次取数。如次对分检索的范围是从数据区起点到本次取数。如果取数小于关键字,则下次对分检索的范围是从本果取数小于关键字,则下次对分检索的范围是从本次取数数据区起点到数据区终点。依此类推,逐渐次取数数据区起点到数据区终点。依此类推,逐渐缩小检索范围,减少次数,大大提高了查找速度。缩小检索范围,减少次数,大大提高了查找速度。334.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 R
46、2; MOV AMOV A,R1 R1 3435LOOP:LOOP: MOV R3 MOV R3, A A DEC R1 DEC R1 CLR C CLR C SUBB A SUBB A,R1R1;两个数比较;两个数比较 JNC LOOP1 JNC 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 ;是否比较结束?;是
47、否比较结束? MOV R0 MOV R0, A A ;存最大数;存最大数 RET RET 364.3.6 4.3.6 数据排序程序设计数据排序程序设计升序排,降序排升序排,降序排。仅介绍无符号数据升序排。仅介绍无符号数据升序排。冒泡法:冒泡法:相邻数互换的排序方法,类似水中气泡上浮相邻数互换的排序方法,类似水中气泡上浮 。排序时从前向后进行相邻两个数的比较,次序与。排序时从前向后进行相邻两个数的比较,次序与要求的顺序不符时,就将两个数互换;顺序符合要要求的顺序不符时,就将两个数互换;顺序符合要求不互换。求不互换。 假设有假设有7 7个原始数据的排列顺序为:个原始数据的排列顺序为:6 6、4 4
48、、1 1、2 2、5 5、7 7、3 3。第一次冒泡的过程是:。第一次冒泡的过程是:6 6、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 ;逆序,互换;逆序,互换374 4、1 1、2 2、5 5、6 6、7 7、3 3 ;正序,不互换;正序,不互换4 4、1 1、2
49、 2、5 5、6 6、3 3、7 7 ;逆序,互换,第一次冒;逆序,互换,第一次冒泡结束泡结束如此进行,各次冒泡的结果如下:如此进行,各次冒泡的结果如下:第第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
50、 5、6 6、7 7第第6 6次冒泡结果:次冒泡结果:1 1、2 2、3 3、4 4、5 5、6 6、7 7 对于对于n n个数,理论上应进行(个数,理论上应进行(n-1n-1)次冒泡,有时不到)次冒泡,有时不到(n-1n-1)次就已完成排序)次就已完成排序 。38如何判定排序是否已完成,看各次冒泡中是否有互换如何判定排序是否已完成,看各次冒泡中是否有互换发生,如果有数据互换,则排序还没完成。发生,如果有数据互换,则排序还没完成。在程序设计中,常使用设置互换标志的方法,该标志在程序设计中,常使用设置互换标志的方法,该标志的状态表示在一次冒泡中是否有互换进行。的状态表示在一次冒泡中是否有互换进行
51、。例例4-10 4-10 一批单字节无符号数,以一批单字节无符号数,以R0R0为首地址指针,为首地址指针,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; 3940LOOP:LOOP:MOV R3MOV R3,A A;IN
52、C R1INC R1;CLR CCLR C;MOV AMOV A,R1R1;比较大小;比较大小SUBB ASUBB 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 41LOOP1LOOP1:MOV AMOV A,R1 R1 DJNZ R5DJNZ R5,LOOP LOOP JB F0JB F0,SORT SORT RETRET4.3.7 4.3.7 分
53、支转移程序设计分支转移程序设计特点是程序中含有转移指令,转移指令有分为特点是程序中含有转移指令,转移指令有分为无条件无条件转移转移和和有条件转移有条件转移,因此分支程序也可分为无条件,因此分支程序也可分为无条件分支转移程序和有条件分支转移程序。有条件分支分支转移程序和有条件分支转移程序。有条件分支转移程序按结构类型来分,又分为转移程序按结构类型来分,又分为单分支转移单分支转移结构结构和和多分支转移多分支转移结构。结构。一、分支转移结构一、分支转移结构 1 1单分支转移结构单分支转移结构 42仅有两个出口,两者选一。仅有两个出口,两者选一。例例4-114-11 求单字节有符号数的二进制补码求单字
54、节有符号数的二进制补码参考程序参考程序:CMPTCMPT:JNB Acc.7,RETURNJNB Acc.7,RETURN;(;(A A)00,不需转换,不需转换MOV CMOV C,Acc.7Acc.7;符号位保存;符号位保存CPL ACPL A;(;(A A)求反,加)求反,加1 1ADD AADD A,#1#1; 43MOV Acc.7MOV Acc.7,C C;符符号号位位存存A A的的最最高高位位RETURNRETURN:RETRET此此外外,单单分分支支选选择择结结构构还还有有如如图图4-44-4、图图4-54-5等等所所示示的的几种形式:几种形式: 44452多分支转移结构多分支
55、转移结构 程序的判别部分有两个以上的出口流向。程序的判别部分有两个以上的出口流向。常见的两种形式。如图常见的两种形式。如图4-64-6和图和图4-74-7。 46指令系统提供了非常有用的两种多分支选择指令指令系统提供了非常有用的两种多分支选择指令: : 间接转移指令间接转移指令: JMP A+DPTR;: JMP A+DPTR;比较转移指令比较转移指令: CJNE A,direct,rel: CJNE A,direct,rel; CJNE A,#data,rel CJNE A,#data,rel; CJNE Rn,#data,rel CJNE Rn,#data,rel; CJNE Ri,#da
56、ta,rel CJNE Ri,#data,rel;最简单的分支转移程序的设计,一般常采用逐次比较最简单的分支转移程序的设计,一般常采用逐次比较法,就是把所有不同的情况一个一个的进行比较,法,就是把所有不同的情况一个一个的进行比较,发现符合就转向对应的处理程序。这种方法的主要发现符合就转向对应的处理程序。这种方法的主要缺点是程序太长,有缺点是程序太长,有n n种可能的情况,就需有种可能的情况,就需有n n个判个判断和转移。断和转移。 例例4-12 4-12 求符号函数的值。求符号函数的值。 47程序框图如图程序框图如图4-64-6所示。所示。 程序略。程序略。48在实际的应用中,经常遇到的图在实
57、际的应用中,经常遇到的图4-74-7结构形式的分支结构形式的分支转移程序的设计转移程序的设计 。49需根据某一单元的内容是需根据某一单元的内容是0 0,1 1,n n,来分别转,来分别转向处理程序向处理程序0 0,处理程序,处理程序1 1,处理程序处理程序n n。一个。一个典型的例子就是当单片机系统中的键盘按下时,典型的例子就是当单片机系统中的键盘按下时,就会得到一个键值,根据不同的键值,跳向不同就会得到一个键值,根据不同的键值,跳向不同的键处理程序入口。对于这种情况,可用直接转的键处理程序入口。对于这种情况,可用直接转移指令(移指令(LJMPLJMP或或AJMPAJMP指令)组成一个转移表,
58、然指令)组成一个转移表,然后把该单元的内容读入累加器后把该单元的内容读入累加器A A,转移表首地址放,转移表首地址放入入DPTRDPTR中,再利用间接转移指令实现分支转移。中,再利用间接转移指令实现分支转移。 例例4-124-12 根根据据寄寄存存器器R2R2的的内内容容,转转向向各各个个处处理理程程序序PRGXPRGX(X=0X=0n n)。)。(R2R2)=0=0,转,转PRG0PRG0(R2R2)=1=1,转,转PRG1PRG1 (R2R2)=n, =n, 转转PRGnPRGn504.3.8 4.3.8 循环程序设计循环程序设计 特点是程序中含有可以反复执行的程序段,该程序段特点是程序中
59、含有可以反复执行的程序段,该程序段通常称为循环体。例如求通常称为循环体。例如求100100个数的累加和,则没个数的累加和,则没有必要连续安排有必要连续安排100100条加法指令,可以只用一条加条加法指令,可以只用一条加法指令并使其循环执行法指令并使其循环执行100100次。次。 (1 1)可大大缩短程序长度()可大大缩短程序长度(2 2)使程序所占的内存单)使程序所占的内存单元数量少(元数量少(3 3)使程序结构紧凑和可读性变好。)使程序结构紧凑和可读性变好。一、循环程序的结构一、循环程序的结构循环结构程序主要由以下四部分组成。循环结构程序主要由以下四部分组成。 1 1循环初始化循环初始化循环
60、初始化程序段用于完成循环前的的准备工作。例循环初始化程序段用于完成循环前的的准备工作。例如,循环控制计数初值的设置、地址指针的起始地如,循环控制计数初值的设置、地址指针的起始地址的设置、为变量预置初值等。址的设置、为变量预置初值等。 51 2 2循环处理循环处理循循环环程程序序结结构构的的核核心心部部分分,完完成成实实际际的的处处理理工工作作,是是需需反反复复循循环环执执行行的的部部分分,故故又又称称循循环环体体。这这部部分分程程序的内容,取决于实际处理问题的本身。序的内容,取决于实际处理问题的本身。 3 3循环控制循环控制在在重重复复执执行行循循环环体体的的过过程程中中, ,不不断断修修改改
61、循循环环控控制制变变量量,直直到到符符合合结结束束条条件件, ,就就结结束束循循环环程程序序的的执执行行。循循环环结结束控制方法分为循环计数控制法和条件控制法束控制方法分为循环计数控制法和条件控制法 4 4循环结束循环结束这部分是对循环程序执行的结果进行分析、处理和存这部分是对循环程序执行的结果进行分析、处理和存放。放。 二、循环结构的控制二、循环结构的控制 52图图4-84-8是计数循环控制结构,图是计数循环控制结构,图4-94-9是条件控制结构。是条件控制结构。 531 1计数循环结构计数循环结构计数循环控制结构是依据计数器的值来决定循环次计数循环控制结构是依据计数器的值来决定循环次数,一
62、般为减数,一般为减“1” “1” 计数器,计数器减到计数器,计数器减到“0”“0”时,时,结束循环。计数器的初值是在初始化时设定。结束循环。计数器的初值是在初始化时设定。MCS-51MCS-51的指令系统提供了功能极强的循环控制指令:的指令系统提供了功能极强的循环控制指令: DJNZ Rn,relDJNZ Rn,rel;工作寄存器作控制计数器;工作寄存器作控制计数器 DJNZ direct,rel DJNZ direct,rel;以直接寻址单元作控制计数;以直接寻址单元作控制计数 器。器。例如,计算例如,计算n n个数据的和。个数据的和。 程序框图见图程序框图见图4-10 4-10 。 计数控
63、制方法只有在循环次数已知的情况下才计数控制方法只有在循环次数已知的情况下才适用。对循环次数未知的问题,不能用循环次数适用。对循环次数未知的问题,不能用循环次数来控制。往往需要根据某种条件来判断是否应该来控制。往往需要根据某种条件来判断是否应该终止循环。终止循环。54552 2条件控制结构条件控制结构例例4-154-15 设设有有一一串串字字符符,依依次次存存放放在在内内部部RAMRAM从从30H30H单单元元开开始始的的连连续续单单元元中中,该该字字符符串串以以0AH0AH为为结结束束标标志志,编写测试字符串长度的程序。编写测试字符串长度的程序。本本例例采采用用逐逐个个字字符符依依次次与与“0
64、AH”“0AH”比比较较的的方方法法。为为此此设设置置一一个个长长度度计计数数器器和和一一个个字字符符串串指指针针。长长度度计计数数器器用用来来累累计计字字符符串串的的长长度度,字字符符串串指指针针用用于于指指定定字字符符。如如果果指指定定字字符符与与“0AH”“0AH”不不相相等等,则则长长度度计计数数器器和和字字符符串串指指针针都都加加1 1,以以便便继继续续往往下下比比较较;如如果果比比较较相相等等,则则表表示示该该字字符符为为“0AH”“0AH”,字字符符串串结结束束,长度计数器的值就是字符串的长度。程序略。长度计数器的值就是字符串的长度。程序略。56最最常常见见的的多多重重循循环环是
65、是由由DJNZDJNZ指指令令构构成成的的软软件件延延时时程程序序,它是常用的程序之一。它是常用的程序之一。 例例4-164-16 50ms 50ms延时程序。延时程序。 延延时时程程序序与与MCS-51MCS-51指指令令执执行行时时间间有有很很大大的的关关系系。在在使使用用12MHz12MHz晶晶振振时时,一一个个机机器器周周期期为为1 1s,s,执执行行一一条条DJNZDJNZ指指令令的的时时间间为为2 2s s。这这时时,可可用用双双重重循循环环方方法写出下面如下的延时法写出下面如下的延时50ms50ms的程序:的程序:DEL: MOV R7,#200DEL: MOV R7,#200D
66、EL1: MOV R6,#125DEL1: MOV R6,#125DEL2: DJNZ R6,DEL2 DEL2: DJNZ R6,DEL2 ;125*2=250125*2=250 s s DJNZ R7,DEL1 DJNZ R7,DEL1 ;0.25ms*200=50ms0.25ms*200=50ms RET RET57 以以上上延延时时程程序序不不太太精精确确,它它没没有有考考虑虑到到除除“DJNZ “DJNZ R6,DEL2 R6,DEL2 ”指指令令外外的的其其它它指指令令的的执执行行时时间间,如如把把其其它指令的执行时间计算在内,它的延时时间为:它指令的执行时间计算在内,它的延时时间
67、为: (250+1+2250+1+2)*200+1=50.301ms*200+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*123+2=2482*123+2=248s s DJNZ R7,DEL1 DJNZ R7,DEL1 ;(248+2)*200+1=50.001ms(248+2)*200+1=50.001ms R
68、ET RET实实际际延延迟迟时时间间为为50.001ms50.001ms,注注意意。软软件件延延时时程程序序,不不允许有中断,否则将严重影响定时的准确性。允许有中断,否则将严重影响定时的准确性。584.3.9 4.3.9 码制转换程序设计码制转换程序设计 在单片机应用程序的设计中,经常涉及到各种码制的在单片机应用程序的设计中,经常涉及到各种码制的转换问题。在单片机系统内部进行数据计算和存储转换问题。在单片机系统内部进行数据计算和存储时,经常采用二进制码,具有运算方便、存储量小时,经常采用二进制码,具有运算方便、存储量小的特点。在输入的特点。在输入/ /输出中,按照人的习惯均采用代输出中,按照人
69、的习惯均采用代表十进制数的表十进制数的BCDBCD码(用码(用4 4位二进制数表示的十进制位二进制数表示的十进制数)表示。此外,打印机要打印某数字字符,则需数)表示。此外,打印机要打印某数字字符,则需要将该数字的二进制码转换为该字符的要将该数字的二进制码转换为该字符的ASCIIASCII码,码,才能送到打印机去打印。才能送到打印机去打印。 一、二进制码到一、二进制码到BCDBCD码的转换码的转换 BCDBCD码有两种形式:一种是码有两种形式:一种是1 1个字节放个字节放1 1位位BCDBCD码码,它适,它适用于显示或输出,一种是用于显示或输出,一种是压缩的压缩的BCDBCD码码,即,即1 1个字节个字节放两位放两位BCDBCD码,可以节省存储单元。码,可以节省存储单元。 59二、二、 BCD码到二进制码的转换码到二进制码的转换 三、二进制码与三、二进制码与ASCII码之间的转换码之间的转换 60