9979997藏宝阁香港马会
大学生考试网 让学习变简单
赞助商链接
当前位置:9979997藏宝阁香港马会 >> 理学 >>

21天教你学会单片机—第3章

21天教你学会单片机—第3章

9979997藏宝阁香港马会 www.shixinhuamu.com
21天学 单片机开发 天学51单片机开发 天学

第三讲: 第三讲:单片机汇编语言

北京源智天下科技有限公司

联系方式:http://www.rzchina.net

课程安排

? ? ? ? ?

单片机汇编语言概述 伪指令 单片机的指令 51系列单片机指令集 系列单片机指令集 单片机汇编语言的程序结构

北京源智天下科技有限公司
1-2

联系方式:http://www.rzchina.net

单片机汇编语言概述
? ?

单片机汇编语言就是单片机汇编指令的集合, 单片机汇编语言就是单片机汇编指令的集合,其采用了助记符的 形式来描述指令。 形式来描述指令。 优点: 优点:
– – – – 程序代码精炼,执行速度快; 程序代码精炼,执行速度快; 每条指令的执行时间确定,特别适合于对时序要求比较高的场合; 每条指令的执行时间确定,特别适合于对时序要求比较高的场合; 占用内存单元和CPU资源比较少; 资源比较少; 占用内存单元和 资源比较少 和硬件结构和资源密切相关, 和硬件结构和资源密切相关,对于理解单片机的运行和组成很有帮 助。

?

缺点: 缺点:
– 指令和具体的硬件密切相关,缺乏通用性; 指令和具体的硬件密切相关,缺乏通用性; – 采用助记符描述的指令还是不够清晰,代码比较难懂; 采用助记符描述的指令还是不够清晰,代码比较难懂; – 使用汇编语言编写程序时,必须熟悉单片机的指令系统、寻址方式 使用汇编语言编写程序时,必须熟悉单片机的指令系统、 寄存器的设置和使用方法,以及系统的硬件资源等。 、寄存器的设置和使用方法,以及系统的硬件资源等。分散了开发 人员用于程序结构和功能上的精力; 人员用于程序结构和功能上的精力;
北京源智天下科技有限公司
1-3

联系方式:http://www.rzchina.net

伪指令

? ?

伪指令,顾名思义,并不是真正的单片机指令。 伪指令,顾名思义,并不是真正的单片机指令。伪指令仅为单片 机汇编程序提供某种标记信息,但却是程序中不可缺少的部分。 机汇编程序提供某种标记信息,但却是程序中不可缺少的部分。 伪指令与单片机指令的区别如下: 伪指令与单片机指令的区别如下:
– 伪指令不能命令 伪指令不能命令CPU执行某种操作,也没有对应的机器代码。 执行某种操作, 执行某种操作 也没有对应的机器代码。 – 单片机指令能使单片机的CPU执行某种操作,并可以生成对应的机 执行某种操作, 单片机指令能使单片机的 执行某种操作 器代码。 器代码。

北京源智天下科技有限公司
1-4

联系方式:http://www.rzchina.net

起始伪指令ORG 起始伪指令

? ?

起始伪指令ORG用于标记一个汇编语言程序的开始。 用于标记一个汇编语言程序的开始。 起始伪指令 用于标记一个汇编语言程序的开始 这里, 位地址便是汇编程序块或数据块存放的起始 这里,16位地址便是汇编程序块或数据块存放的起始 地址。如果省略ORG伪指令,则单片机程序代码将默 伪指令, 地址。如果省略 伪指令 认从0000H单元开始存放。 单元开始存放。 认从 单元开始存放

使用格式

[标号:] ORG

16位地址

北京源智天下科技有限公司
1-5

联系方式:http://www.rzchina.net

结束伪指令END 结束伪指令

? ? ?

结束伪指令END用于标记一个汇编语言程序的结束 。 用于标记一个汇编语言程序的结束 结束伪指令 这里,标号和表达式都可以省略。 这里,标号和表达式都可以省略。在汇编语言程序执行 之后所写的任何指令都不予以处理。 时,END之后所写的任何指令都不予以处理。 之后所写的任何指令都不予以处理 一个程序只能有一个END伪指令。 伪指令。 一个程序只能有一个 伪指令

使用格式

[标号:] END

[表达式]

北京源智天下科技有限公司
1-6

联系方式:http://www.rzchina.net

等值伪指令EQU 等值伪指令

? ?

等值伪指令EQU相当于重命名的概念,其采用一个规 相当于重命名的概念, 等值伪指令 相当于重命名的概念 定的字符名称来代替一个数或特定的汇编符号。 定的字符名称来代替一个数或特定的汇编符号。 使用伪指令EQU时必须先赋值,后使用,而不能先使 时必须先赋值, 使用伪指令 时必须先赋值 后使用, 用后赋值。另外,给字符名称所赋的值可以是8位数 位数, 用后赋值。另外,给字符名称所赋的值可以是 位数, 也可以是16位数。用EQU定义的字符名称不能和汇编 也可以是 位数。 定义的字符名称不能和汇编 位数 语言的关键字同名。 语言的关键字同名。

使用格式

字符名称 或者 字符名称

EQU =

数据或汇编符号

数据或汇编符号

北京源智天下科技有限公司
1-7

联系方式:http://www.rzchina.net

地址赋值伪指令DATA 地址赋值伪指令
? ? 地址赋值伪指令DATA是用指定的字符名称来代替数据地址或代码 是用指定的字符名称来代替数据地址或代码 地址赋值伪指令 地址 。 DATA伪指令在程序中常用来定义数据地址。就功能上来说,伪指 伪指令在程序中常用来定义数据地址。 伪指令在程序中常用来定义数据地址 就功能上来说, 令DATA与EQU有些类似。区别如下: 与 有些类似。区别如下: 有些类似
– EQU伪指令必须先定义后使用,而DATA伪指令则无此限制; 伪指令必须先定义后使用, 伪指令则无此限制; 伪指令必须先定义后使用 伪指令则无此限制 – EQU伪指令可以把一个汇编符号赋给一个字符名称,而DATA伪指令 伪指令可以把一个汇编符号赋给一个字符名称, 伪指令可以把一个汇编符号赋给一个字符名称 伪指令 则不能; 则不能; – DATA伪指令可将一个表达式的值赋给一个字符变量,所定义的字符 伪指令可将一个表达式的值赋给一个字符变量, 伪指令可将一个表达式的值赋给一个字符变量 变量也可以出现在表达式中, 定义的字符则不能这样使用。 变量也可以出现在表达式中,而EQU定义的字符则不能这样使用。 定义的字符则不能这样使用

使用格式

字符名称 DATA

表达式

北京源智天下科技有限公司
1-8

联系方式:http://www.rzchina.net

字节保存伪指令DB 字节保存伪指令
? ? 字节保存伪指令DB用于在单片机内存中保存数据表, 字节保存伪指令 用于在单片机内存中保存数据表,只能对程 用于在单片机内存中保存数据表 序存储器进行操作 。 其中,8位字节数据表可以是一个或多个字节数据、字符串或表 其中, 位字节数据表可以是一个或多个字节数据、 位字节数据表可以是一个或多个字节数据 达式。 达式。
– 在数据表中,各项数据用“,”分隔,一个数据项占一个存储单元。 在数据表中,各项数据用“ 分隔 一个数据项占一个存储单元。 分隔, – 所有的数据项是从标号指定的地址单元开始,将数据表中的字节 所有的数据项是从标号指定的地址单元开始, 数据按顺序依次保存。 数据按顺序依次保存。 – 数据项可以采用十进制、二进制或者十六进制表示。 数据项可以采用十进制、二进制或者十六进制表示。

使用格式

[标号:] DB

8位字节数据表

北京源智天下科技有限公司
1-9

联系方式:http://www.rzchina.net

字保存伪指令DW 字保存伪指令
? ? 字保存伪指令DW用于在单片机内存中保存双字节数据表,只能 用于在单片机内存中保存双字节数据表, 字保存伪指令 用于在单片机内存中保存双字节数据表 对程序存储器进行操作 。 其中, 位字数据表可以是一个或多个字节数据 位字数据表可以是一个或多个字节数据、 其中,16位字数据表可以是一个或多个字节数据、字符串或表 达式。 达式。
– 在数据表中,各项数据用“,”分隔,一个数据项占一个存储单元。 在数据表中,各项数据用“ 分隔 一个数据项占一个存储单元。 分隔, – 所有的数据项是从标号指定的地址单元开始,将数据表中的字节 所有的数据项是从标号指定的地址单元开始, 数据按顺序依次保存。 数据按顺序依次保存。 – 16位数据要占用两个单元的存储器,高8位数据存入低地址字节, 位数据要占用两个单元的存储器, 位数据存入低地址字节, 位数据要占用两个单元的存储器 位数据存入低地址字节 位数据存入高地址字节。 低8位数据存入高地址字节。 位数据存入高地址字节

使用格式

[标号:] ORG

16位地址

北京源智天下科技有限公司
1-10

联系方式:http://www.rzchina.net

空间预留伪指令DS 空间预留伪指令

? ?

空间预留伪指令DS用于在单片机内存中划分出一定的 空间预留伪指令 用于在单片机内存中划分出一定的 存储空间用作备用区域, 存储空间用作备用区域,只能对程序存储器进行操作 。 这里,表达式表示了从标号指定的地址单元开始, 这里,表达式表示了从标号指定的地址单元开始,保留 存储单元的个数。 存储单元的个数。

使用格式

[标号:] DS

表达式

北京源智天下科技有限公司
1-11

联系方式:http://www.rzchina.net

位变量伪指令BIT 位变量伪指令

? ?

位变量伪指令BIT用于给位地址定义一个字符名称 。 用于给位地址定义一个字符名称 位变量伪指令 其中,位地址需要参考单片机中的定义, 其中,位地址需要参考单片机中的定义,字符名称就是 位变量。 位变量。

使用格式

字符名称

BIT

位地址

北京源智天下科技有限公司
1-12

联系方式:http://www.rzchina.net

单片机的指令

? ? ?

51系列单片机一般都遵循 系列单片机一般都遵循8051指令集。 指令集。 系列单片机一般都遵循 指令集 对于单片机汇编语言来说, 对于单片机汇编语言来说,一条指令通常由操作码和操作数两部 分组成。 分组成。 单片机的指令按照其对应的机器码的长度,可以分为如下3种 单片机的指令按照其对应的机器码的长度,可以分为如下 种 :
– 单字节指令,其对应的机器码只有一个字节,在单片机的程序存储 单字节指令,其对应的机器码只有一个字节, 器中占用1个字节的存储单元 单字节指令的功能明确专一, 个字节的存储单元。 器中占用 个字节的存储单元。单字节指令的功能明确专一,操作简 单。 – 双字节指令,其对应的机器码为两个字节,第一个字节表示操作码 双字节指令,其对应的机器码为两个字节, 第二个字节表示操作数。 ,第二个字节表示操作数。双字节指令在单片机的程序存储器中占 用两个字节的存储单元。 用两个字节的存储单元。 – 三字节指令,其对应的机器码为三个字节,第一个字节表示操作码 三字节指令,其对应的机器码为三个字节, 后二个字节表示操作数。 ,后二个字节表示操作数。三字节指令在单片机的程序存储器中占 用三个字节的存储单元。 用三个字节的存储单元。
北京源智天下科技有限公司
1-13

联系方式:http://www.rzchina.net

单片机指令的寻址方式

? ?

指令的执行是需要操作对象的, 指令的执行是需要操作对象的,单片机指令获取操作对象的方式 便是指令的寻址方式。 便是指令的寻址方式。 可以分为如下7种 单片机指令的寻址方式 ,可以分为如下 种 :
– – – – – – – 立即寻址 直接寻址 寄存器寻址 寄存器间接寻址 变址寻址 相对寻址 位寻址

北京源智天下科技有限公司
1-14

联系方式:http://www.rzchina.net

立即寻址

?

?

立即寻址相当于直接给出操作数,此时的操作数称为立即数。 立即寻址相当于直接给出操作数,此时的操作数称为立即数。立 即数的前面采用标识符“ 来表示 来表示, 即数的前面采用标识符“#”来表示,是寻址指令中直接出现的数 据。 立即数可以采用不同的表示方式: 立即数可以采用不同的表示方式:
– – – – 十六进制,结尾用字符H来区别; 来区别; 十六进制,结尾用字符 来区别 十进制,结尾用字符D来区别 一般可以省略; 来区别, 十进制,结尾用字符 来区别,一般可以省略; 八进制,结尾用字符O来区别 来区别; 八进制,结尾用字符 来区别; 二进制,结尾用字符B来区别 来区别。 二进制,结尾用字符 来区别。

?

在单片机中,立即寻址方式的寻址空间是程序存储器, 在单片机中,立即寻址方式的寻址空间是程序存储器,也就是说 立即寻址方式所操作的立即数是存储在指令字节中的。 立即寻址方式所操作的立即数是存储在指令字节中的。

北京源智天下科技有限公司
1-15

联系方式:http://www.rzchina.net

直接寻址

? ?

直接寻址方式相当于将操作数存放的地址告诉指令, 直接寻址方式相当于将操作数存放的地址告诉指令,此时为了和 立即寻址相区别,地址前没有标识符“ 。 立即寻址相区别,地址前没有标识符“#”。 在单片机中,直接寻址方式可寻址如下两类存储空间。 在单片机中,直接寻址方式可寻址如下两类存储空间。
– 片内 片内RAM的低 的低128个字节单元,其地址为 个字节单元, 的低 个字节单元 其地址为00H~7FH。这样,在这 ~ 。这样, 128位地址的直接寻址方式中,00H代表第 位,01H代表第 位,依 位地址的直接寻址方式中, 代表第0位 代表第1位 位地址的直接寻址方式中 代表第 代表第 次类推; 次类推; – 特殊功能寄存器,其直接地址也可以用特殊功能寄存器的符号名称 特殊功能寄存器, 来表示。直接寻址也是访问特殊功能寄存器的唯一方法。 来表示。直接寻址也是访问特殊功能寄存器的唯一方法。

北京源智天下科技有限公司
1-16

联系方式:http://www.rzchina.net

寄存器寻址

? ? ?

寄存器寻址相当于告诉指令操作数所存放的寄存器,此时, 寄存器寻址相当于告诉指令操作数所存放的寄存器,此时,寄存 器中的内容作为操作数。 器中的内容作为操作数。 由于寄存器位于单片机CPU的内部,因此采用寄存器寻址的速度 的内部, 由于寄存器位于单片机 的内部 相比其他几种寻址方式要快,程序具有较高的运算处理速度。 相比其他几种寻址方式要快,程序具有较高的运算处理速度。 寄存器寻址可以寻址如下几种 :
– – – – 通用寄存器R0~R7 通用寄存器 累加器A 累加器 寄存器AB 寄存器 数据指针DPTR 数据指针

?

在指令的操作数位置上指定寄存器的寻址方式。其中, 在指令的操作数位置上指定寄存器的寻址方式。其中,寄存器的 内容作为操作数。 内容作为操作数。采用寄存器寻址方式的指令一般都是一个字节 的指令。 的指令。
北京源智天下科技有限公司
1-17

联系方式:http://www.rzchina.net

寄存器间接寻址
? ? ?

寄存器间接寻址相当于绕了更大的弯,此时数据存放在RAM中, 寄存器间接寻址相当于绕了更大的弯,此时数据存放在 中 而该RAM的地址放在寄存器中。 的地址放在寄存器中。 而该 的地址放在寄存器中 这样,通过访问寄存器来获得RAM中操作数的寻址方式便是寄存 这样,通过访问寄存器来获得 中操作数的寻址方式便是寄存 器间接寻址。 器间接寻址。 在单片机中,寄存器间接寻址可以访问如下所述的存储空间。 在单片机中,寄存器间接寻址可以访问如下所述的存储空间。
– 片内 片内RAM的低 的低128个字节单元,此时需要使用 、R1作为间接寻址 个字节单元, 的低 个字节单元 此时需要使用R0、 作为间接寻址 的寄存器; 的寄存器; – 外部 外部RAM,如果采用 、R1作为间接寻址的寄存器,可寻址 作为间接寻址的寄存器, ,如果采用R0、 作为间接寻址的寄存器 可寻址256个 个 单元; 单元; – 外部 外部RAM,如果采用 位的 位的DPTR作为间接寻址的寄存器,可寻址 作为间接寻址的寄存器, ,如果采用16位的 作为间接寻址的寄存器 外部RAM的完整 的完整64KB地址空间。 地址空间。 外部 的完整 地址空间

?

在寄存器间接寻址的指令中,寻址的寄存器前需要加“ 标识符 标识符。 在寄存器间接寻址的指令中,寻址的寄存器前需要加“@”标识符。 这样可以和寄存器寻址相区别。 这样可以和寄存器寻址相区别。
北京源智天下科技有限公司
1-18

联系方式:http://www.rzchina.net

变址寻址
?

? ?

变址寻址提供了16位地址的寻址能力, 变址寻址提供了 位地址的寻址能力,其采用基址寄存器加变址 位地址的寻址能力 寄存器方式来寻址。其中,基址寄存器为DPTR或PC,变址寄存 寄存器方式来寻址。其中,基址寄存器为 或 , 器为累加器A,用于存放地址偏移量。 器为累加器 ,用于存放地址偏移量。 在单片机中, 在单片机中,变址寻址方式一般常用于访问程序储存器中的数据 表格。 表格。 变址寻址共有两种形式 :
– MOV A, @A+DPTR:其功能是将累加器 的内容与数据指针 :其功能是将累加器A的内容与数据指针 DPTR的内容相加形成操作数的地址,即程序储存器的 位地址。该 的内容相加形成操作数的地址, 位地址。 的内容相加形成操作数的地址 即程序储存器的16位地址 指令取此地址中的内容送入累加器A中 指令的操作码为93H,如图 指令取此地址中的内容送入累加器 中,指令的操作码为 , 3-7所示。 所示。 所示 – MOV A, @A+PC:其功能是将累加器 的内容与 的内容相加形成 的内容与PC的内容相加形成 :其功能是将累加器A的内容与 操作数的地址,即程序储存器的16位地址 位地址。 操作数的地址,即程序储存器的 位地址。该指令取此地址中的内 容送入累加器A中 其操作码为83H。 容送入累加器 中,其操作码为 。
北京源智天下科技有限公司
1-19

联系方式:http://www.rzchina.net

相对寻址

? ? ?

相对寻址是根据指定地址的偏移量,然后从当前 值跳转到偏移 相对寻址是根据指定地址的偏移量,然后从当前PC值跳转到偏移 量所指向的地址的方式。 量所指向的地址的方式。 这里,地址偏移量为带符号的8位二进制数 其取值范围为-128~ 位二进制数, 这里,地址偏移量为带符号的 位二进制数,其取值范围为 ~ +127。 。 因此,相对寻址可以寻址当前PC的 因此,相对寻址可以寻址当前 的-128~127之间的某段程序存 ~ 之间的某段程序存 储器。 储器。

北京源智天下科技有限公司
1-20

联系方式:http://www.rzchina.net

位寻址

? ? ?

51系列单片机一般都遵循 系列单片机一般都遵循8051指令集。 指令集。 系列单片机一般都遵循 指令集 对于单片机汇编语言来说, 对于单片机汇编语言来说,一条指令通常由操作码和操作数两部 分组成。 分组成。 单片机的指令按照其对应的机器码的长度,可以分为如下3种 单片机的指令按照其对应的机器码的长度,可以分为如下 种 :
– 单字节指令,其对应的机器码只有一个字节,在单片机的程序存储 单字节指令,其对应的机器码只有一个字节, 器中占用1个字节的存储单元 单字节指令的功能明确专一, 个字节的存储单元。 器中占用 个字节的存储单元。单字节指令的功能明确专一,操作简 单。 – 双字节指令,其对应的机器码为两个字节,第一个字节表示操作码 双字节指令,其对应的机器码为两个字节, 第二个字节表示操作数。 ,第二个字节表示操作数。双字节指令在单片机的程序存储器中占 用两个字节的存储单元。 用两个字节的存储单元。 – 三字节指令,其对应的机器码为三个字节,第一个字节表示操作码 三字节指令,其对应的机器码为三个字节, 后二个字节表示操作数。 ,后二个字节表示操作数。三字节指令在单片机的程序存储器中占 用三个字节的存储单元。 用三个字节的存储单元。
北京源智天下科技有限公司
1-21

联系方式:http://www.rzchina.net

位寻址
? ?

位寻址是特别为位操作区域提供的寻址方式, 位寻址是特别为位操作区域提供的寻址方式,在指令中直接给出 位地址即可。 位地址即可。 51系列单片机中,可以位寻址的区域如下: 系列单片机中, 系列单片机中 可以位寻址的区域如下:
– 片内 片内RAM的20H~2FH单元,共16×8=128位??芍苯邮褂梦坏刂?的 单元, ~ 单元 × 位 来表示,例如, 单元的0~ 位的位地址为 位的位地址为00H~07H。也可以使 来表示,例如,20H单元的 ~7位的位地址为 单元的 ~ 。 地址加位序号表示, 表示2AH单元的 位。 单元的D1位 用RAM地址加位序号表示,例如 地址加位序号表示 例如2AH.1表示 表示 单元的 – 可位寻址的特殊功能寄存器相应位,这些位均有特定的名称,因此 可位寻址的特殊功能寄存器相应位,这些位均有特定的名称, 可以直接采用位名称来表示, 可以直接采用位名称来表示,也可以采用寄存器符号加位序号表示 例如PSW.3表示 表示PSW寄存器中的 位。 寄存器中的D3位 ,例如 表示 寄存器中的

北京源智天下科技有限公司
1-22

联系方式:http://www.rzchina.net

单片机的指令集

? ?

51系列单片机的指令系统提供了 系列单片机的指令系统提供了111条指令。 条指令。 系列单片机的指令系统提供了 条指令 按照指令所执行的操作可以细分为如下5类 按照指令所执行的操作可以细分为如下 类:
– – – – – 数据传送类, 条指令; 数据传送类,共29条指令; 条指令 算术运算类, 条指令; 算术运算类,共24条指令; 条指令 逻辑运算及移位类, 条指令; 逻辑运算及移位类,共24条指令; 条指令 控制转移类, 条指令; 控制转移类,共17条指令; 条指令 位操作类, 条指令。 位操作类,共17条指令。 条指令

?

详细的指令集可以参阅书中列表。 详细的指令集可以参阅书中列表。

北京源智天下科技有限公司
1-23

联系方式:http://www.rzchina.net

单片机汇编语言的程序结构

? ?

程序结构就是程序指令的组织方式。 程序结构就是程序指令的组织方式。 单片机汇编语言程序大致可以分为5种程序结构 单片机汇编语言程序大致可以分为 种程序结构 :
– – – – – 顺序结构 分支结构 循环结构 子程序结构 查表结构

北京源智天下科技有限公司
1-24

联系方式:http://www.rzchina.net

顺序结构

? ?

顺序结构程序是按照指令的书写顺序来执行的程序结构, 顺序结构程序是按照指令的书写顺序来执行的程序结构,相当于 人们在作事情时,严格按照一个计划表来执行。 人们在作事情时,严格按照一个计划表来执行。 顺序结构是一种无分支的直线型程序结构,一种最简单、 顺序结构是一种无分支的直线型程序结构,一种最简单、最基本 的程序。 的程序。
01 02 03 04 05 06 07 08 09 10 11 12 ORG MOV MOV DIV MOV XCH MOV DIV SWAP ADD MOV END 0200H A, 32H B, #100 AB R5, A A, B B, #10 AB A A, B R6, A ;汇编程序起始指令 汇编程序起始指令 ;将单字节数据存入累加器 中 将单字节数据存入累加器A中 将单字节数据存入累加器 ;分离出百位数 分离出百位数 ;百位数送入寄存器 百位数送入寄存器R5 百位数送入寄存器 ;余数存入累加器 中 余数存入累加器A中 余数存入累加器 ;分离出十位和个位 分离出十位和个位 ;十位存入高字节 十位存入高字节 ;低位存入低字节中 低位存入低字节中 ;汇编程序结束命令 汇编程序结束命令

在该程序中, 在该程序中,单字节十六进制数据 之间, 在0~255之间,存放在单片机 ~ 之间 存放在单片机RAM 的32H中。首先将其除100后,商为 中 首先将其除 后 百位数,余数除以10, 百位数,余数除以 ,商为十位数 余数为个位数。程序转换后, ,余数为个位数。程序转换后,百 位数存放于R5中 位数存放于 中,十位和个位分别 存放于R6的高位和低位字节中 的高位和低位字节中。 存放于 的高位和低位字节中。

北京源智天下科技有限公司
1-25

联系方式:http://www.rzchina.net

分支结构

?

?

分支结构是一种判断形式的程序结构,相当于人们在作事情时, 分支结构是一种判断形式的程序结构,相当于人们在作事情时, 根据判断的结果来觉得后面做那件事。 根据判断的结果来觉得后面做那件事。分支结构的程序判断条件 的满足与否,产生一个或多个程序分支,以实现不同的程序走向。 的满足与否,产生一个或多个程序分支,以实现不同的程序走向。 分支结构按照采用指令的不同而分为两类: 分支结构按照采用指令的不同而分为两类:
– 双分支结构。这类分支结构主要采用有条件转移指令JC、JB等,比 双分支结构。这类分支结构主要采用有条件转移指令 、 等 较条件转移指令CJNE等和累加器 判断指令 等。当给定的条件成 等和累加器A判断指令 较条件转移指令 等和累加器 判断指令JZ等 立时,执行分支程序1,否则执行分支程序2。 立时,执行分支程序 ,否则执行分支程序 。 – 多分支结构。这类结构主要采用散转指令 多分支结构。这类结构主要采用散转指令JMP,根据运算的结果指 , 在多个分支中选择一个执行的程序结构。 在多个分支中选择一个执行的程序结构。

北京源智天下科技有限公司
1-26

联系方式:http://www.rzchina.net

分支结构示例
? 在该程序中, 位双字节数存放在通用寄存器 位双字节数存放在通用寄存器R3和 中 首先, 在该程序中,16位双字节数存放在通用寄存器 和R4中。首先, 对低字节数取补,然后判断其结果是否为0,如果为0, 对低字节数取补,然后判断其结果是否为 ,如果为 ,则对高字 节数进行取补,即取反加1,否则直接取反就可以了。 节数进行取补,即取反加 ,否则直接取反就可以了。程序将求补 以后的结果存放于地址21H、22H中。 以后的结果存放于地址 、 中
01 ORG 0200H ;汇编程序起始命令 汇编程序起始命令 02 MOV A,R4 ;低字节送入累加器 低字节送入累加器A 低字节送入累加器 03 CPL A ;取反 取反 04 ADD A,#01H ;加1 加 05 MOV 22H,A ;将结果送入地址 将结果送入地址22H 将结果送入地址 06 JZ ZERO ;如果 的值为零则转向 如果A的值为零则转向 如果 的值为零则转向ZERO 07 MOV A,R3 ;高字节送入累加器 高字节送入累加器A 高字节送入累加器 08 CPL A ;取反 取反 09 MOV 21H,A ;将结果送入地址 将结果送入地址21H 将结果送入地址 10 SJMP FEND ;转结束 转结束 11 ZERO: MOV A,R3 ;高字节送入累加器 高字节送入累加器A 高字节送入累加器 12 CPL A ;取反 取反 13 INC A ;加一 加一 14 MOV 21H,A ;将结果送入地址 将结果送入地址21H 将结果送入地址 15 FEND: 16 END ;程序结束 程序结束

北京源智天下科技有限公司
1-27

联系方式:http://www.rzchina.net

循环结构
? 循环结构是一种重复执行某段代码的程序结构, 循环结构是一种重复执行某段代码的程序结构,相当于人们在作 事情时,在一段时间内进行重复性的工作。 事情时,在一段时间内进行重复性的工作。一个典型的循环程序 部分组成, 由4部分组成,即循环初始化部分、循环处理部分、循环控制部分 部分组成 即循环初始化部分、循环处理部分、 和循环结束部分。 和循环结束部分。
– 初始化部分:主要用于设置循环的次数、有关的工作单元清零、变 初始化部分:主要用于设置循环的次数、有关的工作单元清零、 量设置和地址指针设置等循环初始参数。 量设置和地址指针设置等循环初始参数。 – 循环处理部分:也称为循环体,这是循环结构的主要代码段,在程 循环处理部分:也称为循环体,这是循环结构的主要代码段, 序运行时将重复执行。 序运行时将重复执行。 – 循环次数控制部分:主要用于控制循环的次数,防止出现死循环。 循环次数控制部分:主要用于控制循环的次数,防止出现死循环。 循环次数控制部分一般由两个单元组成, 循环次数控制部分一般由两个单元组成,修改控制变量和判断循环 结束。循环控制变量可以采用循环递减计数法,即每循环一次, 结束。循环控制变量可以采用循环递减计数法,即每循环一次,控 制变量减1,并判断是否为0,若不为0,则继续执行循环体程序, 制变量减 ,并判断是否为 ,若不为 ,则继续执行循环体程序,否 则结束循环体的执行;也可以采用条件控制, 则结束循环体的执行;也可以采用条件控制,即判断结束条件是否 成立,如果不成立,则继续执行循环体,否则,结束循环。 成立,如果不成立,则继续执行循环体,否则,结束循环。 – 结束部分:当循环处理部分执行完毕后,需要对计算结果进行处理 结束部分:当循环处理部分执行完毕后, 北京源智天下科技有限公司 和保存,已供后面的程序使用。 和保存,已供后面的程序使用。
1-28

联系方式:http://www.rzchina.net

循环转移指令

?

系列单片机的指令系统中, 在51系列单片机的指令系统中,提供了如下两条循环转移指令: 系列单片机的指令系统中 提供了如下两条循环转移指令:
– DJNZ Rn,LOOP:这里采用工作寄存器 为控制寄存器??刂萍拇?为控制寄存器。 :这里采用工作寄存器Rn为控制寄存器 器的计数方式一般都是减1计数 即每循环一次, 自动减 计数, 计数, 自动减1计数 器的计数方式一般都是减 计数,即每循环一次,Rn自动减 计数, 同时判断寄存器Rn是否为 是否为0,若不为0,继续执行循环;若为0, 同时判断寄存器 是否为 ,若不为 ,继续执行循环;若为 ,则 结束循环程序的执行。 结束循环程序的执行。 – DJNZ Direct,LOOP:这里采用直接寻址单元 :这里采用直接寻址单元Direct作为控制寄存器 作为控制寄存器 控制寄存器的计数方式一般都是减1计数 即每循环一次, 计数, ??刂萍拇嫫鞯募剖绞揭话愣际羌?计数,即每循环一次,Direct 单元自动减1计数 同时判断Direct单元是否为 ,若不为 ,继续执 计数, 单元是否为0,若不为0, 单元自动减 计数,同时判断 单元是否为 行循环;若为0,则结束循环程序的执行。 行循环;若为 ,则结束循环程序的执行。

北京源智天下科技有限公司
1-29

联系方式:http://www.rzchina.net

循环结构示例
? ? 在程序中,采用了比较和交换的方法来依次对比各个数据。 在程序中,采用了比较和交换的方法来依次对比各个数据。 数据块的首地址为10H,先读取第一个数据与第二个数据,把第 数据块的首地址为 ,先读取第一个数据与第二个数据, 一个数据作为基准送入累加器A,进行比较。如果基准数大, 一个数据作为基准送入累加器 ,进行比较。如果基准数大,则不 作交换,再取下一个数进行比较;如果基准数小, 作交换,再取下一个数进行比较;如果基准数小,则将数值大的 取代原来的基准数,即相当于做一次数据交换。 取代原来的基准数,即相当于做一次数据交换。 然后,再以新的基准数与下一个数进行比较,直至全部比较完毕。 然后,再以新的基准数与下一个数进行比较,直至全部比较完毕。 这里的基准数始终保持为最大的数值,因此,全部比较完毕后, 这里的基准数始终保持为最大的数值,因此,全部比较完毕后, 累加器A中的基准数即是数据块中的最大值 中的基准数即是数据块中的最大值。 累加器 中的基准数即是数据块中的最大值。最后将最大值保存在 通用寄存器R2中 通用寄存器 中。
01 02 03 04 05 06 07 08 09 10 11 12 ORG 0200H MOV R0,#10H ;数据块首地址送入 数据块首地址送入R0 数据块首地址送入 MOV A,@R0 ;取第一个数作为基准数送入累加器 取第一个数作为基准数送入累加器A 取第一个数作为基准数送入累加器 MOV R1,#0AH ;比较次数 比较次数10=0AH送入 送入R1 比较次数 送入 LOOP1: INC R0 ;修改地址指针,使其指向下一个地址单元 修改地址指针, 修改地址指针 MOV 20H,@R0 ;将要比较的数暂存于 将要比较的数暂存于20H单元 将要比较的数暂存于 单元 CJNE A,20H,CHK ;两个数进行比较 两个数进行比较 CHK: JNC LOOP2 ;如果 大,则转换 如果A大 如果 MOV A,@R0 ;如果 小,则将较大的数送入 如果A小 则将较大的数送入A 如果 LOOP2: DJNZ R1,LOOP1 ;R1减1,如果其不为 ,则继续循环 减 ,如果其不为0, MOV R2,A ;比较完毕,存结果 比较完毕, 比较完毕 END

?

北京源智天下科技有限公司
1-30

联系方式:http://www.rzchina.net

子程序结构
? 子程序结构是一种??榛某绦蛏杓扑枷?, 子程序结构是一种??榛某绦蛏杓扑枷?,其将某些运算和操作 设计成可被其他程序调用的子程序段, 设计成可被其他程序调用的子程序段,需要的时候直接调用这些 程序段即可。一般来说,调用子程序的程序称为主程序, 程序段即可。一般来说,调用子程序的程序称为主程序,调用子 程序的过程称为子程序调用。 程序的过程称为子程序调用。子程序执行完后返回主程序的过程 称为子程序返回。使用子程序可以使代码的结构清晰,也便于程 称为子程序返回。使用子程序可以使代码的结构清晰, 序的移植和重复使用。 序的移植和重复使用。 51系列单片机指令集中提供了两个指令可以用来调用子程序,其 系列单片机指令集中提供了两个指令可以用来调用子程序, 系列单片机指令集中提供了两个指令可以用来调用子程序 使用格式如下: 使用格式如下:
– LCALL ADDR16:这条指令称为长调用指令,指令的操作数 :这条指令称为长调用指令, ADDR16给出了子程序的 位入口地址。 给出了子程序的16位入口地址 给出了子程序的 位入口地址。 – ACALL ADDR11:这条指令称为绝对调用指令,其中的操作数 :这条指令称为绝对调用指令, ADDR11提供了子程序的低 位入口地址,这个地址和程序计数器 提供了子程序的低11位入口地址 提供了子程序的低 位入口地址, PC的高 位并在一起构成 位的子程序调用地址,即子程序的入口 的高5位并在一起构成 位的子程序调用地址, 的高 位并在一起构成16位的子程序调用地址 地址。 地址。
北京源智天下科技有限公司
1-31

?

联系方式:http://www.rzchina.net

子程序执行的步骤

?

子程序在执行时,需要经过如下几步: 子程序在执行时,需要经过如下几步:
– 首先将程序计数器 中的内容压入堆栈,即断点?;?。程序计数器 首先将程序计数器PC中的内容压入堆栈,即断点?;?。 中的内容压入堆栈 PC中为调用指令下一条指令地址,称为断点地址。 中为调用指令下一条指令地址, 中为调用指令下一条指令地址 称为断点地址。 – 然后,将调用地址送入程序计数器 中,使程序跳转到子程序的入 然后,将调用地址送入程序计数器PC中 口地址处开始执行。 口地址处开始执行。 – 子程序执行完毕后,通过返回指令 子程序执行完毕后,通过返回指令RET返回。指令 返回。 返回 指令RET将堆栈中存 将堆栈中存 放的返回地址(即断点地址)弹出堆栈,送回到程序计数器PC中 放的返回地址(即断点地址)弹出堆栈,送回到程序计数器 中, 使程序返回到主程序的断点处继续向下执行。 使程序返回到主程序的断点处继续向下执行。

北京源智天下科技有限公司
1-32

联系方式:http://www.rzchina.net

子程序结构示例
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 BCDADD: PUSH PSW ;现场?;?现场?;?PUSH A MOV PSW,#00H ;选择组 选择组0 选择组 MOV A,R0 ;从低字节开始相加 从低字节开始相加 ADD A,R2 MOV R0,A DEC R0 MOV A,R1 ;加数首地址 加数首地址 ADD A,R2 ;加字节数 加字节数 MOV R1,A DEC R1 CLR C ;C清零 清零 ADDA: MOV A,@R0 ;开始两数相加 开始两数相加 ADDC A,@R1 DA A ;BCD码调整 码调整 MOV @R0,A ;存和数 存和数 DEC R1 DEC R0 DJNZ R2,ADDA ;判断 判断 JNC ADDB ;若(C)=0则转向 则转向ADDB 若 则转向 MOV A,#00H ;清A为0 清 为 ADDC A,#00H ;若(C)=1,则最高位进位 若 , MOV @R0,A ADDB: POP A ;现场恢复 现场恢复 POP PSW RET ;子程序返回 子程序返回

在子程序中, 在子程序中,两个 BCD码数据均按照高 码数据均按照高 位字节数存放于低地 址单元。运算时,相 址单元。运算时, 加运算则从低位字节 数开始, 、 指 数开始,R0、R1指 针在运算前均指向最 高字节数的地址。 高字节数的地址。因 此,需要转换成指向 最低字节数的地址, 最低字节数的地址, 然后进行相加运算。 然后进行相加运算。 相加的结果BCD码和 相加的结果 码和 数存入R0指针的内部 数存入 指针的内部 RAM中,即原被加数 中 单元。 单元。
北京源智天下科技有限公司

1-33

联系方式:http://www.rzchina.net

查表程序结构
? 查表程序结构是在一个已知的数据表中查找数据的程序, 查表程序结构是在一个已知的数据表中查找数据的程序,和我们 在打电话前需要查阅电话本类似。在查表程序中, 在打电话前需要查阅电话本类似。在查表程序中,一般是把数据 按照一定的顺序排列成表格,存放在单片机的程序存储器中, 按照一定的顺序排列成表格,存放在单片机的程序存储器中,程 序中根据被测数据,查出最终所需结果。 序中根据被测数据,查出最终所需结果。 查表程序结构一般应用于如下几类计算中: 查表程序结构一般应用于如下几类计算中:
– 在一个无序表格中查找数据,因为是无序的,所以只能逐个查表来 在一个无序表格中查找数据,因为是无序的, 寻找。 寻找。 – 对于一些复杂的运算,用汇编程序难于计算,而且会占用很长的 对于一些复杂的运算,用汇编程序难于计算, CPU时间,此时可以将常用的运算结果事先存在单片机中。通过查 时间, 时间 此时可以将常用的运算结果事先存在单片机中。 表来获得运算结果。 表来获得运算结果。 – 对于一些非线性的运算,用汇编语言几乎无法处理,此时,只能用 对于一些非线性的运算,用汇编语言几乎无法处理,此时, 查表来获得运算结果。 查表来获得运算结果。

?

北京源智天下科技有限公司
1-34

联系方式:http://www.rzchina.net

查表程序结构示例
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ORG FZHAO: MOV MOV MOV MOV LOOP: PUSH MOVC CJNE MOV MOV POP DOWN: RET NF: POP INC INC DJNZ MOV MOV AJMP TAB: DB DB DB DB DB DB DB DB DB DB DB END 1000H B,10H R4,#11 DPTR,#TAB A,#15H ACC A,@A+PC A,B,NF R6,DPH R5,DPL ACC ;待查找的字送入 待查找的字送入B 待查找的字送入 ;查找次数送入 查找次数送入R4 查找次数送入 ;变址调整 变址调整 ;暂存 暂存A 暂存 ;查表 查表 ;如果没有找到则转 如果没有找到则转NF 如果没有找到则转 ;找到并记录地址 找到并记录地址

在该程序中, 在该程序中, 数据表位TAB, 数据表位 , 待查找的字符存 放在寄存器B中 放在寄存器 中。 程序中将查处次 数11送入通用寄 送入通用寄 存器B。 存器 。然后逐个 查找表, 查找表,如果找 到则记录地址, 到则记录地址, 否则将通用寄存 清零。 器R5和R6清零。 和 清零

ACC ;恢复 恢复A 恢复 A ;求下一个地址 求下一个地址 DPTR ;数据表地址加 数据表地址加1 数据表地址加 R4,LOOP ;未完则继续 未完则继续 R6,#00H R5,#00H ;如果没有找到,则R6、R5清零 如果没有找到, 如果没有找到 、 清零 DOWN 'A' ;数据表示例 数据表示例 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K'

北京源智天下科技有限公司
1-35

联系方式:http://www.rzchina.net

性格决定命运, 性格决定命运 专注成就人生

www.rzchina.net 源智天下

北京源智天下科技有限公司

联系方式:http://www.rzchina.net



推荐相关:
9979997藏宝阁香港马会 | 9979997藏宝阁香港马会
All rights reserved Powered by 9979997藏宝阁香港马会 www.shixinhuamu.com
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@qq.com