部落客福利:100G+電子設計學習資源包!
http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5d5d0f15df84f4a92ebf72f88d4ee8&scene=18#wechat_redirect --------------------------------------------------------------------------------------------------------------------------
随着微電子技術的快速發展,以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位寄存器。