MCS51单片机寄存器简介
最近马上要考试51单片机了,借着这个机会梳理了一下51单片机的各个寄存器以及我个人常弄混淆的一些东西.
管脚
| 名称 |
描述 |
| PSEN |
ROM选通信号 |
| EA |
=0 只访问片外ROM |
| ALE |
地址锁存器信号 |
| RESET |
2机器周期高电平复位 |
| XTAL1 |
crystal oscillator |
一共40脚 32个IO 注意P1可以驱动4个LSTTL,其他为8个
P3口第二功能
| 管脚 |
功能 |
| P3.0 |
RXD |
| P3.1 |
TXD |
| P3.2 |
INT0 |
| P3.3 |
INT1 |
| P3.4 |
T0 |
| P3.5 |
T1 |
| P3.6 |
WR |
| P3.7 |
RD |
内存
| 地址 |
说明 |
| 00H~07H |
第0工作区 |
| 08H~0FH |
第1工作区 |
| …… |
……. |
| 20H~2FH |
可位寻址区 |
| 30H~7FH |
用户RAM区 |
| 80H~FFH |
SFR |
上电建议将SP改成60H避免冲突
注意事项
寄存器
注意 SP复位值为07H(越过第0工作组寄存器区),IO复位是FFH,其他的都是0
PCON 电源控制寄存器 (不可位寻址)
| 位 |
名称 |
说明 |
| D0 |
IDL |
空闲模式 |
| D1 |
PD |
掉电模式 |
| D2 |
GF0 |
用户标志位 |
| D3 |
GF1 |
用户标志位 |
| D7 |
SMOD |
波特率倍频 |
TCON 定时器控制寄存器/中断
| 位 |
名称 |
说明 |
| D0 |
IT0 |
外部中断0触发方式=0电平触发 |
| D1 |
IE0 |
外部中断0标志位,自动清0 |
| D2 |
IT1 |
|
| D3 |
IE1 |
|
| D4 |
TR0 |
定时器计数允许位 |
| D5 |
TF0 |
定时器溢出标志位,中断自动清0 |
| D6 |
TR1 |
|
| D7 |
TF1 |
|
TMOD 定时器工作方式寄存器 (不可位寻址)
| 位 |
名称 |
说明 |
| D0 |
M0 |
工作方式选择 |
| D1 |
M1 |
工作方式选择 |
| D2 |
C/$\overline{T}$ |
工作模式=0定时器模式 |
| D3 |
GATE |
门控=0 仅由$TR_x$控制 |
| D4~D7 |
…… |
功能同上 |
AUXR 辅助寄存器(不可位寻址)
| 位 |
名称 |
说明 |
| D0 |
DISABLE |
ALE脉冲寄存器 =0 时刻发出脉冲 |
| D3 |
DISTRO |
看门狗 =0开启看门狗 |
| D4 |
WDILE |
空闲看门狗 =0 允许看门狗空闲计数 |
SCON 串口寄存器
| 位 |
名称 |
说明 |
| D0 |
RI |
接收中断标志位 |
| D1 |
TI |
发送中断标志位 |
| D2 |
RB8 |
接收的第9位 |
| D3 |
TB8 |
发送的第9位 |
| D4 |
REN |
允许串口接收 |
| D5 |
SM2 |
多机通信控制=1,RB8=1才中断请求 |
| D6/D7 |
SM1/SM0 |
工作方式选择 |
AUXR1 辅助寄存器1(不可位寻址)
IE (interrupt enable)中断允许寄存器
| 位 |
名称 |
说明 |
| D0 |
EX0 |
外部中断0允许位 |
| D1 |
ET0 |
定时器0中断允许位 |
| D2 |
EX1 |
|
| D3 |
ET1 |
|
| D4 |
ES |
串口中断允许位 |
| D5 |
ET2 |
|
| D7 |
EA |
全局中断允许位 |
IP (interrupt priority)中断优先级寄存器
| 位 |
名称 |
说明 |
| D0 |
PX0 |
|
| D1 |
PT0 |
|
| D2 |
PX1 |
|
| D3 |
PT1 |
|
| D4 |
PS |
|
| D5 |
PT2 |
|
PSW 程序状态字寄存器
| 位 |
名称 |
说明 |
| D0 |
P |
Acc奇偶校验,偶为0 |
| D2 |
OV |
溢出标志位 |
| D3/D4 |
RS0/RS1 |
工作组选择寄存器 |
| D5 |
F0 |
用户标志位 |
| D6 |
Ac |
辅助进位标志位 |
| D7 |
Cy或C |
进位标志位或位累加器 |
低功耗
空闲模式:仅CPU停机,其他工作正常,WatchDog可以计数,可由中断退出
掉电模式:振荡器停机,内存中值保留,Vcc可以下降到2V,WatchDog停止计数,外部中断唤醒
汇编
寻址方式
- 寄存器寻址(R0~R7 A B C DPTR)
- 直接寻址
- 寄存器间接寻址
- 基址+变址间接寻址
- 立即数寻址
- 相对寻址
- 位寻址
注意事项
- 以字母开头的数字量需要添加前导0
- 只有R0 R1能间接寻址
- 读引脚->读修改写
- $符号表示跳转到标号
汇编指令
| 指令 |
说明 |
| MOVC |
查表指令 |
| MOVX |
读取外部RAM |
| XCH |
字节交换指令 |
| XCHD |
半字节交换指令 |
| ADDC |
带进位的加法指令 |
| DA |
十进制调整指令 |
| SUBB |
带借位的减法指令 |
| MUL |
乘法指令(高字节在B 低字节在A,乘积大于255,OV置1) |
| DIV |
除法指令(A/B=A(商)……B(余数)),除数为0,OV置1 |
| SWAP |
A累加器半字节交换指令 |
| LJMP |
长跳转指令 |
| SJMP |
相对跳转(地址+偏移量+2) |
| JMP |
间接跳转指令@A+DPTR,用于分支选择 |
| DJNZ |
减一不为零指令 |
| LCALL |
调用子程序指令,先低字节后高字节 |
| RET |
子程序返回指令 |
| RETI |
中断子程序返回指令,清除了内部中断相关寄存器的状态 |
| CLR |
清零 |
| ANL |
逻辑与 |
| ORL |
逻辑或 |
| XRL |
逻辑异或 |
| JZ |
累加器为0跳转 |
| JNZ |
累加器不为0跳转 |
| CJNE |
比较不相等跳转 |
| 位指令 |
说明 |
| SETB |
置位 |
| CLR |
清零 |
| CPL |
取反 |
| ANL |
与 |
| ORL |
或 |
| JC |
C为1跳转 |
| JNC |
C为0跳转 |
汇编伪指令
| 伪指令 |
说明 |
| ORG |
标记开始 |
| END |
结束汇编 |
| EQU |
相当于宏定义 |
| DB |
Define Byte |
| DW |
Define Word |
| SDA |
Define Bit |
| DS |
Define Storage |
中断
注意事项
- 串口中断TI和RI需要软件清除
- 中断最小相应3周期 查询1+跳转2
- 中断最长相应8周期 RETI2+DIV4+跳转2
- 中断在压栈和出栈的时候需要现场保护关闭中断
定时器
注意事项
- 定时器工作方式0 TL5位 TH8位
- 计数器最大频率为晶振频率的1/24,12MHz的最大为500KHz
初值计算
16位
($2^{16}-x$)x(1/主频)=期望的时间
计时时长
以6MHz的晶振
- 方式0:16.384ms
- 方式1: 131.072ms
- 方式2: 512$\mu$s
串口UART
注意事项
- 方式0时RXD=数据线 TXD=时钟线
- 方式1接收一位采样3次
波特率
方式1或3波特率
bandrate=$(2^{SMOD}/32)\times$定时器T1的溢出速率
bandrate=$(2^{SMOD}/32)\times(f_{osc}/12)/(256-x)$ 8位自动重装
方式0/2波特率
bandrate=$(2^{SMOD}/64)\times f_{osc}$
EOF