前两期内容已经对单片机的存储器做了一部分的讲解,这一期就把剩余部分的内容分享给大家,如有对相关知识有需要了解的朋友可以查看我主页翻找一下可以看到前两期的分享。
有同学51单片机或者是单片机在编程的时候,怎么样去区分这两个里面的内容,它怎么样能够识别呢?同样的地址,我来寻址的时候它怎么识别呢?它是靠指令,我们为寻址有位寻址指令,那字节寻址有字节寻址指令,这个是不一样的,大家知道就行了,从30H到7FH才是我们的用户RAM区,也就是大家知道我们定义的一些变量,定义的变量,包括我们在程序调用,包括中断调用的时候,做了一些这种RAM的一些堆栈,都是在这一块,所以大家可以发现,实际上我们虽然讲有个字节,但是你看你需要去掉16个字节,这边又去掉了32个字节,也就你需要去掉48个字节,啊,去掉48个字节,实际上我们的用户RAM区只有几十个字节,所以为什么前面编程的时候一直强调,在定义变量的时候,能定义成肮脏的差类型就不要定义成整型的,能定义成整型的,不要定义成长整型的,能定义成无符号的,不要定义成有符号的,就是因为我们的RAM太小了,只有几十个字节,对应的数太大了太多了变量太多了,一个ROM就不够用。
大家打游戏的时候都知道,如果说你的内存不够,你加载一个很大的3D游戏,你的计算机立马就卡死了,所以大家要时时刻刻提醒自己,我们51单片机的内部RAM非常小,但适用于我们这种控制领域,它是足够了,所以也不要去追求RAM越大越好,越大越好,不同的器件它有它不同的特定的应用场合,这个是第一个区域就是叫做工作寄存器,大概知道就行了,大概知道就行了,以往讲汇编语言的时候,这一块儿是重点来讲的,因为我们很多的指令当中都牵扯到R0到R7寄存器,但是我们现在讲C语言这一块,大家可能不太能能够理解透彻,先清楚这一块有这一块存储空间,工作寄存器这个名字很形象,也就是在我们程序运行的过程当中,在CPU工作的时候,肯定是在一直发挥作用的,这个大家在前面我教大家去调试程序的时候,回头我们在调试程序的时候,也可以带它来看一下,在你调试程序点击那个放大器的那个按钮的时候,你可以发现草莓的侧边栏那边出现了这个程序运行状态就可以明确的看到R0到R7的寄存器,就在我们CPU运行的过程当中,一些中间数据,它都会不停的和它之间进行交换或者是存储。
工作寄存器区一共有四组,这四组当中,在当前的时候,CPU在运行的时候,当前的时候只能使用其中的一组,并不是这四组同时在用的,它只能使用其中的一组,你可以发现在不同的组的它的名字我们都可以用R1到R7,但是我们在当前使用的时候,只能使用其中的一组,就是说只能选当前的一组作为当前工作寄存器组,可以去切换它在不同的里面,比如说你CPU在执行主程序的时候用了一组,到中断程序的时候想切换到另一组是可以的,切换的话我们可以用特殊功能寄存器PSW当中有两个位正好可以选择这四组工作寄存器。
第二区域是我们这个20到2F,我们叫位寻址区,一共占了16个字节,个位,每个位再对它进行编码,从20到2F是16个字节,每个字节比如说20的地方,每一个字节正好我们再给它一个位地址,从00开始编码,一直编到最后,你就变到最后那边到这个地方的时候还没有编完,因为我们还有特殊功能寄存器取,也就是我们前面定义的一些位变量,比如说我们用比特来定一个位变量,这个时候编译器会把它分配在我们的位寻址区里面,位寻址区里面的这些字节除了可以进行位寻址,还可以进行字节寻址,但是其它区域的只能进行字节寻址,就不能进行位寻址,就是说它既然是位寻址区,它就既可以进行位寻址,也可以进行字节寻址,但是这个地方它就只能进行字节寻址,不能进行位寻址,要想进行位寻址,要用C语言来得到不同的。
第三个是我们的这个用户RAM区,这个区域里面一共有80个存储单元,每一个单元都有一个字节地址,但是它没有位地址,而且也没有寄存器名,这个区域我们主要用来存放我们的中间的数据的一个结果,也就是大家定义的变量,大多数都是存放在这个用户RAM区或者我们叫做数据缓冲区,所以需要大家注意,就是第一个区工作寄存器区和第三区用户数据缓冲区,它只能按字节进行数据的存储,但是位寻址区既可以按字节也可以按位进行存取操作,用内部的RAM当中,除了低个字节,还有高个字节,高个字节当中特殊功能寄存器区,也就是从80H到FFH,但是51单片机实际上只使用了其中的21个单元,并没有用的特别多,有同学说其它单元留着干什么呢?预留是干什么呢?其它高性能单片机可以做扩展,它会增加特殊功能寄存器,就像我们做了一个产品一样,我们也要预留,你不能做了一个你设计的一个产品,比如说你写的代码正好是两块,你不能选一个存储空间,就是两开存储空间,要适当的留一点余地,多留一点防止程序的升级,这样的话就是说我会预留一些,所以单片机发明的时候,它只使用了当中的21个单元,也就是定义了21个特殊功能寄存器,其它的单元都没有使用,也就是预留的,预留给后续的单片机,现在高性能单片机都可以用到更多,而且这21个单元还是不连续的,这个大家也要理解一下。
我们对单片机的编程实际上都是主要通过这个特殊功能寄存器的编程来对我们51单片机的内部资源进行一个管理,所以像我们管理RO口就是使用的特殊功能寄存器当中的P1P0P2P3,就是通过它来控制我们单片机的内部资源,控制RO通过特殊功能寄存器来控制的,后续我们会陆陆续续的介绍其它的特殊功能寄存器,这个特殊功能寄存器具体的分布,大家感兴趣的可以自己再去看看书啊,我们后面陆陆续续的会介绍到不同的特殊功能寄存器,你也可以等着我介绍到的时候再跟着来看。
另外一个需要注意的就是在特殊功能寄存器,它每一个也都有一个字节地址,比如说像P0口,它是80向我们的P1口,它是90H,P2口是A0,P3口的话是B0H,大家要注意,就是说在字节地址末位是0或者8的这些特殊功能寄存器,它可以进行位寻址,也就是说我们刚才讲过低个字节的内部RAM当中的20到2F可以进行位寻址,高个字节当中的哪些地址可以进行为寻址,是这个里面字节地址为第一位为0或者是第一位为8的这些单元,也可以进行位寻址,讲计算机,单片机的这些特殊功能,寄存器用的时候,我还会再给大家强调。
原来内部有两片的内部的这个RAM,内部RAM当中有两个空间,一个是低于88个字节是我们的用户这一块的,另外还有高个字节是保留给单片机来用的,而且这高个字节里面只用到了其中的21个单元,这21个单元我们每一个给它起了另外一个名字,所以帮我们去把这个字节地址给定义了,方便用户来使用,而且这21个单元的又是不连续的,这21个单元当中,末位地址为0和8的,就是字节地址低位为0,为0H和8H的,还可以进行位寻址,我们51单片机的整个的一个控制管理,或者说对它的单片机的内部资源的操作,都是通过对特殊功能机的操作而操作。
特殊功能寄存器它是一般来说每一个特殊功能寄存器都是8位,每一个为我们可以对它进行写0和写1,你理解一下特殊功能寄存器这里面写0和写7,就相当于是我们这个每一个为这个里面做了一个人,这个地方里面是有一个开关,做了个小人帮你去拨开关,你给它写0和写1,它会把这个开关给你接通和断开,就是这个作用,所以我们编程的时候,实际上就是这个里面就是告诉这个特殊功能寄存器里面这个每一位里面这个小人,把开关给我断开,还是把开关给我闭合,从而达到对我们特殊功能计算机的控制,从而通过对特殊功能寄存器的控制,达到对我们单片机内部资源的一个控制。
所以把特殊功能寄存器的概念理解清楚了,单片机的编程就不难了,整个的单片机的存储空间的一个结构图,这也就是我要求大家掌握的一张图,把这个图刻到脑子当中,并且深刻的领悟我这篇内容讲的单片机存储空间的相关内容,这样的话,你对单片机的这个理解就会更深一步,前面理解的单片机的硬件结构那个图,再理解了它的存储空间的一个图,包括RAM内部的低个字节的RAM,高个自己RAM,也就是我们的特殊功能寄存器,同时又对ROM有了一个深入的理解,内部ROM和外部ROM,同时还要知道这两个存储器,无论是ROM还是RAM,它的最大的存储空间,也就是最大扩展最大最大不能超过64K,这个是因为我们51单片机的地址总线是16位的,只能选择的地址空间分布的范围是从16个0到16个1,所以是不能超过64K,这个大家一定要理解。
好了,这一期是单片机存储器相关知识点的第三期,,也是最后一期内容,感兴趣可以翻查一下以往的发文记录可以找到,喜欢的帮忙收藏点个赞哦,以上文章内容仅代表个人观点,不喜勿喷,谢谢大家的支持与鼓励!
想学单片机的朋友,可以私信我,我可以发一些资料给大家作为参考学习的内容,有问题的朋友也可以在评论区评论,或者私信我,尽量帮大家解决朋友们提出的问题,谢谢大家,最后祝看帖的各位朋友身体健康,万事顺利