单片机总结[高兴]ヾ(✿゚▽゚)ノ

ε≡٩(๑>₃<)۶ 一心向学

 

1单片机学习的地方可能忘记,总结不到。为了以后回忆,现大致总结下。

51概述

MCS-51使用哈佛结构,它的程序空间和数据空间是分开编址的,即各自有各自的地址空间,互不重叠。所以即使地址一样,但因为分开编址,所以依然要说哪一个空间内的某地址。而ARM(甚至是x86)这种冯诺依曼结构的MCU/CPU,它的地址空间是统一并且连续的,代码存储器/RAM/CPU寄存器,甚至PC机的显存,都是统一编址的,只是不同功能的存储器占据不同的地址块,各自为政。

51单片机的组成:

8位CPU、片内256RAM、4KB flash ROM、4个并行8位I/O口、两个16位的定时计数器、5个中断源两个中断优先级的中断控制系统、一个全双功的UART等

(只能用此单片机干这么多事情)

 

51单片机有以下几个内存模块:

1、ROM或者Flash,叫程序存储区,你写的程序是存在这里面的,上电后从这里面执行。

   程序存储区也分为片内和片外,一般来说,现在的51很多已经做到了64K,所以很少有外扩片外Flash或者片外的Rom了,Flash或者Rom不管是片内还是片外的,只能用来定义常量,是用code来修饰,也就是说,用code来修饰的东西,在程序运行过程中,不能修改;

2、RAM有------内部RAM的低128位(00-7F),对应C语言就是data,比如我定义一个变量,

              dataunsigned char Var = 0;

                       那么,这个 Var变量就是放在内部的低128位Ram中

       -------内部RAM的高128位(80-FF),对应C语言就是idata,比如我定义一个变量,

              idataunsigned char Var = 0;

                       那么,这个 Var变量就是放在内部的高128位Ram中

       -------特殊功能寄存器(SFR)(80-FF),对应C语言就是Sfr比如我定义一个变量,

              Sfrunsigned char Var = 0x90;

                       那么,这个 Var变量就是放在内部的特殊功能寄存器中,这是你对Var操作,相当于操作一个特殊的寄存器,但是小心,不能随便定义Sfr变量,很危险

        ------外部RAM 64K(0000-FFFF)

            外部的RAM可以扩展到65536个,但是前256个算是一页,这一页比较特殊,是用pdata来修饰的,当然,也可以用xdata来修饰。除了第一页的256个以外的其他65280个空间,只能用xdata来修饰;

     回过头来讨论pdata和xdata,这两个都能修饰外部Ram的第一页,但是,Pdata只能修饰第一页,即最前面的256个外部Ram,那么,这最前面的256个到底用Pdata还是Xdata好的呢?

答案是Pdata,因为Xdata修饰的变量,用的是DPTR寻址,Pdata用的是R0和R1.DPTR因为是16位的,所以可以覆盖整个的64K外部Ram,R0和R1是8位,所以只能寻址最前面的256个,也就是外部Ram的第一页,但是,用R0寻址,比DPTR快一倍,代码也小的很多。

MCS-51读写IDATA区的速度是最快的,而且访问方法也是最多的。访问XDATA区的速度相对就要慢很多。MCS-51的堆栈要优先开辟在IDATA区中,并且在IDATA区中开辟的堆栈,可以使用栈指针寄存器SP来控制。如果栈实在太大,只能开辟在XDATA区中,那么CPU的SP寄存器就很难借力,只能由我们自己来构造堆栈结构和堆栈指针。

状态寄存器

处理器的状态保存在状态寄存器PSW 中,状态字中包括进位位、用于BCD 码处理的辅助进位位、奇偶标志位、溢出标志位、还有前面提到的用于寄存器组选择的RS0 和RS1。用于保存处理器当前的一些状态。

指令理解

计算机系统中可以有多种编程语言,但硬件能够直接识别和执行的只有机器语言。只有采用翻译或解释方法把复杂的高级语言程序转换成机器语言,才能在机器硬件上直接执行来实现相应的功能。由于机器中的所有信息都是通过编码表示的,因此,指令的操作及操作的数据也必须按照一定的格式编码(约定),以便于硬件正确识别。

指令是用来指示处理器进行操作的命令,不同类型的处理器具有不同的指令系统。因为汇编是用这些指令进行编程,所以不便于移植。单片机的能力是通过指令体现的,包括了硬件能够直接实现的所有的运算或操作功能。

一款处理器都有其自己的编译器,我们写的高级程序,会由编译器生成对应的机器语言。

中断

 

中断结构图

中断寄存器,用于对中断进行控制的,例如开关总中断,必须设置相应位为1才能使用中断。

中断寄存器中也有相应的标志位,当发生中断的时候有的会置位相应的位,(所以不会自动清零的要执行中断的时候清零此标志位)单片机就会转去执行相应的中断程序。(至于如何找找中断程序,如上所示,每个中断都有一个中断入口地址,发生中断的时候,就会跳到此处执行,因为区域有限,一般此位置放的都是跳转指令,找到该位置后再跳到其他处执行程序)

矢量入口单元在编写中断程序时写入对应的“跳板指令”

 

中断响应:
    1.响应条件
    CPU响应中断的条件有:
    ①有中断源发出中断请求;
    ②中断总允许位EA=1,即CPU开中断;
    ③申请中断的中断源的中断允许位为1;
    满足以上条件,CPU响应中断;如果中断受阻,CPU不会响应中断。
   2.响应过程
    单片机一旦响应中断,首先置位响应的优先级触发器,然后执行一个硬件子程序调用,把断点地址压入堆栈保护,然后将对应的中断入口地址装入程序计数器PC,使程序转向该中断入口地址,以执行中断服务程序。
    中断处理:CPU响应中断结束后即转至中断服务程序的入口。从中断服务程序的第一条指令开始到返回指令为止,这个过程称为中断处理或称中断服务。中断处理包括两部分内容:一是保护现场,二是为中断源服务。
    中断返回:中断处理程序的最后一条指令是中断返回指令RETI。它的功能是将断点弹出送回PC中,使程序能返回到原来被中断的程序继续执行。

 

89C51中断响应过程

CPU在每个机器周期S5P2期间顺序采样每个中断源,CPU在下一个机器周期S6期间按优先级顺序查询中断标志,如查询到某个中断标志为1,将在接下来的机器周期S1期间按优先级进行中断处理,中断系统通过硬件自动将相应的中断矢量地址装入PC,以便进入相应的中断服务程序。一旦响应中断,89C51首先置位相应的中断“优先级生效”触发器,然后由硬件执行一条长调用指令,把当前的PC值压入堆栈,以保护断点,再将相应的中断服务的入口地址送入PC,于是CPU接着从中断服务程序的入口处开始执行。对于有些中断源,CPU在响应中断后会自动清除中断标志。

 

定时器/计数器

  1.计数的定义:

   计数是指对外部事件进行计数,外部事件的发生以输入脉冲的形式表示,因此计数功能的实质就是对外来的脉冲进行计数,在单片机中对应引脚T0和T1,两个脉冲输入端。

  外部输入的脉冲在负跳变时有效(即外部脉冲由1变化到0),计数器加1.

  2.定时器:

   定时器是通过计数器的计数来实现的,不过此时的计数脉冲来自单片机的内部,因此定时器的实质是对内部脉冲的计数,在单片机中,每个机器周期产生一次计数脉冲,计数器加1.

启动代码

51单片机复位后马上执行STARTUP.A51文件中的启动代码,根据启动代码中的设置依次执行以下操作:

    • 内部RAM清零
    • 外部RAM清零
    • 清零分页的外部RAM
    • 初始化SMALL内存模型的可重入模拟堆栈及其堆栈指针
    • 初始化LARGE内存模型的可重入模拟堆栈及其堆栈指针
    • 初始化COMPACT内存模型的可重入模拟堆栈及其堆栈指针
    • 初始化8051单片机的硬件堆栈指针
    • 将系统控制权转交给初始化全局变量的代码,如果没有被初始化的全局变量则转交给C程序文件中的main函数。

 

_φ(❐_❐✧ 人丑就要多读书

*✧⁺˚⁺ପ(๑・ω・)੭ु⁾⁾ 好好学习天天向上

(。_ 。)✎_学习计划走起

*:ஐ٩(๑´ᵕ`)۶ஐ:*学习使我进步

…φ(๑˃∀˂๑)♪学习是我的全部

(っ•̀ω•́)っ✎⁾⁾我爱学习

ヾ(๑╹ヮ╹๑)ノStudying makes me happy

ヾ( ˘ ³˘人)ヾ考的全会٩(*Ӧ)و写的全对

٩꒰▽ ꒱۶⁼³₌₃ 学习去咯

( ´▽` )ノ再见

 

posted @ 2018-06-22 18:52  龙~辉  阅读(253)  评论(0编辑  收藏  举报
Live2D