关于郭天祥单片机书上第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控制寄存器