草庐IT

51单片机的特殊功能寄存器(SFR)

supermax2020 2024-06-17 原文

阅读前提醒: 文中提到的8051指的是8051微控制器,即51单片机

在上一篇文章51单片机的存储结构中,提到8051微控制器的RAM被划分为通用寄存器、按位寻址寄存器、寄存器组、以及特殊功能寄存器。

这里讲一下特殊功能寄存器(SFR)。

8051的特殊功能寄存器用于控制各种外围硬件设备,包括定时器、串行端口、I/O端口。也可以用于更改和获取微处理器的运行模式。

1 8051的特殊功能寄存器(SFR)

8051的特殊功能寄存器就像是一个控制台,通过它既可以监控8051微控制器的运行状态,课可以控制8051微处理器的功能。

如本文第一张图所示,在8051微控制器的内存结构中,从80H到FFH的128字节被分配给了SFR,但是只有21个位置是真正分配。每一个SFR都有一个一字节地址和一个独一无二的名字,这个名字同时也会指出该SFR的功能。

因为SFR是RAM的一部分,所以也可以像访问内部RAM一样访问SFR。两者仅仅是地址存在不同,00H到7FH是常规RAM,80H到FFH是SFR。
但是,由于128个SFR中仅有21个被分配,建议不要访问其他的SFR。

1.1 SFR的分类

这21个SFR分别是

  • A or ACC
  • B
  • DPL
  • DPH
  • IE
  • IP
  • P0
  • P1
  • P2
  • P3
  • PCON
  • PSW
  • SCON
  • SBUF
  • SP
  • TMOD
  • TCON
  • TL0
  • TH0
  • TL1
  • TH1

1.2 SFR的分类

下图列出了所有SFR的名字、功能、地址。

  • 数学运算寄存器: ACC和B
  • 状态字寄存器: PSW(Program Status Word)
  • 指针寄存器: 数据指针(DPL、DPH),和栈指针(SP)
  • I/O端口锁存器:P0,P1,P2,P3
  • 外设控制寄存器: PCON, SCON, TCON, TMOD, IE and IP
  • 外设数据寄存器:TL0, TH0, TL1, TH1 and SBUF

1.2.1 数学运算寄存器

AAC (累加器)

这个应该不需要多介绍,CPU的几乎每次操作都需要用到累加器。

B(乘商寄存器)

B寄存器用于乘除等运算,配合ACC使用。

1.2.2 PSW(程序状态字)

顾名思义,适用于保存当前程序运行状态的。程序员可以通过浏览其中的信息。

下图列出了每个标志位所对应的信息

1.2.3 指针寄存器

数据指针(DPTR: DPL和DPH)

DPL和DPH共同组成了一个16位的寄存器。它的主要作用是存储外接存储器的地址。

栈指针

栈指针指向堆栈的顶部,可以使用PUSH,POP,CALL,SET等指令来对其进行操作。
初始状态下栈指针内容为07H。
向栈指针中写数据后栈指针所存储的地址+1,读数据后地址-1。

1.2.4 I/O 端口寄存器

8051有4个用作I/O的端口,这四个端口分别是P0,P1,P2,P3。每一个端口都对应一个名字相同的寄存器。四个寄存器的地址分别是P0 – 80H, P1 – 90H, P2 – A0H 以及P2 – B0H。

SFR的每一个比特位都对应着8051微控制器的一个引脚,每一个端口寄存器都可以按字节寻址或者按位寻址。如果在端口寄存器上的某一个比特位上写入1或0,那么对应的引脚上电压也会产生相应的变化(5V或者0V)。

1.2.5 外设控制寄存器

PCON 电源控制(power control)

顾名思义,电源控制寄存器用于控制8051的电源模式。使用PCON寄存器中的两个比特,可以将8051设置为空闲模式和掉电模式。

注意:PCON寄存器不支持按位寻址

SCON 串行控制

SCON用于控制8051的串行端口。使用SCON,可以控制串口的操作模式、串口的波特率以及使用串口发送或接收数据。

TCON 定时器控制

TCON寄存器用于启动或停止8051单片机的定时器。它还包含指示定时器是否溢出的位。TCON SFR还包括与中断相关的位。

TMOD 定时器模式

定时器模式SFR用于设置定时器T0和T1的操作模式。较低的四位用于配置定时器0,较高的四位用于配置定时器1。

1.2.5 外设数据寄存器

SBUF 串行数据缓冲区

用于串行通信时存储串行数据。

TL0/TH0

定时器0由两个SFR组成:TL0和TH0。TL0是低位字节,TH0是高位字节,它们共同构成一个16位定时器0寄存器。

TL1/TH1同理

  • 参考文章:https://www.electronicshub.org/8051-microcontroller-special-function-registers/

有关51单片机的特殊功能寄存器(SFR)的更多相关文章

  1. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  2. ruby-on-rails - 标准化文件名的字符串,删除重音和特殊字符 - 2

    我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin

  3. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  4. ruby-on-rails - rails 功能测试 - 2

    在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建

  5. ruby-on-rails - 功能测试 Authlogic? - 2

    在我的一些Controller中,我有一个before_filter检查用户是否登录?用于CRUD操作。application.rbdeflogged_in?unlesscurrent_userredirect_toroot_pathendendprivatedefcurrent_user_sessionreturn@current_user_sessionifdefined?(@current_user_session)@current_user_session=UserSession.findenddefcurrent_userreturn@current_userifdefine

  6. ruby - Ruby 中允许 "p *1..10"打印出数字 1-10 的功能是什么? - 2

    require'pp'p*1..10这会打印出1-10。为什么这么简洁?您还可以用它做什么? 最佳答案 它是“splat”运算符。它可用于分解数组和范围并在赋值期间收集值。这里收集赋值中的值:a,*b=1,2,3,4=>a=1b=[2,3,4]在此示例中,内部数组([3,4])中的值被分解并收集到包含数组中:a=[1,2,*[3,4]]=>a=[1,2,3,4]您可以定义将参数收集到数组中的函数:deffoo(*args)pargsendfoo(1,2,"three",4)=>[1,2,"three",4]

  7. ruby - 现代计算机的功能是否不足以处理字符串而无需使用符号(在 Ruby 中) - 2

    我读过的关于Ruby符号的每一篇文章都在谈论符号相对于字符串的效率。但是,这不是1970年代。我的电脑可以处理一些额外的垃圾收集。我错了吗?我拥有最新最好的奔腾双核处理器和4GBRAM。我认为这应该足以处理一些字符串。 最佳答案 您的计算机可能能够处理“一点点额外的垃圾收集”,但是当“一点点”发生在运行数百万次的内部循环中时呢?如果它在内存有限的嵌入式系统上运行呢?有很多地方你可以随意使用字符串,但在某些地方你不能。这完全取决于上下文。 关于ruby-现代计算机的功能是否不足以处理字符串

  8. ruby - 如何在 Cucumber 的功能名称中使用空格 - 2

    我正在使用Windows并尝试运行一个现有的功能包,该功能包最初是在MacOS上构建的,这允许他们通过使用带空格的"\"来解决问题。我正在使用Ruby2.2.3和Cucumber。功能名称包含空格,我无法更改它。我尝试使用""和''来绕过空白,但每次都有同样的问题。这是问题的一个例子。如果我运行:cucumberfeatures/'Namecontainingwhitespaces.feature'它工作正常。但是当我运行时:cucumber-pmy_profile和cucumber.yml包含:my_profile:features/'Namecontainingwhitespace

  9. ruby - 如何测试在运行之间提供功能的 Ruby 脚本? - 2

    单元测试的好方法是测试脚本在执行之间保持正确数据的能力——在使用Ctrl-C终止脚本然后重新运行之后?是否有针对执行类似操作的现有模块或脚本的任何测试可以针对最佳实践进行审查? 最佳答案 像http://avdi.org/devblog/2010/07/19/greenletters-painless-automation-and-testing-for-command-line-applications/一样使用库或者期望、运行、终止并重新运行您的程序,并检查它是否运行正确。好的做法是将程序设计为独立的模块,每个模块都经过良好测试

  10. ruby-on-rails - ActionMailer HTML 编码 hell - 特殊字符替换为垃圾 - 2

    我有UTF-8字符串:Website•Facebook那是中间的一颗子弹又名•或0xE20x800xA2此值已正确存储在数据库中,并使用默认设置使用Rails3和ruby​​1.9.3正确显示在屏幕上。我正在尝试通过HTML电子邮件发送此邮件,但是当一切都说完之后,接收端看到的是垃圾:这背后的代码很简单,我有一个ActionMailer子类(默认使用UTF-8)设置以在布局中发送带有UTF-8内容编码的HTML电子邮件:email.html.erb布局文件:"all"%>内容使用与呈现网页相同的View,重要的一行是:我已经尝试了很多很多force_encoding的排列,e

随机推荐