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个图形字符,码表如下: