从20世纪60年代开始,数字集成电路在集成度方面的发展经历了以下4个阶段:包含几十到几百个逻辑门的小规模集成电路(Small Scale Integration,SSI);包含几百到几千个逻辑门的中规模集成电路(Medium Scale Integration,MSI);包含几千到几万个逻辑门的大规模集成电路(Large Scale Integration,LSI);包含几万个以上逻辑门的超大规模集成电路(VeryLarge Scale Integration,VLSI)。
在工作原理方面,数字集成电路可以划分为标准逻辑器件、微处理器和专用集成电路。
标准逻辑器件在集成度方面属于中小规模集成电路,它包括基于TTL工艺的54/74系列和基于CMOS工艺的4000系列的各种逻辑门、触发器、译码器、多路选择器、计数器等器件。这些器件的工作原理和应用在《数字电路逻辑设计》课程中有详细的介绍。
作为传统数字系统设计中使用的主要器件,标准逻辑器件的产量很大,因此它们的生产成本低廉、价格便宜。由于这些器件的功能确定,芯片设计时主要考虑如何提高器件的性能,因此标准逻辑器件的工作速度快,但是由于集成度较低,采用它们设计的数字系统需要较多的器件,这就使得电路连线复杂,系统的可靠性降低。由于用户无法修改这类器件的功能,修改系统设计必须通过对电路重新设计和组装来实现。
微处理器,包括在本书中将要学习的单片机,在集成度方面属于大规模集成电路。它们被应用于数字系统的设计起始于20世纪70年代。这类器件可以通过编写程序来实现系统功能。基于微处理器所设计电路的逻辑功能可由软件配置,这个特点使得设计灵活性得到提高,当修改系统设计时,设计者不需要,或者较少需要修改电路连线。相对于由标准逻辑器件构成的数字系统,基于微处理器设计的系统工作速度较低;其次,微处理器的工作仍需要一些标准逻辑器件或者相关逻辑器件构成的外围电路的支持。
1.1.3 专用集成电路
专用集成电路(Application Specific Integrated Circuit,ASIC)的出现在一定程度上克服了上述两种逻辑器件的缺点。专用集成电路是为满足一种或几种特定功能而专门设计和制作的集成电路芯片,它的集成度很高,一片专用集成电路芯片甚至可以构成一个完整的数字系统,因此这使得系统的硬件规模进一步降低,可靠性进一步提高。
专用集成电路可以分为全定制(Full-custom)产品、半定制(Semi-custom)产品和可编程逻辑器件(Programmable Logic Device,PLD)。
(1)全定制产品
全定制产品是指专为特定目的设计、制造的集成电路芯片,例如电视机、电话等设备中大量使用的专用集成电路芯片。这类产品的设计是从晶体管的版图尺寸、位置和相互连线开始进行,其目的是达到半导体芯片面积利用率高、工作速度快、功耗低的优良性能。专用集成电路芯片的制作过程包括电路设计、逻辑模拟、版图设计和集成电路的全部生产工序。全定制产品的性能优越,但是它的设计制造成本高、周期长,同时还具有较大的风险,因此该产品仅适用于需要进行特大批量生产的情况。
(2)半定制产品
半定制产品内部包含基本逻辑门、触发器和具有特定功能的逻辑块所构成的标准单元。这些标准单元是由器件生产厂家预先做好,但是标准单元之间的连线有待按用户要求进行连接。应用半定制产品时,用户需要根据设计要求选择合适的产品,再由产品的结构设计出连线版图,最后交给生产厂家完成各个标准单元之间的连线。
(3)可编程逻辑器件
全定制产品和半定制产品的使用都离不开器件生产厂家的支持,这给用户带来了很多麻烦。用户希望自己能设计专用集成电路芯片,并且能立即投入实际应用之中,而且在使用中也能比较方便地对设计进行修改。可编程逻辑器件(PLD)就是为满足这一需求而产生的。可编程逻辑器件内的电路和连线都是事先由器件生产厂家做好,但是其逻辑功能并没有确定。逻辑功能的确定可以由设计者借助于开发工具,通过编写程序的方法来实现。可编程逻辑器件的工作速度与标准逻辑器件的工作速度相当,但目前使用它们实现信号处理比使用微处理器要复杂,而且使用成本高。
单片机的全称是单片微型计算机(Single Chip Microcomputer)。为了使用方便,它把组成计算机的主要功能部件:中央处理器(CPU)、数据存储器(RAM)、程序存储器(ROM、EPROM、E2PROM或FLASH)、定时/计数器和各种输入/输出接口电路等都集成在一块半导体芯片上,构成了一个完整的计算机系统。与通用的计算机不同,单片机的指令功能是按照工业控制的要求设计,因此它又被称为微控制器(Microcontroller)。
MCS51系列单片机是美国Intel公司于1980年推出的一种8位单片机系列。该系列的基本型产品是8051、8031和8751。这3种产品之间的区别只是在片内程序存储器方面。8051的片内程序存储器(ROM)是掩膜型的,即在制造芯片时已将应用程序固化进去;8031片内没有程序存储器;8751内部包含有用作程序存储器的4KB的EPROM。由于8051的编程需要制造商的支持,8751的价格昂贵,因此8031获得了更为广泛的使用。
MCS51系列单片机优异的性能/价格比使得它从面世以来就获得用户的认可。Intel公司把这种单片机的内核,即8051内核,以出售或互换专利的方式授权给一些公司,如Atmel、Philips、ADI等。这些公司的这类产品也被称为8051兼容芯片,这些8051兼容芯片在原来的基础上增加了许多特性。本书应用电路中采用了Atmel公司的AT89S51芯片,它与MCS51单片机指令集兼容,同时它的内部包含用作程序存储器的4KB的基于FLASH技术的只读存储器。采用这款芯片既克服了采用8031需要添加外部程序存储器导致电路复杂的缺点,又克服了采用8751导致电路制作成本高的缺点。
1.2.2 AT89S51 单片机的特性
Atmel公司的AT89S51芯片具有以下特性:
? 指令集和芯片引脚与Intel公司的8051兼容;
? 4KB片内在系统可编程Flash程序存储器;
? 时钟频率为0~33MHz;
? 128字节片内随机读写存储器(RAM);
? 32个可编程输入/输出引脚;
? 2个16位定时/计数器;
? 6个中断源,2级优先级;
? 全双工串行通信接口;
? 监视定时器;
? 2个数据指针。
AT89S51单片机具有多种封装形式,包括PDIP40、PDIP42、PLCC44和TQFP44。最适合学校实验室使用的是PDIP40封装形式,它的外形如图1.1所示。PDIP40封装形式的单片机芯片可以很方便地使用面包板来组成应用电路。
· 图1.1 AT89S51单片机PDIP40封装外形图
AT89S51单片机的程序存储空间和数据存储空间是分离的,每种存储空间的寻址范围都是64KB。上述存储空间在物理上可以被映射到4个区域:片内程序存储器和片外程序存储器,片内数据存储器和片外数据存储器。存储空间的映射图如图1.2所示。当存储空间映射为外部存储器时,包括程序空间和数据空间,AT89S51单片机的P0口的8个引脚,从P0.0(AD0)到P0.7(AD7)(引脚从39到32),以时分方式被用作数据总线和地址总线的低8位;P2口的8个引脚,从P2.0(A8)到P2.7(A15)(引脚从21到28),被用作地址总线的高8位。由于对外部程序存储器和外部数据存储器的访问都是通过P0口和P2口实现,为了区分它们,外部程序存储器由引脚(引脚29)的输出信号控制;外部数据存储器的写或读操作分别由引脚P3.6(,引脚16)和引脚P3.7(,引脚17)输出信号控制。
· 图1.2 AT89S51单片机的存储器映射图
1.3.1 程序存储空间
程序存储空间可以被映射为内部程序存储器或者外部程序存储器。AT89S51单片机内部具有的4KB程序存储器被映射到程序存储空间的0000H~0FFFH区间,如图1.2所示。这部分程序存储空间也可以被映射为外部程序存储器,它具体被映射为哪一种程序存储器取决于引脚(引脚31)所接的电平。当引脚为高电平,内部程序存储器被映射到这部分程序存储空间;当引脚为低电平,外部程序存储器被映射到这部分程序存储空间。高于0FFFH的程序存储空间只能被映射为外部程序存储器。
目前Atmel公司生产的8051兼容芯片具有多种容量的内部程序存储器的型号,例如AT89S52单片机具有8KB内部程序存储器;T89C51RD2单片机具有64KB内部程序存储器。鉴于通常可以采用具有足够内部程序存储器容量的单片机芯片,用户在使用中不需要再扩展外部程序存储器,这样在单片机应用电路中引脚(引脚31)可以总是接高电平。
如图1.2所示,数据存储空间也可以被映射为内部数据存储器和外部数据存储器。进入不同的数据存储器是通过不同的指令来实现的,这点与程序存储器不一样。
AT89S51的内部数据存储器有256字节,它们被分为两部分:高128字节和低128字节。低128字节的内部数据存储器是真正的RAM区,可以被用来写入或读出数据。这一部分存储容量不是很大,但有很大的作用。它可以进一步被分为3部分,如图1.3所示。
· 图1.3 内部数据存储器低128字节
在内部数据存储器低128字节中,地址从00H~1FH的最低32个字节组成4组工作寄存器,每组有8个工作寄存器。每组中的8个工作寄存器都被命名为从R0到R7。在一个具体时刻,CPU只能使用其中的一组工作寄存器。当前正在使用的工作寄存器组由位于高128字节的程序状态字寄存器(PSW)中第3位(RS0)和第4位(RS1)的数据决定。程序状态字寄存器中的数据可以通过编程来改变,这种功能为保护工作寄存器的内容提供了很大的方便。如果用户程序中不需要全部使用4组工作寄存器,那么剩下的工作寄存器所对应的内部数据存储器也可以作为通用数据存储器使用。工作寄存器在内部数据存储器中的地址映射如表1.1所示。
表1.1 工作寄存器地址映射表
|
0组(RS1=0,RS0=0)
|
1组(RS1=0,RS0=1)
|
2组(RS1=1,RS0=0)
|
3组(RS1=1,RS0=1)
|
|
地址
|
寄存器
|
地址
|
寄存器
|
地址
|
寄存器
|
地址
|
寄存器
|
|
00H
|
R0
|
08H
|
R0
|
10H
|
R0
|
18H
|
R0
|
|
01H
|
R1
|
09H
|
R1
|
11H
|
R1
|
19H
|
R1
|
|
02H
|
R2
|
0AH
|
R2
|
12H
|
R2
|
1AH
|
R2
|
|
03H
|
R3
|
0BH
|
R3
|
13H
|
R3
|
1BH
|
R3
|
|
04H
|
R4
|
0CH
|
R4
|
14H
|
R4
|
1CH
|
R4
|
|
05H
|
R5
|
0DH
|
R5
|
15H
|
R5
|
1DH
|
R5
|
|
06H
|
R6
|
0EH
|
R6
|
16H
|
R6
|
1EH
|
R6
|
|
07H
|
R7
|
0FH
|
R7
|
17H
|
R7
|
1FH
|
R7
|
在工作寄存器区上面,内部数据存储器的地址从20H~2FH的16个字节范围内,既可以通过字节寻址的方式进入,也可以通过位寻址的方式进入,位地址范围从00H到7FH。字节地址与位地址的对应关系如表1.2所示。
表1.2 字节地址与位地址的关系
|
|
位 地 址
|
|
字 节 地 址
|
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
|
2FH
|
7F
|
7E
|
7D
|
7C
|
7B
|
7A
|
79
|
78
|
|
2EH
|
77
|
76
|
75
|
74
|
73
|
72
|
71
|
70
|
|
2DH
|
6F
|
6E
|
6D
|
6C
|
6B
|
6A
|
69
|
68
|
|
2CH
|
67
|
66
|
65
|
64
|
63
|
62
|
61
|
60
|
|
2BH
|
5F
|
5E
|
5D
|
5C
|
5B
|
5A
|
59
|
58
|
|
2AH
|
57
|
56
|
55
|
54
|
53
|
52
|
51
|
50
|
|
29H
|
4F
|
4E
|
4D
|
4C
|
4B
|
4A
|
49
|
48
|
|
28H
|
47
|
46
|
45
|
44
|
43
|
42
|
41
|
40
|
|
27H
|
3F
|
3E
|
3D
|
3C
|
3B
|
3A
|
39
|
38
|
|
26H
|
37
|
36
|
35
|
34
|
33
|
32
|
31
|
30
|
|
25H
|
2F
|
2E
|
2D
|
2C
|
2B
|
2A
|
29
|
28
|
|
24H
|
27
|
26
|
25
|
24
|
23
|
22
|
21
|
20
|
|
23H
|
1F
|
1E
|
1D
|
1C
|
1B
|
1A
|
19
|
18
|
|
22H
|
17
|
16
|
15
|
14
|
13
|
12
|
11
|
10
|
|
21H
|
0F
|
0E
|
0D
|
0C
|
0B
|
0A
|
09
|
08
|
|
20H
|
07
|
06
|
05
|
04
|
03
|
02
|
01
|
00
|
内部数据存储器地址从30H~7FH部分仅可以用作通用数据存储器。
内部数据存储器的高128字节被称为特殊功能寄存器(SFR)区。特殊功能寄存器被用作CPU和在片外围器件之间的接口,它们之间的联系方框图如图1.4所示。
· 图1.4 特殊功能寄存器(SFR)工作框图
CPU通过向相应的特殊功能存储器写入数据实现控制对应的在片外围器件的工作,从相应的特殊功能存储器读出数据实现读取对应的在片外围器件的工作结果。
在AT89S51单片机中,包括前面提到的程序状态字寄存器(PSW)的特殊功能存储器共有26个,它们离散地分布在80H~FFH的内部数据存储器地址空间范围内,如表1.3所示。
表1.3 AT89S51单片机特殊功能存储器地址映射表
|
F8H
|
|
|
|
|
|
|
|
|
FFH
|
|
F0H
|
B
|
|
|
|
|
|
|
|
F7H
|
|
E8H
|
|
|
|
|
|
|
|
|
EFH
|
|
E0H
|
ACC
|
|
|
|
|
|
|
|
E7H
|
|
D8H
|
|
|
|
|
|
|
|
|
DFH
|
|
D0H
|
PSW
|
|
|
|
|
|
|
|
D7H
|
|
C8H
|
|
|
|
|
|
|
|
|
CFH
|
|
C0H
|
|
|
|
|
|
|
|
|
C7H
|
|
B8H
|
IP
|
|
|
|
|
|
|
|
BFH
|
|
B0H
|
P3
|
|
|
|
|
|
|
|
B7H
|
|
A8H
|
IE
|
|
|
|
|
|
|
|
AFH
|
|
A0H
|
P2
|
|
AUXR1
|
|
|
|
WDERST
|
|
A7H
|
|
98H
|
SCON
|
SBUF
|
|
|
|
|
|
|
9FH
|
|
90H
|
P1
|
|
|
|
|
|
|
|
97H
|
|
88H
|
TCON
|
TMOD
|
TL0
|
TL1
|
TH0
|
TH1
|
AUXR
|
|
8FH
|
|
80H
|
P0
|
SP
|
DP0L
|
DP0H
|
DP1L
|
DP1H
|
|
PCON
|
87H
|
在表1.3中,对于没有定义的存储单元用户不能使用。如果向这些存储单元写入数据将产生不确定的效果,从它们读取数据将得到一个随机数。
对于字节地址低位为8H或者FH的特殊功能存储器,既可以进行字节操作,也可以进行位操作。例如前面提到的用来确定当前工作寄存器组的程序状态字寄存器(PSW),它的地址为D0H,因此对它可以进行字节操作,也可以进行位操作。采用位操作可以直接控制程序状态字寄存器中的第3位(RS0)或第4位(RS1)数据而不影响其他位的数据。低位地址不为8H或FH的特殊功能存储器只可以进行字节操作,当需要修改这些特殊功能存储器中的某些位时,对其他的位应注意保护。
片外数据存储空间可以被映射为数据存储器、扩展的输入/输出接口、模拟/数字转换器和数字/模拟转换器等。这些外围器件统一编址。所有外围器件的地址都占用数据存储空间的地址资源,因此CPU与片外外围器件进行数据交换时可以使用与访问外部数据存储器相同的指令。CPU通过向相应的外部数据存储器地址单元写入数据实现控制对应的片外外围器件的工作,从相应的外部数据存储器地址单元读出数据实现读取对应的片外外围器件的工作结果。
单片机的最小应用系统电路指的是它可以正常工作的最简单电路组成。AT89S51单片机的最小应用系统电路图如图1.5所示。该系统中包含4个电路部分。
· 图1.5 AT89S51单片机最小应用系统电路
(1)供电电路
引脚VCC(引脚40)接+5V电源,引脚GND(引脚20)接地线。为提高电路的抗干扰能力,一个0.1μF(器件标注为104)的瓷片电容和一个10μF的电解电容通常被接在引脚VCC和接地线之间。
(2)程序存储器选择电路
如前所述,Atmel公司生产的8051兼容芯片具有多种容量的内部程序存储器的型号,因此在使用中不需要再扩展外部程序存储器,这样在单片机应用电路中引脚(引脚31)可以总是接高电平。
(3)时钟电路
AT89S51芯片的时钟频率可以在0~33MHz范围。单片机内部有一个可以构成振荡器的放大电路。在这个放大电路的对外引脚XTAL2(引脚18)和XTAL1(引脚19)接上晶体和电容就可以构成单片机的时钟电路。图1.5所示的时钟电路由晶体CRY和电容C2与C3组成。单片机的时钟频率取决于晶体CRY的频率,如果采用面包板来组装单片机应用电路,晶体CRY的推荐值为12MHz以下。电容C2与C3的取值范围为30pF~50pF。时钟电路采用晶体的目的是提高时钟频率的稳定性。
(4)复位电路
对于AT89S51芯片,如果引脚RST(引脚9)保持24个时钟周期的高电平,单片机就可以完成复位。通常为了保证应用系统可靠地复位,复位电路应使引脚RST保持10ms以上的高电平。只要引脚RST保持高电平,单片机就循环复位。当引脚RST从高电平变为低电平时,单片机退出复位状态,从程序空间的0000H地址开始执行用户程序。
图1.5所示复位电路由C1和R1组成。当系统加电时,由于C1两端的电压不能突变,因此引脚RST为高电平,单片机进入复位状态。随着C1充电,它两端的电压上升,使得引脚RST上电压下降,最终使单片机退出复位状态。合理地选择C1和R1的取值,系统就能可靠地复位。C1的推荐值是10μF,R1的推荐值是10kΩ。
完成复位后,单片机不仅从程序空间的0000H地址开始执行用户程序,而且还影响一些特殊功能存储器的初始状态。相应的特殊功能存储器的复位值如表1.4所示。
表1.4 特殊功能存储器的复位值
|
特殊功能寄存器
|
复 位 值
|
特殊功能寄存器
|
复 位 值
|
|
PC
|
0000H
|
TMOD
|
00H
|
|
ACC
|
00H
|
TCON
|
00H
|
|
B
|
00H
|
TH0
|
00H
|
|
PSW
|
00H
|
TL0
|
00H
|
|
SP
|
07H
|
TH1
|
00H
|
|
DPTR
|
0000H
|
TL1
|
00H
|
|
P0~P3
|
FFH
|
SCON
|
00H
|
|
IP
|
XXX0 0000B
|
SBUF
|
XXXX XXXXB
|
|
IE
|
0XX0 0000B
|
PCON
|
0XXX 0000B
|
注:PC称为程序指针,它被用来存储下一条要执行的指令地址,PC的位置并不在特殊功能存储器区域。
DPTR称为数据指针,它由两个特殊功能寄存器DP0H和DP0L组成。
单片机本身不具备自主开发能力,即使在单片机应用系统的设计完成以后用户也不能直接对程序进行修改。单片机应用系统的开发必须借助一套开发工具和软件环境才能进行。本节介绍一种单片机模拟调试软件的使用。模拟调试软件不仅可以在程序下载到单片机芯片之前验证它的正确性,而且模拟调试软件也可以用来辅助学习单片机的基本知识。
Keil单片机模拟调试软件是目前获得广泛应用的一种开发MCS51系列兼容单片机的软件。该软件可以从Keil公司中国代理处购买,也可以从Keil公司的网站(http://www. keil.com)上下载它的免费评估(Eval)版本。
下载获得的Keil单片机模拟调试软件是一个压缩包,解压后执行其中的Setup.exe程序就可以安装这个软件。软件的安装过程与一般的Windows应用软件类似,只要按照安装提示操作即可,这里不作详细介绍,仅需要注意的是,安装方式要选择Eval Vision安装。
Keil单片机模拟调试软件安装完成以后,计算机桌面上将产生一个标注有“Keil μVision2”的图标,双击这个图标就可以进入Keil单片机模拟调试软件的集成开发环境。集成开发环境的界面如图1.6所示,初次进入的集成开发环境界面中只包括空的工程管理窗口和输出窗口。
· 图1.6 Keil单片机模拟调试软件的集成开发环境
1.5.2 工程(Project)的建立
Keil单片机模拟调试软件对MCS51单片机应用系统的软件开发过程采用工程(Project)管理。工程保存着程序编辑的信息和程序调试的环境。在开始编写程序之前首先应该建立一个工程。新建一个工程之前通常还需要建立一个文件夹,后面产生的工程文件和源程序文件等都将存储在这个文件夹之中。
在如图1.6所示的集成开发环境的窗口中选择Project →New Project命令将打开建立新工程的对话框,如图1.7所示。
· 图1.7 建立新工程的对话框
在“保存在”下拉列表框中选择新建工程将要存储的文件夹名,在 “文件名”文本框中输入工程的名称,注意对于工程不要添加扩展名,单击“保存”按钮即可完成一个工程的创建。
单击“保存”按钮在完成一个工程创建的同时也打开了单片机芯片型号选择对话框。如图1.8所示的对话框已经完成了芯片型号的选择。
· 图1.8 单片机芯片型号选择对话框
Keil单片机模拟调试软件支持许多公司生产的MCS51单片机兼容产品。如前所述,本书应用电路中采用Atmel公司的AT89S51芯片,下面以这款芯片为例介绍如何实现选择。
在图1.8所示的对话框中的Data base列表框中首先选择生产芯片的公司名称Atmel,双击这个公司名称即可打开Atmel公司目前生产的所有芯片型号。接着在列出的产品清单中选择将使用的AT89S51芯片,如图1.8所示。最后单击“确定”按钮即可完成芯片的 选择。
完成芯片的选择后又回到如图1.6所示的集成开发环境的窗口,但是这时该窗口中的工程管理窗口不再是空白,在它的文件选项卡中出现目录列表Target 1和它的子目录Source Group 1。
集成开发环境中的菜单Project内还包含Open Project和Close Project等选项。Open Project选项用来以后再次进入已经建立的工程,选择Project→Open Project命令将打开选择工程的对话框,该对话框与图1.7类似。在 “查找范围”下拉列表框中选择欲打开的工程所在的文件夹,列表框中将出现该文件夹中的所有工程,选择将要打开的工程,单击“打开”按钮即可打开一个工程。选择Project→Close Project命令将关闭当前的工程。
Keil单片机模拟调试软件内集成了一个文本编辑器,用该文本编辑器可以编辑源程序。在如图1.6所示的集成开发环境中选择File → New命令、单击新建工具按钮或者按快捷键Ctrl+N将打开一个新的文本编辑窗口,如图1.9所示。在图1.9中已经完成了汇编语言源文件的输入,并且完成了源程序向当前工程的添加。
· 图1.9 Keil单片机模拟调试软件的集成开发环境
完成汇编语言源文件的输入后,在集成开发环境中选择File→Save As命令可以完成文件的第一次存储。注意,汇编语言源文件的扩展名应该是ASM,它应该与工程文件存储在同一文件夹内。在完成文件的第一次存储后,当对汇编语言源文件又进行了修改,再次存储文件时则应该选择File→Save命令、单击保存工具按钮或者按快捷键Ctrl+S实现文件的保存。
接着需要把汇编语言源文件加入工程之中。选择图1.9中的工程管理器窗口的子目录Source Group 1,再单击鼠标右键打开快捷菜单。在快捷菜单中选择Add File to Group “Source Group 1”,加入文件对话框被打开。在这个对话框的“查找范围”下拉列表框中选择存储汇编语言源文件的文件夹,在“文件类型”下拉列表框中选择Asm Source file(*.a*;*.src),这时存储的汇编语言源文件将显示出来。双击要加入的文件名,或者选择要加入的文件名再单击Add按钮即可完成把汇编语言源文件加入工程。文件加入以后,加入文件对话框并不消失,更多的文件也可以利用它加入工程。如果不需要加入其他文件,单击Close按钮可以关闭加入文件对话框。这时工程管理窗口的文件选项卡中子目录Source Group 1下出现一个汇编语言源文件,如图1.9所示。
需要注意的是,当把汇编语言源文件加入工程但还没有关闭加入文件对话框时,有可能被误认为文件没有成功地加入工程而再次进行加入操作,系统将显示所需的文件已经加入的提示。在这种情况下,单击提示框中的“确定”按钮,再单击Close按钮可以关闭加入文件对话框。
最好的学习编写程序的方法就是从编写真实的、可以运行的程序开始。在图1.9显示的集成开发环境的编辑工作区中已经输入了一段汇编语言源程序。这段程序是一段小程序,但它却充分说明了汇编语言源程序由什么构成。下面列出这段汇编语言源程序。
程序示例1.1:
ORG 0000H ;定位源程序在程序存储空间的存储起始地址
BEGIN: MOV R0, #01H ;向工作寄存器R0送入数据01H
MOV 00H, #02H ;向内部数据存储器的00H地址单元送入数据02H
MOV 02H, #03H ;向内部数据存储器的02H地址单元送入数据03H
MOV A, R0 ;把工作寄存器R0内的数据复制到累加器A
MOV A, @R0 ;把以工作寄存器R0内的数据为地址的内部数据存储器
;对应的地址单元内的数据复制到累加器A
AJMP BEGIN ;转到语句标号BEGIN所对应的指令处执行
END ;源程序结束
程序示例1.1的第1条语句是:
ORG 0000H
这条语句是一条伪指令,即程序被汇编后不会产生可执行的指令代码。伪指令可以参考本书后面附录B列出的MCS51单片机汇编器伪指令。伪指令ORG用来定位指令代码在程序存储空间的位置。由于单片机复位后程序指针PC=0000H,即指令从程序存储空间的0000H地址开始执行,因此汇编语言源程序的第1句必须是:
ORG 0000H
指令代码没有必要在程序存储空间连续放置,所以除第1句外,可以使用ORG指令把其余的指令代码放置于程序存储空间的任意地方。紧跟着ORG指令后面的汇编语言语句产生的指令代码将位于ORG指令后面的程序存储空间地址,再后面的汇编语言语句产生的指令代码将紧跟在它的后面连续地在程序存储空间中放置。
第2条语句的开头是:
BEGIN:
它被称为语句标号。语句标号可以由字母、数字和下划线组成,但是必须以字母开始。语句标号以冒号结束。应该注意,语句标号不能使用一些保留字,这些保留字包括寄存器名和下面将要提到的汇编指令名称等。
语句标号用来为跳转等语句指出相对地址,绝对地址由汇编语言源程序被汇编成指令代码时产生。使用语句标号简化了涉及跳转等语句的程序编写。语句标号的使用使得当源程序被调整后也不需要通过手工对相应的地址进行相应的改变。
程序示例1.1中出现了两种汇编语言指令,即MOV和AJMP。关于MCS51单片机的汇编语言指令系统可参见附录A。
MOV指令的功能是数据传送,它的指令格式为:
MOV 目标地址, 源地址
MOV指令的作用空间为内部数据存储器的256字节,该指令不能用来访问外部数据存储器。进入数据存储空间的方法称为寻址方式,换句话说就是如何寻找参与操作的数据。MCS51单片机的汇编语言指令系统具有7种寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、相对寻址、变址寻址和位寻址。下面仅对程序示例1.1中出现的寻址方式进行介绍。
程序示例1.1中显示的第2条语句为:
MOV R0,#01H
这句的功能是向工作寄存器R0赋值为01H的数据。语句中包含两种寻址方式。语句在源地址的位置是一个具体的操作数据,当汇编语言指令中有具体的操作数据则被称为立即寻址,这个数据也被称为立即数。立即数由“#”符号开始,它可以采用十六进制数(后缀H)、十进制数(无后缀)和二进制数(后缀B)来表示。
该语句的目标地址为工作寄存器R0,访问工作寄存器的寻址方式称为寄存器寻址。寄存器寻址可以使用当前工作寄存器组中R0~R7的任意一个工作寄存器。
MCS51单片机的数据宽度为8位,用十六进制格式进行描述,数据则具有两位。语句中出现的十六进制数的高位不能是字母。如果高位是字母,则字母前应加一个“0”,例如要把立即数F6H送入工作寄存器R0,则应写为:
MOV R0,#0F6H
程序示例1.1中的第3条语句是:
MOV 00H, #02H
注意这一句的目标地址。这里的00H表示地址,直接给出数据存储器地址的寻址方式称为直接寻址。注意00H和#02H的区别,前者表示一个地址,后者表示一个立即数。如果地址的最高位是字母,则字母前也应加一个“0”。
程序示例1.1中的第6条语句是:
MOV A, @R0
这一句源地址的寻址方式采用了寄存器间接寻址,它的功能为把以工作寄存器R0的内容为地址的存储单元内的内容复制到累加器A。注意只有工作寄存器R0和R1可以用于寄存器间接寻址。
在程序示例1.1中,汇编语言源程序语句后面存在被称为注释的程序说明。注释由分号“;”开始,直到本行结束。注释可以与某条语句同行,也可以独立成行。
使用注释的目的是方便程序阅读。切忌有这样的想法:我是程序的惟一阅读