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。