51单片机 知识总结

  目前单片机种类繁多,而51 单片机作为最基础的一款8位单片机,其资源最少,同时也是最容易学习的一款单片机。学习51单片机的工作原理及其存储结构是十分有必要的。

  单片机执行程序的过程,其实就是在执行我们编写的程序的过程(逐条执行指令),该执行过程可以看成是:取指令--------分析指令-------执行指令。

  取指令:根据 PC(程序计数器)的值从程序存储器中取出指令(编写的程序即为指令),送到指令寄存器。(送到哪里去???

  分析指令:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质,分析完成便找出操作数的地址。

  执行指令:即对分析完成后得到操作数的地址,对该地址的数据进行更新。

  计算机执行程序的过程实际上是逐条指令重复以上三个过程,直到遇到停机或循环等待指令。

举例:

 开机后,PC 计数器 初始值为 0000H,接着单片机在时序电路下自动进入执行程序过程,循环对程序区进行取指令,执行指令操作。

   对于汇编语句:     MOV    A    ,   #0E0H   

 该语句的功能表示将操作数  E0H   送到  累加器  A  上。(74H  表示  的指令是将一个数送到 A 累加器去)此时 程序计数器  0000H 位置上存放了 74H ,  0001H  上存放了 E0H 。 

执行该语句的次序为:

1、取指阶段:PC 上 地址  0000H  上的内容送到地址寄存器去,即将74H  通过数据总线送到了指令寄存器去。  此时 PC ==  0000H,

2、译码阶段:由于本次进入指令寄存器的是 74H  故 译码后单片机知道该指令是将一个操作数送到A累加器中,  此时 PC ==  0001H,

3、执行阶段:分析完指令后,将操作数  E0H   从  PC 的0001H  处取出,送到CPU,由于前面有了指令 74H ,所以 数据总线不会讲  E0H送到指令寄存器,而是将操作数送入累加器中。        此时 PC ==  0002H,

4、以此一直循环,直到系统停机。(附图说明)

  

   

 

  51 单片机的存储结构

四个存储空间:

  1、片内程序存储器(片内ROM)

  2、片外程序存储器(片外ROM)

  3、片内数据存储器(片内RAM)

  4、片外数据存储器(片外RAM)

在逻辑上(即从用户的角度上)MCS-51单片机有三个存储空间

1、片内外统一编址的64K的程序存储器(ROM)地址空间      (MOVC)
2、256B的片内数据存储器(片内RAM)的地址空间               (MOV)
3、以及64K片外数据存储器(片外RAM)的地址空间             (MOVX)

片内RAM 结构图:

  从 00H到7FH之间的地址为8位地址,最大可寻址 的范围是 256 个单元地址。52系列的单片机衍生到 FFH 。

  00H~~~~1FH :  共32个字节,分成四个寄存器区,每区有寄存器 R0~R7,对此区域,可以使用 R0~R7 来操作。

   20H~~~~2FH:  共16字节,是位寻址区,共有128个 “位”

  30H~~~~3FH:   只进行字节寻址

  80H~~~~FFH :  共有128个地址,其中离散的分布着21个特殊功能寄存器,必须直接寻址才能读写

片外RAM:

  片外RAM的地址范围是0000H到FFFFH,容量是64KB,对片外RAM读写,必须使用MOVX指令。对片外RAM采用间接寻址方式,R0,R1和DPTR都可以作为间接寻址寄存器,R0,R1是8位寄存器,即R0,R1,的心智范围最大为256个单元,而DPTR是16位地址指针,寻址范围到64KB。

ROM

  ROM 的地址是 0000H 到 FFFFH  ,容量为64KB,地址长度是16位,作用是存放程序及程序运行时所需的常数,其中  0000~0FFFH,即4K,在片内,其他在片外。

EA = 1,寻址内部ROM,EA = 0,寻址外部ROM,对ROM读出,必须使用 MOVC指令。

 

针对访问存储结构内不同区域时在C语言上使用的关键词

  由于 8051系统有片内、片外存储器,片内程序存储器还分直接寻址和间接寻址类型,比如code,data,xdata,idata,pdata,等关键词分别对应着单片机内不同的存储器,使用不同的存储器,程序的执行效率也将不同,所以在编写程序的时候,最好指定变量的存储类型,有利于提高程序的执行效率。关键词的区别及含义如下:

  data : 固定指前面 0x00~0x7f ,的128个RAM,可以用 ACC  直接读写的,速度最快,生成的代码也最小。

  idata:固定指前面 0x00 ~ 0xff 的256 个RAM,其中前128和data 的128完全相同,只是因为访问的方式不同,idata是用类似于指针的方式访问的,汇编的语句为 :MOX ACC,@Rx

  xdata:外部扩展RAM,一般指外部0x0000~0xffff空间,用DPTR访问。

  pdata : 外部扩展的低256个字节,地址出现在A0~A7上时读写,用 MOVX ACC,@Rn 读写,

  code :定义的数据放在ROM 里面,写入后不可以再修改。

  bdata:若程序需要8个或者更多的bit 变量,如果你想一次性给8个变量赋值的话就不方便了,举个例子:

  char  bdata  MODE;

  sbit MODE_7 = MODE^7;

  .

  .

  .

  sbit MODE_0 = MODE^0;

  8个 bit 变量 MODE_N 就定义好了。

程序可以简单地分为code 和data 区域,code 去在运行的时候不可以再更改,data 区存放全局变量和临时变量,是要不断更改的。CPU从code区读取指令,对data区的数据进行运算处理,因此code存储在什么介质上并不重要,可以存放在 ROM 里面 也可以存放在RAM里面  甚至 FLASH 里面, 一般做法是将程序放到 FLASH 中,再加载到RAM里面运行。

  

 

 

posted @ 2019-11-13 23:08  硬件小子  阅读(1825)  评论(0)    收藏  举报