關於郭天祥單片機書上第68頁89C52內部寄存器地址及位地址
此處的位地址不是單片機內部寄存器上的地址【藍線標示的】,而是將0xA8這個地址展開後,在上面進行位偏移(bit offset)的結果。
爲什麼要展開呢?我們之前在52reg.h頭文件中使用sfr關鍵字將特殊寄存器展開以方便使用每個特殊功能寄存器,至此,我們的IE寄存器中又有8個特殊功能的位,所以我們又要將這8個位展開,已方便使用指定的特殊位。
【
我們可從附錄二中推出以上論斷的正確性:
地址號爲0XAF的寄存器功能爲IE2(中斷允許寄存器2)
位地址爲0XAF的功能是EA(中斷允許寄存器1的全局中斷允許位)
】
附錄一中的IE寄存器位展開之後。
附錄二中也將52單片機中幾乎所有寄存器全部展開,這個頭文件的風格值得我們學習,我們也要將經常使用的寄存器,位地址定義成我們最喜歡的名稱。
附錄一
SFR |
MSB 位地址/位定義 LSB |
字節地址 |
|||||||
B |
F7 |
F6 |
F5 |
F4 |
F3 |
F2 |
F1 |
F0 |
F0H |
|
|
|
|
|
|
|
|
||
ACC |
E7 |
E6 |
E5 |
E4 |
E3 |
E2 |
E1 |
E0 |
E0H |
|
|
|
|
|
|
|
|
||
PSW |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
D0H |
CY |
AC |
F0 |
RS1 |
RS0 |
OV |
F1 |
P |
||
IP |
BF |
BE |
BD |
BC |
BB |
BA |
B9 |
B8 |
B8H |
— |
— |
— |
PS |
PT1 |
PX1 |
PT0 |
PX0 |
||
P3 |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
B0H |
P3.7 |
P3.6 |
P3.5 |
P3.4 |
P3.3 |
P3.2 |
P3.1 |
P3.0 |
||
IE |
AF |
AE |
AD |
AC |
AB |
AA |
A9 |
A8 |
A8H |
EA |
— |
— |
ES |
ET1 |
EX1 |
ET0 |
EX0 |
||
P2 |
A7 |
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
A0H |
P2.7 |
P2.6 |
P2.5 |
P2.4 |
P2.3 |
P2.2 |
P2.1 |
P2.0 |
||
SBUF |
|
|
|
|
|
|
|
|
(99H) |
SCON |
9F |
9E |
9D |
9C |
9B |
9A |
99 |
98 |
98H |
SM0 |
SM1 |
SM2 |
REN |
TB8 |
RB8 |
TI |
RI |
||
P1 |
97 |
96 |
95 |
94 |
93 |
92 |
91 |
90 |
90H |
P1.7 |
P1.6 |
P1.5 |
P1.4 |
P1.3 |
P1.2 |
P1.1 |
P1.0 |
||
TH1 |
|
|
|
|
|
|
|
|
(8DH) |
TH0 |
|
|
|
|
|
|
|
|
(8CH) |
TX1 |
|
|
|
|
|
|
|
|
(8BH) |
TX0 |
|
|
|
|
|
|
|
|
(8AH) |
TMOD |
GATE |
C/T |
M1 |
M0 |
GATE |
C/T |
M1 |
M0 |
(89H) |
TCON |
8F |
8E |
8D |
8C |
8B |
8A |
89 |
88 |
88H |
TF1 |
TR1 |
TF0 |
TR0 |
IE1 |
IT1 |
IE0 |
IT0 |
||
PCON |
SMOD |
— |
— |
— |
GF1 |
GF0 |
PD |
IDL |
(87H) |
DPH |
|
|
|
|
|
|
|
|
(83H) |
DPL |
|
|
|
|
|
|
|
|
(82H) |
SP |
|
|
|
|
|
|
|
|
(81H) |
P0 |
87 |
86 |
85 |
84 |
83 |
82 |
81 |
80 |
80H |
P0.7 |
P0.6 |
P0.5 |
P0.4 |
P0.3 |
P0.2 |
P0.1 |
P0.0 |
附錄二
/*--------- 8051內核特殊功能寄存器 -------------*/
sfr ACC = 0xE0; //累加器
sfr B = 0xF0; //B 寄存器
sfr PSW = 0xD0; //程序狀態字寄存器
sbit CY = PSW^7; //進位標誌位
sbit AC = PSW^6; //輔助進位標誌位
sbit F0 = PSW^5; //用戶標誌位0
sbit RS1 = PSW^4; //工作寄存器組選擇控制位
sbit RS0 = PSW^3; //工作寄存器組選擇控制位
sbit OV = PSW^2; //溢出標誌位
sbit F1 = PSW^1; //用戶標誌位1
sbit P = PSW^0; //奇偶標誌位
sfr SP = 0x81; //堆棧指針寄存器
sfr DPL = 0x82; //數據指針0低字節
sfr DPH = 0x83; //數據指針0高字節
/*------------ 系統管理特殊功能寄存器 -------------*/
sfr PCON = 0x87; //電源控制寄存器
sfr AUXR = 0x8E; //輔助寄存器
sfr AUXR1 = 0xA2; //輔助寄存器1
sfr WAKE_CLKO = 0x8F; //時鐘輸出和喚醒控制寄存器
sfr CLK_DIV = 0x97; //時鐘分頻控制寄存器
sfr BUS_SPEED = 0xA1; //總線速度控制寄存器
/*----------- 中斷控制特殊功能寄存器 IE--------------*/
sfr IE = 0xA8; //中斷允許寄存器
sbit EA = IE^7; //總中斷允許位 (位地址爲0XAF)
sbit ELVD = IE^6; //低電壓檢測中斷控制位
sbit EADC = IE^5; //ADC中斷允許控制位
sbit ES = IE^4; //串口1中斷允許位
sbit ET1 = IE^3; //定時器1溢出中斷允許位
sbit EX1 = IE^2; //外部中斷1允許位
sbit ET0 = IE^1; //定時器0溢出中斷允許位
sbit EX0 = IE^0; //外部中斷0允許位
sfr IE2 = 0xAF; //中斷允許寄存器2 (寄存器地址爲0XAF)
sfr IP = 0xB8; //中斷優先級寄存器
sbit PPCA = IP^7; // PCA中斷優先級控制位
sbit PLVD = IP^6; //低電壓檢測中斷優先級控制位
sbit PADC = IP^5; //ADC中斷優先級控制位
sbit PS = IP^4; //串口1中斷優先級控制位
sbit PT1 = IP^3; //定時器1中斷優先級控制位
sbit PX1 = IP^2; //外部中斷1優先級控制位
sbit PT0 = IP^1; //定時器0中斷優先級控制位
sbit PX0 = IP^0; //外部中斷0優先級控制位
sfr IPH = 0xB7; //中斷優先級高位寄存器
sfr IP2 = 0xB5; //第二中斷優先級寄存器低字節
sfr IPH2 = 0xB6; //第二中斷優先級寄存器高字節
/*--------------- I/O 口特殊功能寄存器 -------------------*/
sfr P0 = 0x80; //P0口寄存器
sfr P0M1 = 0x93; //P0口工作模式寄存器1
sfr P0M0 = 0x94; //P0口工作模式寄存器0
sfr P1 = 0x90; //P1口寄存器
sfr P1M1 = 0x91; //P1口工作模式寄存器1
sfr P1M0 = 0x92; //P1口工作模式寄存器0
sfr P1ASF = 0x9D; //P1口模擬量功能設置寄存器
sfr P2 = 0xA0; //P2口寄存器
sfr P2M1 = 0x95; //P2口工作模式寄存器1
sfr P2M0 = 0x96; //P2口工作模式寄存器0
sfr P3 = 0xB0; //P3口寄存器
sbit T1 = P3^5; //定時器1外部輸入
sbit T0 = P3^4; //定時器0外部輸入
sbit INT1 = P3^3; //外部中斷1
sbit INT0 = P3^2; //外部中斷0
sbit TXD = P3^1; //串行輸入通道
sbit RXD = P3^0; //串行輸出通道
sfr P3M1 = 0xB1; //P3口工作模式寄存器1
sfr P3M0 = 0xB2; //P3口工作模式寄存器0
sfr P4 = 0xC0; //P4口寄存器
sfr P4M1 = 0xB3; //P4口工作模式寄存器1
sfr P4M0 = 0xB4; //P4口工作模式寄存器0
sfr P4SW = 0xBB; //P4口功能切換寄存器
sfr P5 = 0xC8; //P5口(只有P5.3 P5.2 P5.1 P5.0)
sfr P5M1 = 0xC9; //P5口工作模式寄存器1
sfr P5M0 = 0xCA; //P5口工作模式寄存器0.
/*----------------- 定時器特殊功能寄存器 -----------------*/
sfr TCON = 0x88; //定時/計數控制寄存器
sbit TF1 = TCON^7; //定時器1溢出中斷標誌
sbit TR1 = TCON^6; //定時器1運行控制位
sbit TF0 = TCON^5; //定時器0溢出中斷標誌
sbit TR0 = TCON^4; //定時器0運行控制位
sbit IE1 = TCON^3; //外部中斷1請求標誌
sbit IT1 = TCON^2; //選擇外部中斷請求1爲邊沿觸發方式的控制位
sbit IE0 = TCON^1; //外部中斷0請求標誌
sbit IT0 = TCON^0; //選擇外部中斷請求0爲邊沿觸發方式的控制位
sfr TMOD = 0x89; //定時/計數模式控制寄存器
sfr TL0 = 0x8A; //定時/計數器0低字節
sfr TH0 = 0x8C; //定時/計數器0高字節
sfr TL1 = 0x8B; //定時/計數器1低字節
sfr TH1 = 0x8D; //定時/計數器1高字節
/*-------------- 串行口特殊功能寄存器 ------------------*/
sfr SCON = 0x98; //串行口控制寄存器
sbit SM0 = SCON^7; //串行口工作方式設定控制位0(與FE功能複用)
sbit FE = SCON^7;
sbit SM1 = SCON^6; //串行口工作方式設定控制位1
sbit SM2 = SCON^5; //UART的SM2設定
sbit REN = SCON^4; //接收允許位
sbit TB8 = SCON^3; //發送數據的第九位
sbit RB8 = SCON^2; //接收數據的第九位
sbit TI = SCON^1; //發送中斷標誌
sbit RI = SCON^0; //接收中斷標誌
sfr SBUF = 0x99; //串口數據緩衝器
sfr SADEN = 0xB9; //從機地址掩碼寄存器
sfr SADDR = 0xA9; //從機地址寄存器
sfr S2CON = 0x9A; //串行口2控制寄存器
sfr S2BUF = 0x9B; //串行口2數據緩衝器
sfr BRT = 0x9C; //獨立波特率定時器
/*---------------- 看門狗定時器寄存器 ------------------*/
sfr WDT_CONTR = 0xC1; //看門狗定時器控制寄存器
/*---------------- PCA 寄存器 -----------------*/
sfr CCON = 0xD8; //PCA控制寄存器
sbit CF = CCON^7; //PCA計數器溢出(CH,CL由FFFFH變爲0000H)標誌
sbit CR = CCON^6; //PCA計數器計數允許控制位
sbit CCF1 = CCON^1; //PCA模塊1中斷標誌
sbit CCF0 = CCON^0; //PCA模塊0中斷標誌
sfr CMOD = 0xD9; //PCA工作模式寄存器
sfr CL = 0xE9; //PCA計數器低8位
sfr CH = 0xF9; //PCA計數器高8位
sfr CCAPM0 = 0xDA; //PAC模塊0的工作模式寄存器
sfr CCAPM1 = 0xDB; //PAC模塊1的工作模式寄存器
sfr CCAP0L = 0xEA; //PAC模塊0捕捉/比較寄存器低8位
sfr CCAP0H = 0xFA; //PAC模塊0捕捉/比較寄存器高8位
sfr CCAP1L = 0xEB; //PAC模塊1捕捉/比較寄存器低8位
sfr CCAP1H = 0xFB; //PAC模塊1捕捉/比較寄存器高8位
sfr PCA_PWM0 = 0xF2; //PCA模塊0 PWM寄存器
sfr PCA_PWM1 = 0xF3; //PCA模塊1 PWM寄存器
/*----------------- ADC 寄存器 -----------------*/
sfr ADC_CONTR = 0xBC; //ADC控制寄存器, 本寄存器不支持位操作
sfr ADC_RES = 0xBD; //ADC轉換結果高8位寄存器
sfr ADC_RESL = 0xBE; //ADC轉換結果低2位寄存器
/*---------------- SPI 寄存器 --------------------*/
sfr SPSTAT = 0xCD; //SPI狀態寄存器,本寄存器不支持位操作
sfr SPCTL = 0xCE; //SPI控制寄存器
sfr SPDAT = 0xCF; //SPI數據寄存器
/*----------------- ISP_IAP_EEPROM 寄存器 ------------------*/
sfr IAP_DATA = 0xC2; //ISP/IAP Flash數據寄存器
sfr IAP_ADDRH = 0xC3; //ISP/IAP Flash地址高字節
sfr IAP_ADDRL = 0xC4; //ISP/IAP Flash地址低字節
sfr IAP_CMD = 0xC5; //ISP/IAP Flash命令寄存器
sfr IAP_TRIG = 0xC6; //ISP/IAP Flash命令觸發器
sfr IAP_CONTR = 0xC7; //ISP/IAP控制寄存器