介紹
INTEL公司將MCS51的核心技術授權給了很多其它公司,所以有很多公司在做以8051為核心的單片機,當然,功能或多或少有些改變,以滿足不同的需求,其中89C51就是這幾年在我國非常流行的
單片機,它是由美國
ATMEL公司開發生產的。
基本特性
8位CPU、片內振盪器、4k位元組ROM、128位元組RAM、21個
特殊功能暫存器、32根I/O線、可定址的64k位元組
外部數據、程式存貯空間、2個16位定時器、計數器中斷結構:具有二個
優先權、五個
中斷源、一個
全雙工串列口、
位定址(即可尋找某位的內容)功能,適於按位進行
邏輯運算的位處理器。除128位元組RAM、4k位元組ROM和中斷、串列口及定時器模組外,還有4組I/O口P0~P3,餘下的就是CPU的全部組成。把4kROM換為
EEPROM就是8751的結構,如去掉ROM/EEPROM部分即為8031,如果將ROM置換為Flash
存貯器或EEPROM,或再省去某些
I/O,即可得到51系列的派生品種,如
89C51、
AT89C2051等
單片機。單片機各部分是通過內部的匯流排有機地連線起來的。
組成
運算器
運算器以完成二進制的算術/
邏輯運算部件ALU為核心,再加上
暫存器TMP、
累加器ACC、
暫存器B、程式狀態
標誌暫存器PSW及布爾處理器。累加器ACC是一個八位暫存器,它是CPU中工作最頻繁的暫存器。在進行算術、邏輯運算時,累加器ACC往往在運算前暫存一個
運算元(如
被加數),而運算後又保存其結果(如
代數和)。暫存器B主要用於乘法和除法操作。標誌暫存器PSW也是一個八位暫存器,用來存放運算結果的一些特徵,如有無進位、借位等。其每位的具體含意如下所示:
對用戶來講,最關心的是以下四位。
(1)進位標誌CY(PSW.7)。它表示了運算是否有進位(或
借位)。如果操作結果在最高位有進位(加法)或者借位(減法),則該位為1,否則為0。
(2)
輔助進位標誌AC(PSW.6)。又稱半進位標誌,它指兩個八位數運算低四位是否有半進位,即低四位相加(或減)是否進位(或借位),如有AC為1,否則為0。
(3)溢出標誌位OV(PSW.2)。反映帶符號數的運算結果是否有溢出,有溢出時,此位為1,否則為0。
(4)奇偶標誌P(PSW.0)。反映
累加器ACC內容的奇偶性,如果ACC中的運算結果有偶數個1(如11001100B,其中有4個1),則P為0,否則,P=1。
由於PSW存放程式執行中的狀態,故又叫
程式狀態字。
運算器中還有一個按位(bit)進行
邏輯運算的邏輯處理機(又稱布爾處理機)。
控制器
控制器是CPU的神經中樞,它包括定時控制邏輯電路、
指令暫存器、
解碼器、地址指針
DPTR及
程式計數器PC、
堆疊指針SP等。這裡程式計數器PC是由16位暫存器構成的計數器。要單片機執行一個程式,就必須把該程式按順序預先裝入
存儲器ROM的某個區域。單片機動作時應按順序一條條取出指令來加以執行。因此,必須有一個電路能找出指令所在的單元地址,該電路就是程式計數器PC。當單片機開始執行程式時,給PC裝入第一條指令所在地址,它每取出一條指令(如為多位元組指令,則每取出一個指令位元組),PC的內容就自動加1,以指向下一條指令的地址,使指令能
順序執行。只有當程式遇到
轉移指令、
子程式調用指令,或遇到中斷時(後面將介紹),PC才轉到所需要的地方去。8051 CPU指定的地址,從ROM相應單元中取出指令位元組放在
指令暫存器中暫存,然後,指令暫存器中的指令代碼被
解碼器譯成各種形式的
控制信號,這些信號與單片機
時鐘振盪器產生的
時鐘脈衝在定時與控制電路中相結合,形成按一定時間節拍變化的電平和時鐘,即所謂控制信息,在CPU內部協調暫存器之間的數據傳輸、運算等操作。
存儲器
存儲器是單片機的又一個重要組成部分,每個
存儲單元對應一個地址,如256個單元共有256個地址,用兩位16進制數表示,即存儲器的地址(00H~FFH)。存儲器中每個存儲單元可存放一個八位
二進制信息,通常用兩位16進制數來表示,這就是存儲器的內容。存儲器的存儲單元地址和存儲單元的內容是不同的兩個概念,不能混淆。
程式存儲器
(1)
程式存儲器 程式是控制計算機動作的一系列命令,單片機只認識由“0”和“1”代碼構成的
機器指令。如用
助記符編寫的命令MOV A,#20H,換成機器認識的代碼74H、20H:(寫成
二進制就是01110100B和00100000B)。在單片機處理問題之前必須事先將編好的程式、表格、常數彙編成機器代碼後存入單片機的
存儲器中,該存儲器稱為程式存儲器。程式存儲器可以放在片內或片外,亦可片內片外同時設定。由於
PC程式計數器為16位,使得程式存儲器可用16位二進制地址,因此,內外存儲器的地址最大可從0000H到FFFFH。8051內部有4k位元組的ROM,就占用了由0000H~0FFFH的最低4k個位元組,這時片外擴充的程式存儲器地址編號應由1000H開始,如果將8051當做8031使用,不利用片內4kROM,全用片外存儲器,則地址編號仍可由0000H開始。不過,這時應使8051的第31腳(即EA腳)保持低電平。當EA為高電平時,用戶在0000H至0FFFH範圍內使用內部ROM,大於0FFFH後,單片機CPU自動訪問外部
程式存儲器。
數據存儲器
(2)數據
存儲器 單片機的數據存儲器由
讀寫存儲器RAM組成。其最大容量可擴展到64k,用於存儲實時輸入的數據。8051內部有256個單元的內部數據存儲器,其中00H~7FH為內部隨機存儲器RAM,80H~FFH為專用暫存器區。實際使用時應首先充分利用內部存儲器,從使用角度講,搞清內部數據存儲器的結構和地址分配是十分重要的。因為將來在學習
指令系統和程式設計時會經常用到它們。8051內部數據存儲器地址由00H至FFH共有256個位元組的
地址空間,該空間被分為兩部分,其中內部數據RAM的地址為00H~7FH(即0~127)。而用做
特殊功能暫存器的地址為80H~FFH。在此256個位元組中,還開闢有一個所謂“位地址”區,該區域內不但可按位元組定址,還可按“位(bit)”定址。對於那些需要進行位操作的數據,可以存放到這個區域。從00H到1FH安排了四組
工作暫存器,每組占用8個RAM位元組,記為R0~R7。究竟選用那一組暫存器,由
程式狀態字PSW中的RS1和RS0來選用。在這兩位上放入不同的
二進制數,即可選用不同的
暫存器組。
特殊功能暫存器
(3)
特殊功能暫存器 特殊功能暫存器(
SFR)的地址範圍為80H~FFH。在MCS-51中,除
程式計數器PC和四個
工作暫存器區外,其餘21個特殊功能暫存器都在這SFR塊中。其中5個是雙位元組暫存器,它們共占用了26個位元組。特殊功能暫存器反映了8051的狀態,實際上是8051的狀態字及控制字暫存器。用於CPU PSW便是典型一例。這些特殊功能暫存器大體上分為兩類,一類與晶片的引腳有關,另一類作片內功能的控制用。與晶片引腳有關的特殊功能暫存器是P0~P3,它們實際上是4個八位
鎖存器(每個
I/O口一個),每個鎖存器附加有相應的輸出驅動器和輸入緩衝器就構成了一個並行口。MCS-51共有P0~P3四個這樣的並行口,可提供32根I/O線,每根線都是雙向的,並且大都有第二功能。其餘用於晶片控制的暫存器中。
指令系統
(2)
暫存器定址:運算元放在暫存器中,在指令中直接以暫存器的名來表示運算元地址。如MOV A,R0就屬於
暫存器定址,即R0暫存器的內容送到
累加器A中。
(3)
直接定址:運算元放在
單片機的內部RAM某單元中,在指令中直接寫出該單元的地址。如前例的ADD A,70H中的70H。
(4)
暫存器間接定址:
運算元放在RAM某個單元中,該單元的地址又放在
暫存器R0或R1中。 如果RAM的地址大於256,則該地址存放在16位暫存器
DPTR(數據
指針)中,此時在暫存器名前加@符號來表示這種
間接定址。如MOV A,@ R0。
(5)
變址定址:指定的
變址暫存器的內容與指令中給出的
偏移量相加,所得的結果作為運算元的地址。如MOVC A,@A+DPTR
(6)
相對定址:由
程式計數器中的基地址與指令中提供的偏移量相加,得到的為運算元的地址。如SJMP rel
(7)
位定址:運算元是
二進制中的某一位,其位地址出現在指令中。如SETB bit
算術運算指令
1.ADD A,Rn 將
累加器與暫存器的內容相加,結果存回累加器
2.ADD A,direct 將累加器與直接地址的內容相加,結果存回累加器
3.ADD A,@Ri 將累加器與間接地址的內容相加,結果存回累加器
4.ADD A,#data 將累加器與常數相加,結果存回累加器
5.ADDC A,Rn 將累加器與暫存器的內容及進位C相加,結果存回累加器
6.ADDC A,direct 將
累加器與直接地址的內容及進位C相加,結果存回累加器
7.ADDC A,@Ri 將累加器與間接地址的內容及進位C相加,結果存回累加器
8.ADDC A,#data 將累加器與常數及進位C相加,結果存回累加器
9.SUBB A,Rn 將累加器的值減去
暫存器的值減借位C,結果存回累加器
10.SUBB A,direct 將累加器的值減直接地址的值減借位C,結果存回累加器
11.SUBB A,@Ri 將累加器的值減間接地址的值減借位C,結果存回累加器
12.SUBB A,#data 將
累加器的值減常數值減借位C,結果存回累加器
13.INC A 將累加器的值加1
14.INC Rn 將暫存器的值加l
15.INC direct 將直接地址的內容加1
16.INC @Ri 將間接地址的內容加1
說明:將16位的
DPTR加1,當DPTR的低位元組(DPL)從FFH溢出至00H時,會使高位元組(DPH)加1,不影響任何標誌位
18.DEC A 將累加器的值減1
19.DEC Rn 將暫存器的值減1
20.DEC direct 將直接地址的內容減1
21.DEC @Ri 將間接地址的內容減1
22.MUL AB 將
累加器的值與B暫存器的值相乘,乘積的低位
位元組存回累加器,高位位元組存回B暫存器
說明:將累加器A和暫存器B內的
無符號整數相乘,產生16位的積,低位位元組存入A,高位位元組存入B暫存器。如果積大於FFH,則溢出標誌位(OV)被設定為1,而進位標誌位為0
23.DIV AB 將累加器的值除以B
暫存器的值,結果的商存回累加器,
餘數存回B暫存器
說明:無符號的除法運算,將累加器A除以B暫存器的值,商存入A,餘數存入B。執行本指令後,進位位(C)及
溢出位(OV)被清除為0
若(A) 3-0>9或(AC)=1,則(A) 3-0←(A)3-0+6
若(A) 7-4>9或(C)=1,則(A) 7-4←(A)7-4+6
25.ANL A,Rn 將累加器的值與暫存器的值做AND的邏輯判斷,結果存回累加器
26.ANL A,direct 將累加器的值與直接地址的內容做AND的邏輯判斷,結果存回累加器
27.ANL A,@Ri 將
累加器的值與間接地址的內容做AND的邏輯判斷,結果存回累加器
28.ANL A,#data 將累加器的值與常數做AND的邏輯判斷,結果存回累加器
29.ANL direct,A 將直接地址的內容與累加器的值做AND的邏輯判斷,結果存回該直接地址
30.ANL direct,#data 將直接地址的內容與常數值做AND的邏輯判斷,結果存回該直接地址
31.ORL A,Rn 將累加器的值與暫存器的值做OR的邏輯判斷,結果存回累加器
32.ORL A,direct 將累加器的值與直接地址的內容做OR的邏輯判斷,結果存回
累加器33.ORL A,@Ri 將累加器的值與間接地址的內容做OR的邏輯判斷,結果存回累加器
34.ORL A,#data 將累加器的值與常數做OR的邏輯判斷,結果存回累加器
35.ORL direct,A 將直接地址的內容與累加器的值做OR的邏輯判斷,結果存回該直接地址
36.ORL direct,#data 將直接地址的內容與常數值做OR的邏輯判斷,結果存回該直接地址
37.XRL A,Rn 將累加器的值與暫存器的值做XOR的邏輯判斷,結果存回累加器
38.XRL A,direct 將
累加器的值與直接地址的內容做XOR的邏輯判斷,結果存回累加器
39.XRL A,@Ri 將累加器的值與間接地扯的內容做XOR的邏輯判斷,結果存回累加器
40.XRL A,#data 將累加器的值與常數作XOR的邏輯判斷,結果存回累加器
41.XRL direct,A 將直接地址的內容與累加器的值做XOR的邏輯判斷,結果存回該直接地址
42.XRL direct,#data 將直接地址的內容與常數的值做XOR的邏輯判斷,結果存回該直接地址
43.CLR A 清除累加器的值為0
45.RL A將累加器的值左移一位
46.RLC A 將累加器含進位C左移一位
47.RR A 將累加器的值右移一位
48.RRC A 將累加器含進位C右移一位
49.SWAP A 將累加器的高4位與低4位的內容交換。(A)3-0←(A)7-4
數據轉移指令
51.MOV A,direct 將直接地址的內容載入累加器
52.MOV A,@Ri 將間接地址的內容載入累加器
54.MOV Rn,A 將累加器的內容載入暫存器
55.MOV Rn,direct 將直接地址的內容載入暫存器
56.MOV Rn,gdata 將常數載入暫存器
57.MOV direct,A 將累加器的內容存入直接地址
58.MOV direct,Rn 將暫存器的內容存入直接地址
59.MOV direct1, direct2將直接地址2的內容存入直接地址1
60.MOV direct,@Ri將間接地址的內容存入直接地址
61.MOV direct,#data將常數存入直接地址
62.MOV @Ri,A將
累加器的內容存入某間接地址
63.MOV @Ri,direct 將直接地址的內容存入某間接地址
64.MOV @Ri,#data 將常數存入某間接地址
65.MOV DPTR,#data16 將16位的常數存入數據
指針暫存器
66.MOVC A,@A+DPTR 1 2 (A) ←((A)+(
DPTR))
累加器的值再加數據指針暫存器的值為其所指定地址,將該地址的內容讀入累加器
67.MOVC A,@A+PC 1 2 (PC)←(PC)+1;(A)←((A)+(PC))
累加器的值加
程式計數器的值作為其所指定地址,將該地址的內容讀入累加器
68.MOVX A,@Ri 將間接地址所指定外部
存儲器的內容讀入累加器(8位地址)
69.MOVX A,@DPTR 將數據
指針所指定外部存儲器的內容讀入累加器(16位地址)
70.MOVX @Ri,A 將累加器的內容寫入間接地址所指定的外部存儲器(8位地址)
71.MOVX @
DPTR,A 將累加器的內容寫入數據指針所指定的外部存儲器(16位地址)
72.PUSH direct 將直接地址的內容壓入
堆疊區
73.POP direct 從堆疊彈出該直接地址的內容
75.XCH A,direct 將累加器的值與直接地址的內容互換
76.XCH A,@Ri 將累加器的值與間接地址的內容互換
77.XCHD A,@Ri 將累加器的低4位與間接地址的低4位互換
布爾代數運算
78.CLR C 清除進位C為0
79.CLR bit 清除直接地址的某位為0
80.SETB C 設定進位C為1
81.SETB bit 設定直接地址的某位為1
82.CPL C 將進位C的值反相
83.CPL bit 將直接地址的某位值反相
84.ANL C,bit 將進位C與直接地址的某位做AND的邏輯判斷,結果存回進位C
85.ANL C,/bit 將進位C與直接地址的某位的反相值做AND的邏輯判斷,結果存回進位C
86.ORL C,bit將進位C與直接地址的某位做OR的邏輯判斷,結果存回進位C
87.ORL C,/bit 將進位C與直接地址的某位的反相值做OR的邏輯判斷,結果存回進位C
88.MOV C,bit 將直接地址的某位值存入進位C
89.MOV bit,C 將進位C的值存入直接地址的某位
90.JC rel若進位C=1則跳至rel的相關地址
91.JNC rel 若進位C=0則跳至rel的相關地址
92.JB bit,rel 若直接地址的某位為1,則跳至rel的相關地址
93.JNB bit,rel 若直接地址的某位為0,則跳至rel的相關地址
94.JBC bit,rel 若直接地址的某位為1,則跳至rel的相關地址,並將該位值清除為0
程式跳躍
95.ACALL addr11 調用2K
程式存儲器範圍內的子程式
96.LCALL addr16 調用64K程式存儲器範圍內的
子程式97.RET 從子程式返回
98.RETI 從中斷子程式返回
99.AJMP addr11 絕對跳躍(2K內)
100.LJMP addr16 長跳躍(64K內)
101.SJMP rel 短跳躍(2K內)-128~+127位元組
102.JMP @A+DPTR 跳至
累加器的內容加數據
指針所指的相關地址
103.JZ rel累加器的內容為0,則跳至rel所指相關地址
104.JNZ rel累加器的內容不為0,則跳至rel所指相關地址
105.CJNE A,direct,rel 將累加器的內容與直接地址的內容比較,不相等則跳至rel所指的相關地址
106.CJNE A,#data,rel 將
累加器的內容與常數比較,若不相等則跳至rel所指的相關地址
107.CJNE @Rn,#data,rel 將暫存器的內容與常數比較,若不相等則跳至rel所指的相關地址
108.CJNE @Ri,#data,rel 將間接地址的內容與常數比較,若不相等則跳至rel所指的相關地址
109.DJNZ Rn,rel 將暫存器的內容減1,不等於0則跳至rel所指的相關地址
110.DJNZ direct,rel 將直接地址的內容減1,不等於0則跳至rel所指的相關地址
111.NOP 無動作