特殊功能寄存器是80C51單片機中各功能部件對應的寄存器,用于存放相應功能部件的控制命令,狀態(tài)或數據。
它是80C51單片機中最具有特色的部分,幾乎所有80C51系列功能的增加和擴展都是通過增加特殊功能寄存器來達到目的的。英文縮寫為SFR,是Special Function Register(特殊功能寄存器)的縮寫。
SFR也是一種擴充數據類型,占用一個內存單元,值域為0~255。利用它可以訪問51單片機內部的所有特殊功能寄存器。如用sfr P1=0x90這一句定P1為P1端口在片內的寄存器,在后面的語句中我們可以用P1=255(對P1端口的所有引腳置高電平)之類的語句來操作特殊功能寄存器。
SFR的地址空間為80H~FFH,但是僅有21個(80C51子系列)或26個(80C52子系列)字節(jié)作為特殊功能寄存器離散分布在這128個字節(jié)范圍內,其余字節(jié)無定義,用戶也不能對這些單元進行讀/寫操作。
在匯編語言程序設計中,比較常用的寄存器有累加器ACC、寄存器B、程序狀態(tài)寄存器PSW、堆棧寄存器SP和數據指針寄存器DPTR。下面簡要介紹這些寄存器。
(1)累加器A(Accumulator)
累加器A的名稱是ACC,是指令中用的最多的寄存器,特別是很多算術邏輯運算指令必須使用該寄存器。需要注意的是,ACC和A都可以在指令中代表累加器A,但是指令中的ACC能代表累加器的字節(jié)地址,而A則不能。因此,在某些要求使用特殊功能寄存器地址的指令中,不能用A表示累加器。
(2)寄存器B
乘、除法指令必須使用寄存器B。除此之外,B與其他特殊功能寄存器沒有差別。(3)程序狀態(tài)寄存器PSW
PSW(見表2-6)可以記錄指令的執(zhí)行結果狀態(tài),比如:加法運算是否產生進位、借位等。PSW中各位的作用如下:
CY:進位標志位,當運算過程中累加器的最高位產生進位或借位時,被置為1,否則被清0。在位操作指令和移位指令中,該位起到類似于累加器A的作用,參與位操作或位運算。
AC:輔助進位標志位,在加、減運算過程中,運算結果的低4位(第3位)向高4位(第4位)產生進位時,該位被置1,否則被清0。
OV:溢出標志位,用于反映有符號數計算過程中是否溢出,0:無溢出,1:有溢出。
F0和F1:F0為用戶定義標志位,供用戶使用,沒有特殊含義;F1為保留位,用戶不能使用。
RS1和RS0:用于選擇CPU當前使用的工作寄存器區(qū)子區(qū),見表2-4。
P:奇偶標志位,反映累加器A中“1”的個數的奇偶性,若“1”的個數為偶數,則P為0,反之,P為1。每條指令執(zhí)行后,單片機都會自動檢測累加器A,并設置P標志位。
(4)堆棧寄存器SP
堆棧在片內RAM區(qū)中用于存放數據。堆棧操作有寫和讀兩種,將數據存入堆棧稱為“入?!保瑥亩褩V凶x取數據稱為“出?!?,入棧、出棧必須遵循“先入后出,后入先出”的原則。所有堆棧操作之前,SP中存放的數值作為一個特殊的地址,該地址指向的字節(jié)存儲單元被稱為“棧底”。堆棧操作后,SP中的地址所指向的存儲單元是“棧頂”。
(5)數據指針寄存器DPTR
數據指針寄存器DPTR是一個16位寄存器,包含兩個8位寄存器DPH和DPL。訪問片外ROM、片外RAM和片外I/O接口時,DPTR可在指令中提供地址。
(6)P0~P3寄存器
P0~P3是單片機的4個8位并行I/O口,表2-2和表2-3中的特殊功能寄存器P0~P3是這4個并行I/O口的端口寄存器。通過這幾個寄存器可以讀取或設置對應的單片機引腳狀態(tài)。
(7)其他寄存器
單片機內還有其他一些寄存器,如PCON、SBUF、SCON和TMOD等,與單片機內的硬件接口有關。