标题: 7课:单片机的特殊功能寄存器 [打印本页]

作者: admin    时间: 2013-5-21 02:51
标题: 7课:单片机的特殊功能寄存器
  通过前面的学习,我们已知单片机的内部有ROM、有RAM、有并行I/O口,那么,除了这些东西之外,单片机内部究竟还有些什么,这些个零碎的东西怎么连在一起的,让我们来对单片机内部的寄存器作一个完整的功能分析吧!  下图中我们能看出,在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。在一个51单片机的内部包含了这么多的东西。

 
  对上面的图进行进一步的分析,我们已知,对并行I/O口的读写只要将数据送入到对应I/O口的锁存器就能了,那么对于定时/计数器,串行I/O口等怎么用呢?在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。事实上,我们已接触过P1这个特殊功能寄存器了,还有哪些呢?看下表1
            符号
            
地址
功能介绍
            B
            
F0H
B寄存器
            ACC
            
E0H
累加器
            PSW
            
D0H
程序状态字
            IP
            
B8H
中断优先级控制寄存器
            P3
            
B0H
P3口锁存器
            IE
            
A8H
中断允许控制寄存器
            P2
            
A0H
P2口锁存器
            SBUF
            
99H
串行口锁存器
            SCON
            
98H
串行口控制寄存器
            P1
            
90H
P1口锁存器
            TH1
            
8DH
定时器/计数器1(高8位)
            TH0
            
8CH
定时器/计数器1(低8位)
            TL1
            
8BH
定时器/计数器0(高8位)
            TL0
            
8AH
定时器/计数器0(低8位)
            TMOD
            
89A
定时器/计数器方式控制寄存器
            TCON
            
88H
定时器/计数器控制寄存器
            DPH
            
83H
数据地址指针(高8位)
            DPL
            
82H
数据地址指针(低8位)
            SP
            
81H
堆栈指针
            P0
            
80H
P0口锁存器
            PCON
            
87H
电源控制寄存器
  表1

<特殊功能寄存器地址映象表(一)>

<特殊功能寄存器地址映象表(二)>

<特殊功能寄存器地址映象表(三)>

下面,我们介绍一下几个常用的SFR,看图2。
1、ACC:累加器,常常用A表示。这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧。它的名字特殊,身份也特殊,稍后我们将学到指令,能发现,所有的运算类指令都离不开它。
2、B:一个寄存器。在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。
3、PSW:程序状态字。这是一个很重要的东西,里面放了CPU工作时的很多状态,借此,我们能了解CPU的当前状态,并作出对应的处理。它的各位功能请看表2
D7
D6
D5
D4
D3
D2
D1
D0
CY
AC
F0
RS1
RS0
OV

P
      表2
PSW也称为标志寄存器,了解这个对于了解单片机原理非常的重要,存放各有关标志。其结构和定义如下:

  下面我们逐一介绍sfr各位的用途
(1)CY:进位标志。用于表示Acc.7有否向更高位进位。8051中的运算器是一种8位的运算器,我们知道,8位运算器只能表示到0-255,如果做加法的话,两数相加可能会超过255,这样最高位就会丢失,造成运算的错误,怎么办?最高位就进到这里来。这样就没事了。
例:78H+97H(01111000+10010111)
(2)AC:辅助进位标志也叫半进位标志。  用于表示Acc.3有否向Acc.4进位
例:57H+3AH(01010111+00111010)
(3)F0:用户标志位,由我们(编程人员)决定什么时候用,什么时候不用。
(4)RS1RS0:工作寄存器组选择位。这个我们已知了。
              RS1、RS0 = 00 —— 0区(00H~07H)
              RS1、RS0 = 01 —— 1区(08H~0FH)
              RS1、RS0 = 10 —— 2区(10H~17H)
              RS1、RS0 = 11 —— 3区(18H~1FH)
(5)0V:溢出标志位。 表示Acc在有符号数算术运算中的溢出,什么是溢出我们稍后再谈吧。
(6)P:奇偶校验位:它用来表示ALU运算结果中二进制数位“1”的个数的奇偶性。若为奇数,则P=1,不然为0。
例:某运算结果是78H(01111000),显然1的个数为偶数,所以P=0。
4、DPTR(DPH、DPL):数据指针,能用它来访问外部数据存储器中的任一单元,如果不用,也能作为通用寄存器来用,由我们自已决定如何使用。16位,由两个8位寄存器DPH、DPL组成。主要用于存放一个16位地址,作为访问外部存储器(外RAM和ROM)的地址指针。
5、P0P1P2P3:这个我们已经知道,是四个并行输入/输出口的寄存器。它里面的内容对应着管脚的输出。
6、SP:堆栈指针。(专用于指出堆栈顶部数据的地址。)
 
   堆栈介绍:日常生活中,我们都注意到过这样的现象,家里洗的碗,一只一只摞起来,最晚放上去的放在最上面,而最早放上去的则放在最下面,在取的时候正好相反,先从最上面取,这种现象我们用一句话来概括:“先进后出,后进先出”。请大家想想,还有什么地方有这种现象?其实比比皆是,建筑工地上堆放的砖头、材料,仓库里放的货物,都是“先进后出,后进先出”,这实际是一种存取物品的规则,我们称之为“堆栈”。
   在单片机中,我们也能在RAM中构造这样一个区域,用来存放数据,这个区域存放数据的规则就是“先进后出,后进先出”,我们称之为“堆栈”。为什么需要这样来存放数据呢?存储器本身不是能按地址来存放数据吗?对,知道了地址的确就能知道里面的内容,但如果我们需要存放的是一批数据,每一个数据都需要知道地址那不是麻烦吗?如果我们让数据一个接一个地放置,那么我们只要知道第一个数据所在地址单元就能了(看图2)如果第一个数据在27H,那么第二、三个就在28H、29H了。所以利用堆栈这种办法来放数据能简化操作
   那么51中堆栈什么地方呢?单片机中能存放数据的区域有限,我们不能够专门分配一块地方做堆栈,所以就在内存(RAM)中开辟一块地方,用于堆栈,但是用内存的哪一块呢?还是不好定,因为51是一种通用的单片机,各人的实际需求各不相同,有人需要多一些堆栈,而有人则不需要那么多,所以怎么分配都不合适,怎样来解决这个问题?分不好干脆就不分了,把分的权利给用户(编程者),根据自已的需要去定吧,所以51单片机中堆栈的位置是能变化的。而这种变化就体现在SP中值的变化,看图2,SP中的值等于27H不就相当于是一个指针指向27H单元吗?当然在真正的51机中,开始指针所指的位置并非就是数据存放的位置,而是数据存放的前一个位置,比如一开始指针是指向27H单元的,那么第一个数据的位置是28H单元,而不是27H单元,为什么会这样,我们在学堆栈命令时再说明。其它的SFR,我们在用到时再介绍。

作者点评:这一课可能比较难懂了,看大家的评论很多都这样说,其实并不需要把上面的这些东西都死记硬背在脑子里面,这是很难的,我们只需要理解他的工作原理,一次看不懂就要多看几次,等到要写程序的时候,我们再把这些表格拿出来查阅所以建议你把本页保存为书签.笔者在开始学习单片机的时候也是这样做的.

下一课:8课:单片机寻址方式与指令系统
作者: 阿格拉瑞    时间: 2013-5-25 22:01
很基础但很好啊
作者: danpianji889    时间: 2013-8-13 14:15
确实比较难懂了
作者: c2y3h2    时间: 2013-8-31 09:34
先看看  不行再看看!!!!
作者: 温xyz    时间: 2013-11-10 20:42
谢谢楼主!!辛苦了!!
作者: 呜呜呜呜    时间: 2014-3-5 12:10
讲的很好,已大致理解
作者: jiajun678    时间: 2014-4-2 18:21
很好。。。
作者: lixichunedu    时间: 2014-4-5 15:21
大致的结构就是这样。楼主讲解的很好。
作者: 亭子    时间: 2014-7-24 16:05
谢谢楼主
作者: 亭子    时间: 2014-7-24 16:24
没怎么懂啊。。。。。
作者: 5251dpj    时间: 2014-9-24 14:27
真好 学习了
作者: xiejian5164    时间: 2014-11-30 11:27
有点难
作者: ardu    时间: 2014-12-18 20:02
初学者   
作者: yjj2011    时间: 2014-12-29 15:09
继续学习中.................
作者: 山一样的男人    时间: 2015-1-4 10:39
这一课看晕了 好难理解 不过见到最后作者点评信心又恢复了
作者: new51    时间: 2015-3-25 14:09
看晕了。。。。根本不知道啥意思了。。。。
作者: dimozun    时间: 2015-3-31 15:02
先看看  不行再看看!!!!
作者: lanjm836    时间: 2015-4-2 21:41
看起来有点难懂,如果结合实际操作应该是容易理解的
作者: 崔三爷    时间: 2015-4-18 14:43
好给力
作者: 用户2111157    时间: 2015-8-31 22:38
这节好抽象啊,卡这了
作者: 2832042310    时间: 2015-9-6 19:24
这节课比较复杂
作者: 几度纷飞T    时间: 2016-1-25 19:52
楼主好人 真有用
作者: vbn11111    时间: 2016-4-14 18:31
好好好,对我们小白很有用
作者: 我和你222    时间: 2016-4-26 21:33
#在这里确实比较难懂了,但还是坚持
作者: 烧开的白开水    时间: 2016-7-8 14:49
楼主辛苦 我连基础都没有 希望楼主多多关照
作者: B型血    时间: 2016-11-9 19:58
确实难懂了
作者: Bnuzdaxian    时间: 2016-11-14 14:23
TH0到底是高还是低啊?
作者: 秋明    时间: 2016-12-4 13:20
好  新人刚入坑  学习学习
作者: wangxb2555    时间: 2017-1-5 08:29
讲的很好,已大致理解
作者: handi    时间: 2017-1-29 21:22
学学高人指点
作者: 新月传说    时间: 2017-2-15 16:09
有些难懂,先看着
作者: zrx15756000859    时间: 2017-3-9 12:37
多看几遍,就能理解
作者: lyw_2010    时间: 2017-4-3 07:59
学习了,多谢
作者: yonghu    时间: 2017-5-27 18:14
##纠错:第一个列表里面的定时/计数器那一串有误,
作者: hejiwei    时间: 2017-6-19 21:44
不错非常好 很有用谢谢
作者: hejiwei    时间: 2017-6-19 21:45
非常好
作者: tellgreen    时间: 2017-9-4 23:48
一点一点从头学
作者: hsyxyz123    时间: 2017-11-23 15:38
认真学习单片机。
作者: zhangcc112123    时间: 2017-11-27 11:28
很给力
作者: aloneufo    时间: 2018-1-3 10:37
突然感觉我又在学习C的指针了
作者: liuzclzc    时间: 2018-1-16 20:27
这节讲的是常用的符号和代码。
作者: ///51    时间: 2018-1-25 17:01
把我这个小白看蒙了
作者: heron    时间: 2018-2-27 22:09
这个…RS1,RS0在哪讲过吗?我又重新返回去看了一遍也没发现谁能帮我稍微讲一下吗?谢谢
作者: voner    时间: 2018-3-17 13:36
TH0 不是高八位么?
作者: esfg    时间: 2018-3-18 13:19
完全看不懂
作者: 鸣人不抽烟    时间: 2018-5-5 10:36
辛苦辛苦
作者: keneng    时间: 2018-6-25 16:10
这节课让我回忆起来大学时学汇编的时候。
作者: cxq8899    时间: 2018-7-9 10:42
不错的教程
作者: 15081898066    时间: 2018-8-21 09:02
那个......这些东西需要背过吗,对编程有帮助吗
作者: ydx8118    时间: 2018-8-25 10:08

不错非常好 很有用谢谢
作者: 时光倒影    时间: 2018-12-12 19:45
谢谢分享
作者: cedtek    时间: 2020-12-29 16:18
对堆栈的讲解解决了我心中对 局部变量定义后地址的分配的机理,之前学习C时对栈顶指针一知半解,现在感觉更清晰了,谢谢LZ的好文
作者: renwxzy    时间: 2021-2-19 10:52
精简明了!多谢
作者: 陆少    时间: 2021-4-29 10:59
看不懂
作者: cedtek    时间: 2024-1-7 11:55
表 1 有几行有问题,下面这个表格是我根据图 2、图 3、图 4 修改好的

51hei.png (19.72 KB, 下载次数: 233)

51hei.png

作者: cedtek    时间: 2024-1-7 12:10
15081898066 发表于 2018-8-21 09:02
那个......这些东西需要背过吗,对编程有帮助吗

不需要背诵吧,随着查阅使用应该慢慢地就能自然而然的记住常用的一些 SFR 了。
作者: cedtek    时间: 2024-1-7 12:19
对内容校对了一下,保存为 PDF,欢迎下载我提供的附件哦~


附件:
07 课:单片机的特殊功能寄存器.pdf (461.39 KB, 下载次数: 2)






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1