MCS51单片机学习笔记(二)—— 工作原理

3.MCS51工作过程

上节讲述了MCS51的组成结构,核心是CPU+存储器,CPU通过执行存储器中的程序来工作,程序就是指令的有序集合,即取指令 -> 分析指令 -> 执行指令周而复始,所以可以总结为一句话:微型计算机的工作原理就是顺序的执行程序!
下面通过一个具体的例子说明MCS51是如何计算“20+16”的:
首先编写程序:

    ORG  0000H      ;起始地址
    SJMP MAIN       ;跳转到MAIN执行
    ORG  0030H      ;MAIN起始地址
MAIN:    
    MOV  A,#14H     ;加数20
    ADD  A,#10H     ;加数16
    SJMP $         ;程序暂停
    END             ;汇编程序结束

编译,确保没有语法错误,可以看到程序总共占了54个字节


进入调试页面进行分析:

如图,打开Memory窗口观察内存,这儿需要注意:D:00H指片内RAM00H单元处,C:0000H指ROM0000H单元开始处,X:0000H指片外RAM0000H单元开始处:

准备工作完成,下面开始分析:

可以看到从0000H开始存放指令“SJMP MAIN”,这条SJMP指令占用两个字节80H和2EH;然后我们编写的MAIN程序从0030H处开始存放,“MOV A,#14H”占用两个字节74H和14H,“ADD A,#10H”占用两个字节24H和10H,"SJMP $“"占用两个字节80H和FEH,程序结束;接下来点击复位,观察复位后寄存器情况,可以看到A为0,PC为0: 点击单步运行后,执行第一条指令“SJMP MAIN”,PC变为0030H:  再次单步运行,执行“MOV A,#14H”,可以看到A中的值变为14H:  继续单步运行,执行“ADD A,#10H”,可以看到A变为24H:  接下来再次单步运行,执行“SJMP“指令发现PC没有变化,仍然是0034H,这是因为PC在执行这条指令的时候已经自动加一,因为是双字节指令,所以再加一,变为0036H,但是$表示-02H,又变为0034H,即程序处于暂停状态;

整个程序就分析完成了,可以看到,CPU的工作原理就是顺序的执行我们编写的程序,所以学习的重点在于如何编写程序,在下一节中会详细介绍8051的指令系统;

4.MCS51的工作时序

CPU取指令,分析指令,执行指令是在时钟脉冲的严格控制下进行的,时钟也是控制单元的核心:主要四个时序:振荡周期、时钟周期、机器周期、指令周期
 1、振荡周期是最基本的,也是最主要的时钟,即晶振频率的倒数;、
 2、时钟周期也叫状态周期,为2个振荡周期,第一个振荡脉冲完成运算,第二个振荡脉冲传送数据;
 3、微机完成一个基本操作所需的时间为机器周期(比如8051是12T单片机,所以12个振荡周期为一个机器周期);
 4、指令周期是微机执行一条指令的时间(比如8051的指令周期通常为1到4个机器周期);

5.MCS51的数据表示及数据运算

 我们熟悉的是十进制和字符,但计算机只认识0和1,这就需要一些转换了:

  1、十进制、十六进制、二进制之间的转换不在赘述;  

  2、微机中对于带符号数的处理

    微机中一般用字长的最高位表示符号(比如-1就表示为1 000 0001B),也就是所谓的机器数,机器数对应的真值就是我们熟悉的十进制数;

    带有符号的数进行运算时,往往会涉及到负数参与运算,加法可以用加法器电路实现,然而减法也要设计一个减法器电路实现吗?当然不是的,减法器电路也是由加法器构成,但很复杂,为了更精妙的设计,微机中采用机器数的补码进行表示,可以将减法直接作为加法运算,这样只需要一个加法器电路就够了,在寸土如金的硅片上,这样的设计可谓是很精致,那么补码究竟是怎么一回事呢?

    1)数的补码表示

     生活中,比如现在时间是下午3点,然而钟表在早上8点,这个时候顺时针拨7个小时(8+7 = 15 = 12(自动丢失) + 3)和逆时针拨5个小时(8-5 = 3)是一样的,丢失的12就是这个系统的模,(+7)和(-5)互为补码,可以总结如下:

     正数的补码表示是:数的最高有效位为0,表示符号正,数值位表示数的绝对值;

     负数的补码表示是:数的最高有效位为1,表示符号负,数值位按位取反再加一;

    2)补码表示数的范围:  

     这个是由微机的字长决定的,为  -2n-1 ≤ X ≤ 2n-1 - 1

    (比如字长为8的微机范围是-128到127,字长为16的微机范围是-32768到32767)

    3)补码的加法运算

     [ X+Y ] = [X] + [Y]

     运算过程中符号位产生的进位可以忽略不计;

    4)补码的减法运算

     [-Y]进行求补运算就可以得到[Y](注:求补运算——按位取反再加一),所以采用数的补码表示法,最大的优点是减法也可以用加法来计算:

     [ X-Y ] = [X] - [Y] = [X] + [-Y]

    5)补码转换为真值数

     在上述利用补码进行加减运算中,所得到的结果都是补码,所以要将补码转换为我们所熟知的十进制真值数

     正数直接求真值,X+Y = [ X+Y ] 

     负数求真值需要进行求补运算(按位取反再加一)然后加上负号;

   3、二进制编码——BCD编码

      在进行运算的时候,微机需要将输入的十进制转换为二进制码,运算,然后将输出结果转换为十进制输出,这样计算能力比较差,还非常耗用资源,所以通常还采用BCD编码来方便运算

    

十进制数 0 1 2  3 4 5 6 7 8 9
BCD码 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001

      使用BCD的时候要特别注意与二进制直接转换的区别

      比如十进制数58用BCD码直接表示是(0101 1000)BCD,而用二进制表示为(0011 1010)B

  4、二进制编码——ASCII字符编码

      ASCII字符主要用于串口通信中字符的传输,ASCII字符用一个字节来表示,低7位为字符的ASCII值,最高位为奇偶校验位(低7位中1的个数),用于奇偶校验,提高通信效率;

      ASCII字符总共27 = 128个,其中32个控制字符,96个图形字符,码表如下:  

      ASCII码表

猜你喜欢

转载自blog.csdn.net/mculover666/article/details/80913684