跳到主要内容

1.6 8051微控制器汇编语言编程

在之前的8051单片机教程中,我们已经了解了8051单片机的指令集和寻址模式。在本教程中,我们将探讨8051单片机的汇编语言编程,包括8051汇编语言的结构、示例程序等。

在深入探讨8051单片机的汇编语言和编程之前,让我们先简要了解一下编程语言(特别是针对微控制器的)以及编程语言的类型。

什么是编程语言?

在微控制器(或任何计算机)的上下文中,编程意味着编写一系列指令,这些指令按特定顺序由处理器执行,以完成预定义的任务。编程还涉及对指令和指令序列进行调试和故障排除,以确保完成所需的任务。

像任何语言一样,编程语言也有一定的词汇、语法和规则。8051单片机有三种类型或级别的编程语言。这些级别基于语言中的语句与微控制器执行的操作或任务的相似程度。

这三种编程语言级别是:

  1. 机器语言(Machine Language)
  2. 汇编语言(Assembly Language)
  3. 高级语言(High-level Language)
alt text

机器语言

在机器语言或机器代码中,指令以二进制位模式编写,即1和0的组合,这些位模式以高电平和低电平的形式存储。这是最低级别的编程语言,也是微控制器或微处理器实际理解的语言。

汇编语言

汇编语言是编程语言的下一个级别。由于机器语言或代码涉及所有的指令都是1和0,因此对于人类来说,使用它进行编程非常困难。

汇编语言是机器语言的伪英语表示。8051单片机的汇编语言是英文单词(称为助记符)和十六进制代码的组合。

它也是一种低级语言,需要对微控制器的架构有深入的了解。

高级语言

高级语言的名称意味着你不需要担心微控制器的架构或其他内部细节,它们使用人类容易理解的单词和语句。

一些高级语言的例子包括BASIC、C、Pascal、C++和Java。一个名为编译器(Compiler)的程序会将用高级语言编写的程序转换为机器代码。

为什么选择汇编语言?

尽管高级语言使用起来很方便,但以下原因突出了汇编语言的优势:

  • 用汇编语言编写的程序执行速度更快,占用的内存更少。
  • 借助汇编语言,你可以直接利用微控制器的所有功能。
  • 使用汇编语言,你可以直接且精确地控制微控制器的所有资源,如I/O端口、RAM、SFRs等。
  • 与高级语言相比,汇编语言的规则和限制更少。

8051单片机汇编语言的结构

这里讨论了8051单片机汇编语言的结构或语法。8051单片机的汇编语言程序的每一行或语句由三个字段组成:标签(Label)、指令(Instruction)和注释(Comments)。

这些字段的排列顺序如下:

[Label:]            Instructions                 [//Comments]

注意:标签和注释字段的括号表示这些字段是可选的,并非程序中的所有语句都需要使用它们。

在了解这三个字段之前,让我们先看看8051单片机汇编语言中一个典型的语句或行是什么样子的。

TESTLABEL:   MOV A, 24H   ; THIS IS A SAMPLE COMMENT 

在上述语句中,“TESTLABEL”是标签的名称,“MOV A, 24H”是指令,“THIS IS A SAMPLE COMMENT”是注释。

alt text

标签(Label)

标签是程序员为程序中的内存位置或语句选择的名称。语句的标签部分是可选的,如果存在,标签必须以冒号(:)结尾。

选择标签名称时需要注意的一个重要点是,它们应该减少对文档的需求。

指令(Instruction)

指令是8051单片机汇编语言编程的主要部分,因为它负责微控制器执行的任务。汇编语言中的任何指令都包含两个部分:操作码(Op-code)和操作数(Operand(s))。

alt text

指令的第一部分是操作码,它是操作代码的简称,指定了微控制器要执行的操作。汇编语言中的操作码称为助记符。操作码以二进制格式(用于机器语言)表示,而助记符(相当于操作码)是类似英语的语句。

指令的第二部分称为操作数,它表示要执行操作的数据。有两种类型的操作数:源操作数(Source Operand)和目标操作数(Destination Operand)。源操作数是操作的输入,目标操作数是存储结果的地方。

注释(Comments)

8051汇编语言结构的最后一部分是注释。注释是由开发人员添加的语句,用于更容易地理解代码,并用于程序的适当文档化。

注释是可选的,如果使用,它们必须以分号(;)或双斜杠(//)开头,具体取决于汇编器。

以下语句将展示使用标签、指令和注释的几种可能方式。

  • 只有标签,没有指令和注释:LABEL:
  • 包含标签和指令的行:LABEL: MOV A, 22H
  • 包含指令和注释的行:MOV A, 22H ; THIS IS A COMMENT
  • 包含标签和注释的行:LABEL: ; THIS IS A COMMENT
  • 只有注释的行:; THIS IS A COMMENT

8051单片机汇编语言指令

汇编语言指令不是给8051单片机汇编器的指令,尽管它们写在程序的助记符字段中。汇编语言指令实际上是给汇编器的指令,指导汇编器程序在汇编过程中做什么。

汇编语言指令对8051单片机存储器的内容没有影响(除了DB和DW指令)。

这些指令依赖于汇编器程序,在ASM51汇编器的情况下,以下是指令的类别。

alt text

现在我们将了解一些重要且常用的汇编语言指令。

ORG — 设置起始地址

8051单片机汇编语言程序将从程序存储器地址0000H开始汇编。这也是8051单片机开始执行代码的地址。

为了将程序和数据放置在8051单片机地址空间的任何位置,你可以使用ORG指令。

示例

ORG 0000H               ; 告诉汇编器从0000H开始汇编下一条语句

LJMP MAIN ; 代码存储在0000H。跳转到MAIN。

ORG 000BH ; 告诉汇编器从000BH开始汇编下一条语句

MAIN: NOP ; 代码存储在000BH。MAIN从这里开始。

DB — 定义字节

DB指令用于定义一个字节类型的变量。使用此指令,你可以以十进制、二进制、十六进制或ASCII格式定义数据。二进制数据应以“B”结尾,十六进制数据应以“H”结尾。ASCII字符应放在单引号中(如“字符串”)。

示例

ORG 0000H

DB 10 ; 定义字节10(十进制)并存储在0000H

DB 30H ; 定义字节30(十六进制)并存储在0001H

DB ‘STRING’ ; 定义字符串“STRING”并存储在0002H到0007H

DB 00001111B ; 定义字节00001111(二进制)并存储在0008H

DB 1234H ; 定义字节34(十六进制)并存储在0009H。只接受低字节,因为DB只能分配一个字节的内存。

DW — 定义字

定义字(DW)指令用于在程序中包含一个16位数据。DW的功能与DB类似,但DW生成16位值。

EQU — 等价

使用EQU指令,你可以将一个符号(或标签)与一个值关联起来。

示例

TMP EQU #30                      ; 将值#30分配给名称TMP

RED_LED EQU P1.0 ; 将P1.0定义为RED_LED

END

END指令用于停止汇编过程。这应该是程序中的最后一条语句。END指令不能有标签,汇编器不会处理END之后的语句。

示例

ORG 0000H

MOV A, 20H

MOV R0, #30

END

8051单片机汇编语言编程示例

示例1

以下是一个简单的8051单片机汇编语言程序,它将Bank0中的R0寄存器的数据复制到Bank3中的R0寄存器。

ORG 00H
MOV R0, #33H
MOV A, R0
SETB PSW.3
SETB PSW.4
MOV R0, A
END

示例2

在下一个示例中,你可以通过连接到8051单片机PORT1端口的LED灯,实现LED灯的开关切换(即闪烁效果)。

在本教程中,我们已经了解了8051单片机汇编语言编程的基础知识,包括8051汇编语言的结构、汇编语言指令以及一些示例。