MCS51

MCS51

MCS51是指由美國INTEL公司生產的一系列單片機的總稱,這一系列單片機包括了好些品種,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的產品,該系列其它單片機都是在8051的基礎上進行功能的增、減、改變而來的,所以人們習慣於用8051來稱呼MCS51系列單片機,而8031是前些年在我國最流行的單片機,所以很多場合會看到8031的名稱。

介紹


MCS51
MCS51
司核技術授權司,司核單片,,功改,足需求,非流單片,司產。

基本特性


MCS51單片機構基:
、片振蕩器、節、節、特殊功能寄存器、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線,每根線都是雙向的,並且大都有第二功能。其餘用於晶元控制的寄存器中。

指令系統


MCS51的指令系統
MCS-51共有7種定址方式,現介紹如下:
(1)立即定址:操作數就寫在指令中,和操作碼一起放在程序存貯器中。把“#”號放在立即數前面,以表示該定址方式為立即定址,如mov A,#20H。
(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
MCS51的指令系統按功能分有:數據傳送類、轉移指令、算術運算類、邏輯運算類、和十進位指令及一些偽指令共111個。詳細說明如下:
算術運算指令
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
17.INC DPTR 數據指針寄存器值加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
24.DA A 將累加器A作十進位調整,
若(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
44.CPL A 將累加器的值反相
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
數據轉移指令
50.MOV A,Rn 將寄存器的內容載入累加器
51.MOV A,direct 將直接地址的內容載入累加器
52.MOV A,@Ri 將間接地址的內容載入累加器
53.MOV A,#data 將常數載入累加器
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 從堆棧彈出該直接地址的內容
74.XCH A,Rn 將累加器的內容與寄存器的內容互換
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 無動作