AT89C51单片机的主要组成结构
随着微电子技术的快速发展,以ARM为主的32位MCU(微控制器)已普及开来,8位MCU已被很多人认为将被淘汰,更何况其中的老古董MCS-51系列单片机。但从目前的形势来看,8位MCU还牢牢占据着工业控制领域的主导地位,一个原因是8位MCU的开发成本比较低,也有大量的成熟设计方案,还有一个原因是历史的延续,新的产品还处在不断变化中,老产品则是经数十年的淘汰而留存下来的精品。
MCS-51系列单片机正是如此,自1980年由Intel推出后,获得很大成功,并不断改进而形成系列,成为最普遍使用的单片机内核和指令系统。后来,ATMEL、NXP等多家著名半导体公司推出兼容和增强的51系列单片机,应用普遍,因此成为单片机教学的主要示例,熟悉其结构和指令的工程师数量庞大。这几年,随着AVR、PIC等更高性能单片机的推广使用,特别是ARM Cortex-M系列32位MCU价格的持续走低,原来主要以生产51兼容的通用单片机的半导体公司才逐渐淡出市场,但仍有大量以51为内核的计量、无线通信等专用芯片存在。在成本敏感度高的中国市场,以51为内核的STC仍然很受欢迎,看来还要持续一段时间。所以,在今后的一段时间内,51系列单片机还有市场,还有一些人仍要从51开始学习单片机,所以单片机的介绍也要从MSC-51开始。MSC-51系列最典型的型号是ATMEL公司的AT89C51。
一、AT89C51基本描述:
1.AT89C51内核的主要组成结构:
AT89C51是以ALU位中心的8位微控制器(MCU),完成运算和控制功能;内部有128B的数据存储器(内部RAM),地址范围00H~7FH;有21个特殊功能寄存器,在内部RAM的SFR块中(又称专用寄存器),离散分布于地址80H~FFH中。计数器PC,是一个独立的16位专用寄存器,其内容为将要执行的指令地址(程序存储器地址)。
51系列单片机在存储器配置上采用“哈佛”结构,即物理上具有独立的程序寄存器和数据寄存器,但逻辑上采用相同的地址空间,利用不同的指令和寻址方式进行访问。AT89C51内部有4kB FLASH,用来存储程序、原始数据、表格等,称为程序存储器(片内ROM);有4个8位可编程I/O口(P0、P1、P2、P3);一个UART串行通信口;2个16位定时/计数器;5个中断源,两个中断优先级的中断控制系统;一个片内振荡器和时钟电路。
2.AT89C51的主要引脚功能:
GND和Vcc:电源引脚,Vcc接直流电源,5.00V±20%。
RST:复位输入端,此引脚上至少要出现2个机器周期的高电平(12个振荡周期)。
ALE/PROG-:地址锁存允许/编程脉冲,对内部FLASH编程时用于输入编程脉冲。
PSEN-:外部ROM读取选通信号,每个机器周期出现2次有效信号,作为外ROM的OE。
EA-/Vpp:内/外ROM选择及内ROM编程电源,低电平时只访问片外ROM。
3.AT89C51的时钟周期:
当外接12MHz晶振时,振荡周期1/12us、状态时钟周期1/6us、机器周期1us。
4.AT89C51对外部储存器的访问:
当访问外部存储器时,用来锁存P0口输出的低8位地址。即使不访问外部存储器,仍以不变的周期输出信号,频率为振荡频率的1/6。但每当访问外部数据寄存器时,将跳过一个ALE脉冲。
5.AT89C51的复位信号及影响的寄存器:
要实现复位操作,必须使RST引脚至少保持两个机器周期的高电平,再从高电平变为低电平。完成复位后,MCU从ROM中的0000H单元开始执行程序。复位电路常用10uF电容与10k电阻组合。
寄存器 |
复位后内容 |
寄存器 |
复位后内容 |
寄存器 |
复位后内容 |
寄存器 |
复位后内容 |
ACC |
00H |
B |
00H |
PSW |
00H |
SP |
00H |
TL0 |
00H |
TH0 |
00H |
TL1 |
00H |
TH1 |
00H |
DPTR |
0000H |
P0~P3 |
FFH |
SCON |
00H |
TMOD |
00H |
IP |
xxx00000B |
IE |
0xx00000B |
PCON |
0xxx0000B |
TCON |
00H |
SBUF 不定
二、存储器组成:
AT89C51由程序存储器ROM和数据存储器RAM组成。ROM分为片内和片外,片内ROM为4KB,地址范围0000H~0FFFH;片外ROM可扩展到64KB。RAM可分为片内和片外,片内RAM由128B(00H~7FH)的片内数据寄存器和21个特殊功能寄存器(在80H~FFH中)组成;片外RAM可扩展到64KB。
1.程序寄存器ROM:
AT89C51有4KB片内ROM,用于存储编好的程序、表格、常数,简称程序内存。当程序内存不够用时,可扩展片外程序存储器。片内与片外的地址空间是统一编址的,地址范围为0000H~FFFFH,总共64KB。
MCU工作时,只能读取ROM,所以称为只读存储器。MCU复位后,程序计数器PC的内容为0000H,所以系统必须从0000H单元开始取指令并执行程序,用户程序的第1条指令应放置在这里。
片外ROM的低4KB地址与片内ROM重叠,选择由EA-引脚来控制。EA-=0,复位后系统从片外ROM的0000H地址单元开始执行,且只能执行片外ROM中的程序;EA-=1,复位后系统从片内ROM的0000H地址单元开始执行程序,当PC值大于0FFFH时自动转到片外ROM执行程序。
ROM内有5个特殊地址,是MCU的5个中断服务子程序的入口地址,相邻中断入口地址间隔为8个单元。
外中断0 |
0003H |
外中断1 |
0013H |
串口中断 |
0023H |
定时/计数器中断0 |
000BH |
定时/计数器中断1 |
001BH |
|
当程序中使用中断时,一般在这些入口地址放置一条跳转指令,而相应的中断服务程序放于转移地址中。如果中断服务程序不超过8个单元,则可放入相应的入口地址开始的8个单元中。如果没有用到中断功能,这些单元也可作为一般用途的程序存储器。
2.数据存储器RAM:
AT89C51片内数据存储器RAM的容量为128B,地址范围为00H~7FH。使用时可分为4个区,即工作寄存器区、可位寻址区、数据缓冲区和堆栈区。堆栈区的栈底地址复位后默认为07H,可由程序中的指令改变。
字节地址 |
位地址 |
||||||||
7F~~~30 |
数据缓冲区 |
||||||||
2F |
位
寻
址
区 |
7F |
7E |
7D |
7C |
7B |
7A |
79 |
78 |
2E |
77 |
76 |
75 |
74 |
73 |
72 |
71 |
70 |
|
2D |
6F |
6E |
6D |
6C |
6B |
6A |
69 |
68 |
|
2C |
67 |
66 |
65 |
64 |
63 |
62 |
61 |
60 |
|
2B |
5F |
5E |
5D |
5C |
5B |
5A |
59 |
58 |
|
2A |
57 |
56 |
55 |
54 |
53 |
52 |
51 |
50 |
|
29 |
4F |
4E |
4D |
4C |
4B |
4A |
49 |
48 |
|
28 |
47 |
46 |
45 |
44 |
43 |
42 |
41 |
40 |
|
27 |
3F |
3E |
3D |
3C |
3B |
3A |
39 |
38 |
|
26 |
37 |
36 |
35 |
34 |
33 |
32 |
31 |
30 |
|
25 |
2F |
2E |
2D |
2C |
2B |
2A |
29 |
28 |
|
24 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
|
23 |
1F |
1E |
1D |
1C |
1B |
1A |
19 |
18 |
|
22 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
|
21 |
0F |
0E |
0D |
0C |
0B |
0A |
09 |
08 |
|
20 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
|
18~1F |
3组(R0~R7)工作寄存器组 |
||||||||
10~17 |
2组(R0~R7)工作寄存器组 |
||||||||
08~0F |
1组(R0~R7)工作寄存器组 |
||||||||
00~07 |
0组(R0~R7),默认工作寄存器组 |
工作寄存器:片内RAM中最低的32个单元(00H~1Fh)是工作寄存器区,按地址由小到大分为4个组,每个组有8个8位寄存器,地址由低到高依次命名为R0~R7。当前工作寄存器只能有一个组,选用哪个组由PSW中的RS0和RS1位确定,可由指令设置。复位初始化后RS0=0、RS1=0,使用0组,为默认工作寄存器组。
位寻址区:片内RAM中,20H~2FH地址单元构成固定的可位寻址存储区。每个单元有8位,16个单元共128位,每个位都有一个位地址。它们可以位寻址、位操作,即可对该位进行置1、清0、求反操作等。指令系统中有位操作指令。程序中没有位操作时,该区的地址单元可做他用。
数据缓冲区:片内RAM中,30H~7FH地址单元一般可做数据缓冲区,用于存放各种数据和中间结果。没有使用的工作寄存器单元和没有使用的可位寻址单元都可用做数据缓冲区。
堆栈区:是在片内RAM中开辟的一片特殊数据存储器,对堆栈存取数据按“先进后出”原则。用堆栈指针SP指向栈顶地址,堆栈的最低地址叫栈底,对堆栈存取数据时栈顶地址相应变化,即SP的内容相应变化。复位后,栈底地址单元为07H,因为此时堆栈内还未存放数据,堆栈指针SP的内容与栈底值相同,也为07H。可以根据需要设置SP的初值。
3.特殊功能寄存器SFR:
特殊功能寄存器,也称专用寄存器,是MCU各功能部件所对应的寄存器,用来存放相应功能部件的控制命令、状态或数据。AT89C51内的端口锁存器、程序状态字、定时器、累加器、堆栈指针、数据指针,以及其他控制寄存器都是特殊功能寄存器。SFR离散地分布在片内RAM的高128B(80H~FFH)中,共21字节。
SFR符号及名称 |
字节 地址 |
位地址、位标志 |
|||||||
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
||
B:B寄存器 |
F0 |
F7 |
F6 |
F5 |
F4 |
F3 |
F2 |
F1 |
F0 |
B.7 |
B.6 |
B.5 |
B.4 |
B.3 |
B.2 |
B.1 |
B.0 |
||
ACC:累加器 |
E0 |
E7 |
E6 |
E5 |
E4 |
E3 |
E2 |
E1 |
E0 |
ACC.7 |
ACC.6 |
ACC.5 |
ACC.4 |
ACC.3 |
ACC.2 |
ACC.1 |
ACC.0 |
||
PSW程序状态字 |
D0 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
CY |
AC |
F0 |
RS1 |
RS0 |
OV |
- |
P |
||
IP:中断优先级寄存器 |
B8 |
- |
- |
- |
BC |
BB |
BA |
B9 |
B8 |
- |
- |
- |
PS |
PT1 |
PX1 |
PT0 |
PX0 |
||
P3:P3口 |
B0 |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
P3.7 |
P3.6 |
P3.5 |
P3.4 |
P3.3 |
P3.2 |
P3.1 |
P3.0 |
||
IE:中断允许寄存器 |
A8 |
AF |
AE |
AD |
AC |
AB |
AA |
A9 |
A8 |
EA- |
- |
- |
ES |
EY1 |
EX1 |
ET0 |
EX0 |
||
P2:P2口 |
A0 |
A7 |
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
P2.7 |
P2.6 |
P2.5 |
P2.4 |
P2.3 |
P2.2 |
P2.1 |
P2.0 |
||
SBUF:串口数据缓冲寄存器 |
99 |
不可位寻址 |
|||||||
SCON:串口控制寄存器 |
98 |
9F |
9E |
9D |
9C |
9B |
9A |
99 |
98 |
SM0 |
SM1 |
SM2 |
REN |
TB8 |
RB8 |
TI |
RI |
||
P1:P1口 |
90 |
97 |
96 |
95 |
94 |
93 |
92 |
91 |
90 |
P1.7 |
P1.6 |
P1.5 |
P1.4 |
P1.3 |
P1.2 |
P1.1 |
P1.0 |
||
TH1:T1寄存器高8位 |
8D |
不可位寻址 |
|||||||
TH0:T0寄存器高8位 |
8C |
不可位寻址 |
|||||||
TL1:T1寄存器低8位 |
8B |
不可位寻址 |
|||||||
TL0:T0寄存器低8位 |
8A |
不可位寻址 |
|||||||
TMOD:定时/计数器方式寄存器 |
89 |
|
|||||||
GATE |
C/T- |
M1 |
M0 |
GATE |
C/T- |
M1 |
M0 |
||
TCON:定时/计数器控制寄存器 |
88 |
8F |
8E |
8D |
8C |
8B |
8A |
89 |
88 |
TF1 |
TR1 |
TF0 |
TR0 |
IE1 |
IT1 |
IE0 |
IT0 |
||
PCON:电源控制寄存器 |
87 |
|
|||||||
SMOD |
- |
- |
- |
GF1 |
GF0 |
PD |
IDL |
||
DPH:数据指针高8位 |
83 |
不可位寻址 |
|||||||
DPL数据指针低8位 |
82 |
不可位寻址 |
|||||||
SP:栈指针寄存器 |
81 |
不可位寻址 |
|||||||
P0:P0口 |
80 |
87 |
86 |
85 |
84 |
83 |
82 |
81 |
80 |
P0.7 |
P0.6 |
P0.5 |
P0.4 |
P0.3 |
P0.2 |
P0.1 |
P0.1 |
其中地址能被8整除(字节末位为0H或8H)的寄存器既可字节寻址又可位寻址,其他只可字节寻址。可位寻址的特殊寄存器的每一位都有位地址,有的还有位名称、位编号。
ACC:累加器,助记符为A,是一个最为常用的特殊功能寄存器。
B:乘除法指令中要用通用的寄存器,也可做一般寄存器用。
PSW:程序状态字,是一个8位寄存器,用来存放指令执行后的有关状态。各位定义为:
PSW.7 |
PSW.6 |
PSW.5 |
PSW.4 |
PSW.3 |
PSW.2 |
PSW.1 |
PSW.0 |
C |
AC |
F0 |
RS1 |
RS0 |
OV |
- |
P |
C:进位标志,用于表示加减运算过程中累加器最高位有无进位或借位。移位操作也影响。
AC:辅助进位,加减运算时低4位向高4位进位或借位。
F0:用户标志位,是一个供用户定义的标志位。
RS1和RS0:工作寄存器选择位,用于设定当前使用的工作寄存器的组号。
OV:溢出标志,指示运算过程是否发生了溢出。
P:奇偶标志位,表明累加器A中“1”的个数的奇偶性,奇数置1,偶数置0。
SP:堆栈指针。系统复位后初始化为07H,数据从08H开始存放,这里属于工作寄存器组1~3,如果程序设计中要用到,就要把SP设置为1FH或更大。MCU调用子程序或响应中断时,自动发生数据的入栈、出栈操作,还有对堆栈操作的指令。
SBUF:串行数据缓冲器,实际上有发送缓冲器和接收缓冲器两个独立的寄存器。
TH0/TL0和TH1/TL1:分别是定时/计数器的16位计数寄存器,也可单独作4个8位寄存器。
4.片外RAM:
片内RAM不够用时,可扩展片外RAM,最大范围0000H~FFFFH,共64KB。片外RAM与片内RAM有部分地址重叠,但操作片内RAM和片外RAM用不同的指令,片内用MOV,片外用MOVX。