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