当前位置: 首页 > news >正文

51单片机所有寄存器介绍

51单片机所有寄存器介绍

作者将狼才鲸
创建日期2025-04-27
  • 参考资料:Intel官方《MCS-51 Programmer’s Guide and Instruction Set.pdf》
  • CSDN阅读地址:51单片机所有寄存器介绍

一、前言

  • 51单片机的寄存器和ARM不一样,有自己专有的名称,叫SFR(特殊功能寄存器),地址是8位的0x80-0xFF(该地址与IRAM地址复用,通过不同的汇编操作指令来区分);
    • 因为51单片机中的寄存器不是通过指针来读写,而是通过伪指令定义别名后来直接读写,因此这一块的编程也是和ARM不同的地方,寄存器读写相关的代码都不能和32位ARM的代码复用;
  • 因为51单片机特殊功能寄存器最多只能有128个,对于当前很多应用场景下的的MCU来说明显不够,那么很多芯片厂商会对寄存器进行扩展,例如选2个寄存器作为二级寄存器地址,选2个寄存器作为二级寄存器数据,那么通过多操作几次寄存器就能扩展16位或32位的寄存器容量;
    • 扩展寄存器的代价是牺牲了速度(操作一次16位寄存器要读写好几个SFR寄存器),但当前很多51单片机都做到了1T(一个时钟周期执行一条指令),主频200M+,所以这点花销是可以忽略的;
  • 原始的MCS-51核用到的寄存器很少,但这些中也只有大部分是通用的,一些兼容MCS-51指令集的CPU核也会删除或修改里面一些寄存器(特别是有些8052寄存器);
    • 一些8051核的IP商会将剩下的一百多个寄存器占用得差不多,而且不同的8051核所用的寄存器含义都不一样;而之后芯片厂商一般会将所有的128个寄存器用完,甚至还扩展出二级寄存器使用;
    • 不同厂商51单片机的寄存器会不一样,因此底层硬件相关的代码并不通用,也就是说如果有驱动概念的话,换一款51芯片就得重写一次驱动;
  • 标准MSC-51寄存器
    • 寄存器地址为0x00-0xFF,其中只有0x80-0xFF特殊功能寄存器SFR与IRAM的地址是复用的,通过不同的汇编指令可以分别操作SFR和IRAM;而0x00-0x7F通用寄存器地址就是IRAM;所以SP堆栈指针不能设置到0x00-0x07,会与R0-R7冲突,但是可以设置到0x80-0xFF,与SFR不冲突;
    • 寄存器地址0x00-0x7F是通用寄存器,同时也占用IRAM地址,例如4组R0-R7(ARM中类似的是R0-R31)和16字节位寻址,以及未使用的几十个字节;0x80-0xFF是SFR特殊功能寄存器,类似于ARM中的外设寄存器,不占用IRAM地址;
  • 如果程序需要从ROM加载到RAM中执行,那么是加载到0地址的外部RAM,和IRAM无关,操作内外RAM的汇编指令不一样,它们的总线宽度一个只有8位一个16位;
    • IRAM一般只有128B、256B;

二、所有寄存器信息的表格

  • 0x00-0x7F通用寄存器(占用IRAM地址)
地址0x000x010x020x030x040x050x060x07
通用寄存器0组R00组R10组R20组R30组R40组R50组R60组R7
0x080x090x0A0x0B0x0C0x0D0x0E0x0F
1组R01组R11组R21组R31组R41组R51组R61组R7
0x100x110x120x130x140x150x160x17
2组R02组R12组R22组R32组R42组R52组R62组R7
0x180x190x1A0x1B0x1C0x1D0x1E0x1F
3组R03组R13组R23组R33组R43组R53组R63组R7
0x200x210x220x230x240x250x260x27
位寻址位地址00H~07H08H~0FH10H~17H18H~1FH20H~27H28H~2FH30H~37H38H~3FH
0x280x290x2A0x2B0x2C0x2D0x2E0x2F
40H~47H48H~4FH50H~57H58H~5FH60H~67H68H~6FH70H~77H78H~7FH
0x300x310x320x330x340x350x360x37
剩下都是用户可自行定义与使用的寄存器,可以当成全局变量和局部变量来使用,
0x380x390x3A0x3B0x3C0x3D0x3E0x3F
一般会将里面大部分区域配置成堆栈……………………
0x780x790x7A0x7B0x7C0x7D0x7E0x7F
…………………………………………
  • 0x80-0xFF SFR特殊功能寄存器,加粗为8051的,斜体+下划线是8052专有(不占用IRAM地址)
地址0x80(此列可位寻址,位地址X0~XF)0x810x820x830x840x850x860x87
SFRP0 IO口输入输出SP 堆栈指针DPL 内存数据地址低8位DPH 内存数据地址高8位PCON 电源控制
0x880x890x8A0x8B0x8C0x8D0x8E0x8F
TCON 定时器0计数器控制TMOD 定时器0计数器模式TL0 定时器0值低8位TL1 定时器1值低8位TH0 定时器0值高8位TH1 定时器1值高8位
0x900x910x920x930x940x950x960x97
P1 IO口输入输出
0x980x990x9A0x9B0x9C0x9D0x9E0x9F
SCON串口0设置SBUF串口0数据
0xA00xA10xA20xA30xA40xA50xA60xA7
P2 IO口输入输出
0xA80xA90xAA0xAB0xAC0xAD0xAE0xAF
IE 中断使能
0xB00xB10xB20xB30xB40xB50xB60xB7
P3 IO口输入输出
0xB80xB90xBA0xBB0xBC0xBD0xBE0xBF
IP 中断优先级
0xC00xC10xC20xC30xC40xC50xC60xC7
0xC80xC90xCA0xCB0xCC0xCD0xCE0xCF
T2CON 定时器2计数器控制RCAP2L 定时器2重装载数低8位RCAP2H 定时器2重装载数高8位TL2 定时器2值低8位**TH2 定时器1值高8位
0xD00xD10xD20xD30xD40xD50xD60xD7
PSW 程序状态字
0xD80xD90xDA0xDB0xDC0xDD0xDE0xDF
0xE00xE10xE20xE30xE40xE50xE60xE7
ACC 累加器
0xE80xE90xEA0xEB0xEC0xED0xEE0xEF
B 寄存器
0xF80xF90xFA0xFB0xFC0xFD0xFE0xFF
  • MCS-51寄存器详细描述

  • 汇编编程相关寄存器

寄存器bit0bit1bit2bit3bit4bit5bit6bit7
(R0-R7)x4通用寄存器,用作函数形参、局部变量
00-7F位寻址,20-7F通用寄存器自定义寄存器,汇编编程时自行使用,可定义成全局变量和堆栈区域
ACC累加器(A寄存器)用作局部变量,或存储算数运算的结果
B寄存器用作局部变量,或乘除操作时使用
DPL/DPH/DPTR数据指针使用汇编读写外部RAM数据时的当前RAM地址
PSW程序状态字P: 操作数中奇偶校验,可用于串口数据校验用户自定义OV溢出,算术运算时的溢出判断RS0RS1寄存器组选择(第几组R0~R7),很少使用F0用户自定义AC半字节进位,高半字节和低半字节间进位,如BCD码计算中能用到,很少使用CY进位,int、long等多字节类型加减乘除等算数运算时会用到,一些包含位标志的指令会用到
  • 系统设置和外设寄存器(串口、GPIO、定时器)
寄存器bit0bit1bit2bit3bit4bit5bit6bit7
SP堆栈指针(建议主动配置)指向内部通用寄存器或IRAM地址,上电默认值07H一般会主动设置到30H~F0H之间,函数调用时压栈弹栈会用到
PCON芯片电源控制(可使用默认值)IDL芯片进入空闲PD芯片下电GF0用户自定义GF1用户自定义SMOD特定条件下的串口双波特率位(由定时器1产生)(当前很多芯片串口波特率由别的寄存器来控制了,更简单)
IE中断使能(用到外设时需主动打开)EX0外部中断0ET0定时器0中断EX1外部中断1ET1定时器1中断ES串口0中断ET2定时器2中断EA失能所有中断
IP中断优先级(可使用默认值)PX0外部中断0优先级PT0定时器0优先级PX1外部中断1优先级PT1定时器1优先级PS串口优先级PT2定时器2优先级
SCON串口0配置接收中断,软件清零发送中断,软件清零RB8接收的9bitTB8要发送的9bitREN接收使能SM2SM1SM0串口模式:波特率与晶振关系,8bit还是9bit(当前很多芯片串口波特率由别的寄存器来控制了,更简单)
SBUF串口0数据串口0的收发数据
P0、P1、P2、P3 GPIO读写IO数据,Px.0Px.1Px.2Px.3Px.4Px.5Px.6Px.7
TCON定时器和外部中断配置IT0外部中断0边缘触发还是电平触发IE0外部中断0标志1边缘触发还是电平触发IE1收到外部中断1的标志TR0定时器0使能失能TF0定时器0溢出标志,硬件置位和清零TR1定时器1使能失能TF1定时器1溢出标志,硬件置位和清零
TMODM0_0M1_0多少位的寄存器,是否自动装载C/T0作为计数器还是定时器GATE0定时器0的运行关闭由外部中断引脚电平来控制M0_1M1_1C/T1GATE1
TL0、TL1、TH0、TH1、TL2、TH2、RCAP2L、RCAP2H定时器的装载值和计数器的计数值
T2CONCP/RL2是否自动装载C/T2作为定时器2还是计数器2TR2定时器2开始和运行EXEN2定时器2外部使能TCLK串口0发送波特率由串口2来生成RCLK串口0接收波特率由定时器2来生成EXF2定时器2外部标志TF2定时器2溢出标志

相关文章:

  • leetcode0103. 二叉树的锯齿形层序遍历-medium
  • JAVA手写题-精通 Java 单例模式:三种线程安全的实现方式详解
  • JAVA:单例模式
  • 【锂电池剩余寿命预测】Transformer锂电池剩余寿命预测(Pytorch完整源码和数据)
  • Java : GUI
  • RC吸收电路参数设置实战
  • Python包的编译、构建与打包指南
  • IDEA常用快捷键及操作整理(详细图解,持续更新)
  • Allegro23.1新功能之如何冻结动态铜皮操作指导
  • 二、Web服务常用的I/O操作
  • 【Go语言】ORM(对象关系映射)库
  • 层级时间轮的 Golang 实现原理与实践
  • Grok发布了Grok Studio 和 Workspaces两个强大的功能。该如何使用?如何使用Grok3 API?
  • Win10安装 P104-100 驱动
  • Gin 框架中集成 runtime/debug 打印日志堆栈信息
  • Conda 虚拟环境复用
  • react的 Fiber 节点的链表存储
  • 通过示例学习:连续 XOR
  • 如何配置osg编译使支持png图标加载显示
  • mybatis首个创建相关步骤
  • 外交部:对伊朗拉贾伊港口爆炸事件遇难者表示深切哀悼
  • 加拿大今日大选:房价、印度移民和特朗普,年轻人在焦虑什么?
  • 伊朗港口爆炸已造成25人死亡,灭火行动已近尾声
  • 长三角议事厅|国际产业转移对中国产业链韧性的影响与对策
  • 印控克什米尔26名游客遭恐袭丧生后,印度对巴宣布多项反制措施
  • 2025航天文化艺术论坛在上海举办