标题：MCS51
MCS51
INTEL公司将MCS51的核心技术授权给了很多其它公司，所以有很多公司在做以8051为核心的单片  机，当然，功能或多或少有些改变，以满足不同的需求，其中89C51就是这几年在我国非常流行的单片机，它是由美国ATMEL公司开发生产的。
cpu组成
运算器运算器以完成二进制的算术/逻辑运算部件ALU为核心，再加上暂存器TMP、累加器ACC、寄存器B、程序状态标志寄存器PSW及布尔处理器。累加器ACC是一个八位寄存器，它是CPU中工作最频繁的寄存器。在进行算术、逻辑运算时，累加器ACC往往在运算前暂存一个操作数（如被加数），而运算后又保存其结果（如代数和）。寄存器B主要用于乘法和除法操作。标志寄存器PSW也是一个八位寄存器，用来存放运算结果的一些特征，如有无进位、借位等。其每位的具体含意如下所示：
对用户来讲，最关心的是以下四位。　 
[1]（1）进位标志CY（PSW.7）。它表示了运算是否有进位（或借位）。如果操作结果在最高位有进位（加法）或者借位（减法），则该位为1，否则为0。　 
（2）辅助进位标志AC（PSW.6）。又称半进位标志，它指两个八位数运算低四位是否有半进位，即低四位相加（或减）是否进位（或借位），如有AC为1，否则为0。　 
（3）溢出标志位OV（PSW.2）。反映带符号数的运算结果是否有溢出，有溢出时，此位为1，否则为0。　 
（4）奇偶标志P（PSW.0）。反映累加器ACC内容的奇偶性，如果ACC中的运算结果有偶数个1（如11001100B，其中有4个1），则P为0，否则，P=1。
由于PSW存放程序执行中的状态，故又叫程序状态字。运算器中还有一个按位（bit）进行逻辑运算的逻辑处理机（又称布尔处理机）。控制器控制器是CPU的神经中枢，它包括定时控制逻辑电路、指令寄存器、译码器、地址指针DPTR及程序计数器PC、堆栈指针SP等。这里程序计数器PC是由16位寄存器构成的计数器。要单片机执行一个程序，就必须把该程序按顺序预先装入存储器ROM的某个区域。单片机动作时应按顺序一条条取出指令来加以执行。因此，必须有一个电路能找出指令所在的单元地址，该电路就是程序计数器PC。当单片机开始执行程序时，给PC装入第一条指令所在地址，它每取出一条指令（如为多字节指令，则每取出一个指令字节），PC的内容就自动加1，以指向下一条指令的地址，使指令能顺序执行。只有当程序遇到转移指令、子程序调用指令，或遇到中断时（后面将介绍），PC才转到所需要的地方去。8051 CPU指定的地址，从ROM相应单元中取出指令字节放在指令寄存器中寄存，然后，指令寄存器中的指令代码被译码器译成各种形式的控制信号，这些信号与单片机时钟振荡器产生的时钟脉冲在定时与控制电路中相结合，形成按一定时间节拍变化的电平和时钟，即所谓控制信息，在CPU内部协调寄存器之间的数据传输、运算等操作。
存储器
存储器是单片机的又一个重要组成部分，每个存储单元对应一个地址，如256个单元共有256个地址，用两位16进制数表示，即存储器的地址（00H～FFH）。存储器中每个存储单元可存放一个八位二进制信息，通常用两位16进制数来表示，这就是存储器的内容。存储器的存储单元地址和存储单元的内容是不同的两个概念，不能混淆。（1）程序存储器（1）程序存储器　程序是控制计算机动作的一系列命令，单片机只认识由“0”和“1”代码构成的机器指令。如用助记符编写的命令MOV A，#20H，换成机器认识的代码74H、20H：（写成二进制就是01110100B和00100000B）。在单片机处理问题之前必须事先将编好的程序、表格、常数汇编成机器代码后存入单片机的存储器中，该存储器称为程序存储器。程序存储器可以放在片内或片外，亦可片内片外同时设置。由于PC程序计数器为16位，使得程序存储器可用16位二进制地址，因此，内外存储器的地址最大可从0000H到FFFFH。8051内部有4k字节的ROM，就占用了由0000H～0FFFH的最低4k个字节，这时片外扩充的程序存储器地址编号应由1000H开始，如果将8051当做8031使用，不利用片内4kROM，全用片外存储器，则地址编号仍可由0000H开始。不过，这时应使8051的第31脚（即EA脚）保持低电平。当EA为高电平时，用户在0000H至0FFFH范围内使用内部ROM，大于0FFFH后，单片机CPU自动访问外部程序存储器。（2）数据存储器（2）数据存储器　单片机的数据存储器由读写存储器RAM组成。其最大容量可扩展到64k，用于存储实时输入的数据。8051内部有256个单元的内部数据存储器，其中00H～7FH为内部随机存储器RAM，80H～FFH为专用寄存器区。实际使用时应首先充分利用内部存储器，从使用角度讲，搞清内部数据存储器的结构和地址分配是十分重要的。因为将来在学习指令系统和程序设计时会经常用到它们。8051内部数据存储器地址由00H至FFH共有256个字节的地址空间，该空间被分为两部分，其中内部数据RAM的地址为00H～7FH（即0～127）。而用做特殊功能寄存器的地址为80H～FFH。在此256个字节中，还开辟有一个所谓“位地址”区，该区域内不但可按字节寻址，还可按“位（bit）”寻址。对于那些需要进行位操作的数据，可以存放到这个区域。从00H到1FH安排了四组工作寄存器，每组占用8个RAM字节，记为R0～R7。究竟选用那一组寄存器，由程序状态字PSW中的RS1和RS0来选用。在这两位上放入不同的二进制数，即可选用不同的寄存器组。（3）特殊功能寄存器（3）特殊功能寄存器　特殊功能寄存器（SFR）的地址范围为80H～FFH。在MCS－51中，除程序计数器PC和四个工作寄存器区外，其余21个特殊功能寄存器都在这SFR块中。其中5个是双字节寄存器，它们共占用了26个字节。特殊功能寄存器反映了8051的状态，实际上是8051的状态字及控制字寄存器。用于CPU PSW便是典型一例。这些特殊功能寄存器大体上分为两类，一类与芯片的引脚有关，另一类作片内功能的控制用。与芯片引脚有关的特殊功能寄存器是P0～P3，它们实际上是4个八位锁存器（每个I/O口一个），每个锁存器附加有相应的输出驱动器和输入缓冲器就构成了一个并行口。MCS－51共有P0～P3四个这样的并行口，可提供32根I/O线，每根线都是双向的，并且大都有第二功能。其余用于芯片控制的寄存器中。
MCS51的指令系统
MCS51的指令系统
MCS－51共有7种寻址方式，现介绍如下：
（1）立即寻址：操作数就写在指令中，和操作码一起放在程序存贮器中。把“#”号放在立即数前面，以表示该寻址方式为立即寻址，如mov A,#20H。
（2）寄存器寻址：操作数放在寄存器中，在指令中直接以寄存器的名来表示操作数地址。如MOV A，R0就属于寄存器寻址，即R0寄存器的内容送到累加器A中。
（3）直接寻址：操作数放在单片机的内部RAM某单元中，在指令中直接写出该单元的地址。如前例的ADD A，70H中的70H。
（4）寄存器间接寻址：操作数放在RAM某个单元中，该单元的地址又放在寄存器R0或R1中。 如果RAM的地址大于256，则该地址存放在16位寄存器DPTR（数据指针）中，此时在寄存器名前加@符号来表示这种间接寻址。如MOV A，@ R0。
（5）变址寻址：指定的变址寄存器的内容与指令中给出的偏移量相加，所得的结果作为操作数的地址。如MOVC A，@A+DPTR
（6）相对寻址：由程序计数器中的基地址与指令中提供的偏移量相加，得到的为操作数的地址。如SJMP rel
（7）位寻址：操作数是二进制中的某一位，其位地址出现在指令中。如SETB bit 
MCS51的指令系统按功能分有：数据传送类、转移指令、算术运算类、逻辑运算类、和十进制指令及一些伪指令共111个。详细说明如下：
算术运算指令
1．ADD A,Rn 将累加器与寄存器的内容相加，结果存回累加器
2．ADD A,direct 将累加器与直接地址的内容相加，结果存回累加器
3．ADD A,@Ri 将累加器与间接地址的内容相加，结果存回累加器
4．ADD A,#data 将累加器与常数相加，结果存回累加器
5．ADDC A,Rn 将累加器与寄存器的内容及进位C相加，结果存回累加器
6．ADDC A,direct 将累加器与直接地址的内容及进位C相加，结果存回累加器
7．ADDC A,@Ri 将累加器与间接地址的内容及进位C相加，结果存回累加器
8．ADDC A,#data 将累加器与常数及进位C相加，结果存回累加器
9．SUBB A,Rn 将累加器的值减去寄存器的值减借位C，结果存回累加器
10．SUBB A,direct 将累加器的值减直接地址的值减借位C，结果存回累加器
11．SUBB A,@Ri 将累加器的值减间接地址的值减借位C，结果存回累加器
12．SUBB A,#data 将累加器的值减常数值减借位C，结果存回累加器
13．INC A 将累加器的值加1
14．INC Rn 将寄存器的值加l
15．INC direct 将直接地址的内容加1
16．INC @Ri 将间接地址的内容加1
17．INC DPTR 数据指针寄存器值加1
说明：将16位的DPTR加1，当DPTR的低字节(DPL)从FFH溢出至00H时，会使高字节(DPH)加1，不影响任何标志位 
18．DEC A 将累加器的值减1
19．DEC Rn 将寄存器的值减1
20．DEC direct 将直接地址的内容减1
21．DEC @Ri 将间接地址的内容减1
22．MUL AB 将累加器的值与B寄存器的值相乘，乘积的低位字节存回累加器，高位字节存回B寄存器
说明：将累加器A和寄存器B内的无符号整数相乘，产生16位的积，低位字节存入A，高位字节存入B寄存器。如果积大于FFH，则溢出标志位(OV)被设定为1，而进位标志位为0 
23．DIV AB 将累加器的值除以B寄存器的值，结果的商存回累加器，余数存回B寄存器
说明：无符号的除法运算，将累加器A除以B寄存器的值，商存入A，余数存入B。执行本指令后，进位位(C)及溢出位(OV)被清除为0 
24．DA A 将累加器A作十进制调整，
若(A) 3-0>9或(AC)=1，则(A) 3-0←(A)3-0+6 
若(A) 7-4>9或(C)=1，则(A) 7-4←(A)7-4+6 
逻辑运算指令 
25．ANL A,Rn 将累加器的值与寄存器的值做AND的逻辑判断，结果存回累加器
26．ANL A,direct 将累加器的值与直接地址的内容做AND的逻辑判断，结果存回累加器
27．ANL A,@Ri 将累加器的值与间接地址的内容做AND的逻辑判断，结果存回累加器
28．ANL A,#data 将累加器的值与常数做AND的逻辑判断，结果存回累加器
29．ANL direct,A 将直接地址的内容与累加器的值做AND的逻辑判断，结果存回该直接地址
30．ANL direct,#data 将直接地址的内容与常数值做AND的逻辑判断，结果存回该直接地址
31．ORL A,Rn 将累加器的值与寄存器的值做OR的逻辑判断，结果存回累加器
32．ORL A,direct 将累加器的值与直接地址的内容做OR的逻辑判断，结果存回累加器
33．ORL A,@Ri 将累加器的值与间接地址的内容做OR的逻辑判断，结果存回累加器
34．ORL A,#data 将累加器的值与常数做OR的逻辑判断，结果存回累加器
35．ORL direct,A 将直接地址的内容与累加器的值做OR的逻辑判断，结果存回该直接地址
36．ORL direct,#data 将直接地址的内容与常数值做OR的逻辑判断，结果存回该直接地址
37．XRL A,Rn 将累加器的值与寄存器的值做XOR的逻辑判断，结果存回累加器
38．XRL A,direct 将累加器的值与直接地址的内容做XOR的逻辑判断，结果存回累加器
39．XRL A,@Ri 将累加器的值与间接地扯的内容做XOR的逻辑判断，结果存回累加器
40．XRL A,#data 将累加器的值与常数作XOR的逻辑判断，结果存回累加器
41．XRL direct,A 将直接地址的内容与累加器的值做XOR的逻辑判断，结果存回该直接地址
42．XRL direct,#data 将直接地址的内容与常数的值做XOR的逻辑判断，结果存回该直接地址
43．CLR A 清除累加器的值为0
44．CPL A 将累加器的值反相
45．RL A将累加器的值左移一位
46．RLC A 将累加器含进位C左移一位
47．RR A 将累加器的值右移一位
48．RRC A 将累加器含进位C右移一位
49．SWAP A 将累加器的高4位与低4位的内容交换。(A)3-0←(A)7-4
数据转移指令 
50．MOV A,Rn 将寄存器的内容载入累加器
51．MOV A,direct 将直接地址的内容载入累加器
52．MOV A,@Ri 将间接地址的内容载入累加器
53．MOV A,#data 将常数载入累加器
54．MOV Rn，A 将累加器的内容载入寄存器
55．MOV Rn,direct 将直接地址的内容载入寄存器
56．MOV Rn,gdata 将常数载入寄存器
57．MOV direct,A 将累加器的内容存入直接地址
58．MOV direct,Rn 将寄存器的内容存入直接地址
59．MOV direct1, direct2将直接地址2的内容存入直接地址1
60．MOV direct,@Ri将间接地址的内容存入直接地址
61．MOV direct,#data将常数存入直接地址
62．MOV @Ri,A将累加器的内容存入某间接地址
63．MOV @Ri,direct 将直接地址的内容存入某间接地址
64．MOV @Ri,#data 将常数存入某间接地址
65．MOV DPTR,#data16 将16位的常数存入数据指针寄存器
66．MOVC A,@A+DPTR 1 2 (A) ←((A)+(DPTR))
累加器的值再加数据指针寄存器的值为其所指定地址，将该地址的内容读入累加器 
67．MOVC A,@A+PC 1 2 (PC)←(PC)+1；(A)←((A)+(PC))累加器的值加程序计数器的值作为其所指定地址，将该地址的内容读入累加器
68．MOVX A,@Ri 将间接地址所指定外部存储器的内容读入累加器(8位地址)
69．MOVX A,@DPTR 将数据指针所指定外部存储器的内容读入累加器(16位地址)
70．MOVX @Ri,A 将累加器的内容写入间接地址所指定的外部存储器(8位地址)
71．MOVX @DPTR,A 将累加器的内容写入数据指针所指定的外部存储器(16位地址)
72．PUSH direct 将直接地址的内容压入堆栈区
73．POP direct 从堆栈弹出该直接地址的内容
74．XCH A,Rn 将累加器的内容与寄存器的内容互换
75．XCH A,direct 将累加器的值与直接地址的内容互换
76．XCH A,@Ri 将累加器的值与间接地址的内容互换
77．XCHD A,@Ri 将累加器的低4位与间接地址的低4位互换
布尔代数运算 
78．CLR C 清除进位C为0
79．CLR bit 清除直接地址的某位为0
80．SETB C 设定进位C为1
81．SETB bit 设定直接地址的某位为1
82．CPL C 将进位C的值反相
83．CPL bit 将直接地址的某位值反相
84．ANL C,bit 将进位C与直接地址的某位做AND的逻辑判断，结果存回进位C
85．ANL C,/bit 将进位C与直接地址的某位的反相值做AND的逻辑判断，结果存回进位C
86．ORL C,bit将进位C与直接地址的某位做OR的逻辑判断，结果存回进位C
87．ORL C,/bit 将进位C与直接地址的某位的反相值做OR的逻辑判断，结果存回进位C
88．MOV C,bit 将直接地址的某位值存入进位C
89．MOV bit,C 将进位C的值存入直接地址的某位
90．JC rel若进位C=1则跳至rel的相关地址
91．JNC rel 若进位C=0则跳至rel的相关地址
92．JB bit,rel 若直接地址的某位为1，则跳至rel的相关地址
93．JNB bit,rel 若直接地址的某位为0，则跳至rel的相关地址
94．JBC bit,rel 若直接地址的某位为1，则跳至rel的相关地址，并将该位值清除为0
程序跳跃 
95．ACALL addr11 调用2K程序存储器范围内的子程序
96．LCALL addr16 调用64K程序存储器范围内的子程序
97．RET 从子程序返回
98．RETI 从中断子程序返回
99．AJMP addr11 绝对跳跃(2K内)
100．LJMP addr16 长跳跃(64K内)
101．SJMP rel 短跳跃(2K内)-128～+127字节
102．JMP @A+DPTR 跳至累加器的内容加数据指针所指的相关地址
103．JZ rel 累加器的内容为0，则跳至rel所指相关地址
104．JNZ rel 累加器的内容不为0，则跳至rel所指相关地址
105．CJNE A,direct,rel 将累加器的内容与直接地址的内容比较，不相等则跳至rel所指的相关地址
106．CJNE A,#data,rel 将累加器的内容与常数比较，若不相等则跳至rel所指的相关地址
107．CJNE @Rn,#data,rel 将寄存器的内容与常数比较，若不相等则跳至rel所指的相关地址
108．CJNE @Ri,#data,rel 将间接地址的内容与常数比较，若不相等则跳至rel所指的相关地址
109．DJNZ Rn,rel 将寄存器的内容减1，不等于0则跳至rel所指的相关地址
110．DJNZ direct,rel 将直接地址的内容减1，不等于0则跳至rel所指的相关地址
111．NOP 无动作
内部总体结构其基本特性
MCS51单片机的内部总体结构其基本特性如下：
8位CPU、片内振荡器、4k字节ROM、128字节RAM、21个特殊功能寄存器、32根I/O线、可寻址的64k字节外部数据、程序存贮空间、2个16位定时器、计数器中断结构：具有二个优先级、五个中断源一个全双口串行口位寻址（即可寻找某位的内容）功能，适于按位进行逻辑运算的位处理器。除128字节RAM、4k字节ROM和中断、串行口及定时器模块外，还有4组I/O口P0～P3，余下的就是CPU的全部组成。把4kROM换为EPROM就是8751的结构，如去掉ROM/EPROM部分即为8031，如果将ROM置换为Flash存贮器或EEPROM，或再省去某些I/O，即可得到51系列的派生品种，如89C51、AT89C2051等单片机。单片机各部分是通过内部的总线有机地连接起来的。