1、程序存储器的ROM的最大空间是64KB,因为地址线是16根,2^16 = 64 KB。80C51单片机,其内部有4KB ROM,外部ROM的最大容量是60KB;
2、80C51片内4 KB ROM 的地址为:0000H~0FFFH (2^12 = 4 KB),片外60 KB ROM的地址为:1000H~FFFFH(2^16 - 2^12 = 60 KB);
3、80C51单片机,正常运行时:EA(非)端接高电平,CPU从内部ROM中读取程序;当PC值超过内部ROM,才会转向外部ROM;
4、片内ROM的保留单元:
保留单元地址 | 入口地址 | 用途 |
---|---|---|
0000H~0002H | 0000H | 复位后初始化引导程序 |
0003H~000AH | 0003H | 外部中断0中断服务程序 |
000BH~0012H | 000BH | 定时/计数器0中断服务程序 |
0013H~001AH | 0013H | 外部中断1中断服务程序 |
001BH~0022H | 001BH | 定时/计数器1中断服务程序 |
0023H~002AH | 0023H | 串行口中断服务程序 |
002BH~0032H | 002BH | 定时/计数器2中断服务程序 |
1、数据存储器用于存放运算的中间结果、暂存和缓冲数据及标志位等;
2、51系列单片机内部RAM有256B,地址为:00H~0FFH(2^8 = 256 B);可拓展的外部RAM最大空间为64KB,地址为:0000H~0FFFFH(2^16 = 64 KB);
3、片内256B的RAM又分为:低128单元(00H~7FH)(2^7 = 128 B)RAM区;高128单元(80H~0FFH)(2^8 - 2^7 = 128B)的特殊功能寄存器区(SFR区);
4、低128单元分为:①通用寄存器区(00H~1FH)(2^5 = 32 B):从第0组到第3组,共计有4组通用寄存器区;②位寻址区(20H~2FH)(16B = 128位);③用户RAM区(30H~7FH)(4FH = 80B);
5、通用寄存器区/工作寄存器区:常用于存放操作数及中间结果。32个寄存器分为4组,每组8个,每个寄存器都是8位,每组都以R0~R7作为寄存器单元编号。
寄存器名称 | 地址 | |||
---|---|---|---|---|
第0组 | 第1组 | 第2组 | 第3组 | |
R0 | 00H | 08H | 10H | 18H |
R1 | 01H | 09H | 11H | 19H |
R2 | 02H | 0AH | 12H | 1AH |
R3 | 03H | 0BH | 13H | 1BH |
R4 | 04H | 0CH | 14H | 1CH |
R5 | 05H | 0DH | 15H | 1DH |
R6 | 06H | 0EH | 16H | 1EH |
R7 | 07H | 0FH | 17H | 1FH |
6、第0组寄存器被默认为通用寄存器组,其他需要设置PSW中的RS1、RS0两位,没被选中的寄存器可作为一般的数据缓冲器使用。
RS1 | RS0 | 组号 |
---|---|---|
1 | 1 | 3 |
1 | 0 | 2 |
0 | 1 | 1 |
0 | 0 | 0 |
7、位寻址区16个字节**(16B = 128位)**中的每一位都有一个特定的位地址
8、用户RAM区(30H~7FH)(80个单元),这些单元可以用作:数据缓冲器使用,也可作为堆栈以保存子程序调用或响应中断时的断点和现场。
9、特殊功能寄存器区(SFR区)(字节地址能被8和0整除)
符号 | 名称 | 字节地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|---|
TCON | 定时/计数器状态字 | 88H | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
8FH | 8EH | 8DH | 8CH | 8BH | 8AH | 89H | 88H | |||
TMOD | 定时/计数器方式控制字 | 89H | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
SCON | 串口控制寄存器 | 98H | SM0 | SM1 | SM2 | REN | TB8 | RB8 | T1 | R1 |
9FH | 9EH | 9DH | 9CH | 9BH | 9AH | 99H | 98H | |||
IE | 中断允许控制寄存器 | A8H | EA | - | - | ES | ET1 | EX1 | ET0 | EX0 |
AFH | AEH | ADH | ACH | ABH | AAH | A9H | A8H | |||
IP | 中断优先级控制寄存器 | B8H | - | - | - | PS | PT1 | PX1 | PT0 | PX0 |
BFH | BEH | BDH | BCH | BBH | BAH | B9H | B8H | |||
PSW | 程序状态字 | D0H | CY | AC | F0 | RS1 | RS0 | OV | - | P |
D7H | D6H | D5H | D4H | D3H | D2H | D1H | D0H |
(1)累加器(A/ACC);
(2)B寄存器:主要与累加器配合完成乘法和除法运算;
(3)程序状态字(PSW):8位的寄存器,用于存放程序运行的状态信息及运算结果的标志
PSW | 程序状态字 | CY | AC | F0 | RS1 | RS0 | OV | - | P |
---|
①CY:进位标志位,最高位有进位或借位时,CY置1;无进位或错位时,CY清0;
②AC:辅助进位标志位,低4位向高4位有进位或借位时,CY置1;无进位或错位时,CY清0;
③F0:用户标志位
④RS1和RS0:通用寄存器组选择位
⑤OV:溢出标志位,溢出OV置1,没溢出OV清0
⑥P:奇偶校验位,如果A中有奇数个“1”,则P为1;否则P为0;
(4)数据指针(DPTR):唯一一个可寻址的16位寄存器。在访问外部RAM时,DPTR作为地址指针使用;
(5)堆栈指针(SP):堆栈的操作方式有两种:
①自动方式:在调用子程序或者产生中断时,CPU自动将断点压入堆栈;程序返回时,断点自动弹回给PC指针;
②指令方式:入栈指令PUSH,出栈指令POP;
PS:SP的复位值为07H,堆栈数据从08H开始存放,这样会导致通用寄存器无法使用,所以程序一开始就需要将SP设置为30H,这样堆栈就会开辟在用户RAM区(30H~7FH)。
(6)程序计数器(PC):PC是一个16位计数器,专门用于存放CPU将要执行的指令地址(即下一条指令的地址)。
1、51单片机用4个8位并行I/O口(P0~P3)和一个串行I/O口。并行I/O口一次可传送8位二进制数据,串行I/O一次仅能传送1位二进制数据。
第一功能:准双向三态I/O口
特别注意:P0作为输入口时,必须先向锁存器写入高电平,使输出驱动电路中的T1截止,P0口处于高阻态,具有高阻抗输入特性。
第二功能:CPU在访问存储器时,可以作为地址/数据分时复用的端口,地址单向输出,数据双向传输。
PS:拓展外部RAM或者ROM时,P0口只能作为第二功能,输出低八位地址。
第一功能:准双向I/O口
特别注意:P1作为输入口时,必须先向锁存器写入高电平,使输出驱动电路中的T截止。
第二功能:①P1.0:定时/计数器2的外部触发计数脉冲输入端;
②P1.1:定时/计数器2的捕获、重装触发控制输入端。
第一功能:准双向I/O口
特别注意:P2作为输入口时,必须先向锁存器写入高电平,使输出驱动电路中的T截止。
第二功能:拓展外部存储器时,输出高8位地址,与P0口组成16位地址。
第一功能:准双向I/O口
特别注意:P3作为输入口时,必须先向锁存器写入高电平,使输出驱动电路中的T截止。
第二功能:①中断信号,②外部RAM的读写控制口
引脚 | 第二功能符号 | 第二功能名称 |
---|---|---|
P3.0 | RXD | 串行数据接受 |
P3.1 | TXD | 串行数据发送 |
P3.2 | INT0(非) | 外部中断0申请 |
P3.3 | INT1(非) | 外部中断1申请 |
P3.4 | T0 | 定时/计数器0的计数输入 |
P3.5 | T1 | 定时/计数器1的计数输入 |
P3.6 | WR(非) | 外部数据存储器写选通 |
P3.7 | RD(非) | 外部数据存储器读选通 |
1、晶振周期/振荡周期/拍节: P = 1/Fosc;
2、时钟周期/状态:S = 2P;
3、机器周期/扫描周期 = 6S = 12P;
eg:Fosc = 12 MHz P = 1/12us 机器周期 = 1us
MOV A,#70H ;将立即数70H传送到累加器A
MOV A,R0 ;将寄存器R0中的内容传送到累加器A
累加器ACC、B寄存器、数据指针DPTA和进位C也可以用于寄存器寻址方式访问,只是对它们寻址,具体寄存器名称隐含在操作码中。
MOV A,70H ;将片内RAM地址为70H的单元的内容送到A中。
直接寻址方式用于访问以下存储空间:
①SFR
eg:
MOV A,80H
可以写成
MOV A,P0
(P0口的地址为80H)
②片内数据存储器低于128字节
③位地址空间
MOV A,@R1 ;将以寄存器R1的内容为地址的片内RAM单元的数据传送到A
可用作寄存器间接寻址的寄存器:R0,R1,DPTR
MOVC A,@A+DPTR
PC值:相对转移指令的存储地址+该指令字节数
eg:
JZ rel ;它是一条若累加器A为0就转移的双字节指令
;该指令的存储地址为2050H
;则当前PC值为2052H
偏移量rel:有符号,单字节,补码表示,负数表示从当前地址向前转移,正数表示向后。
目标地址=指令存储地址+指令字节数+rel
适用范围:①内部RAM 20H2FH单元中的位(007FH)或者SFR中具有位地址的。
MOV C,20H ;将20H位的值送给进位位CY,20H为位地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-goVlLGHw-1656075156497)(C:\Users\26449\AppData\Roaming\Typora\typora-user-images\image-20220622220132294.png)]
TCON | 定时/计数器状态字 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
---|---|---|---|---|---|---|---|---|---|
TMOD | 定时/计数器方式控制字 | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
SCON | 串口控制寄存器 | SM0 | SM1 | SM2 | REN | TB8 | RB8 | T1 | R1 |
IE | 中断允许控制寄存器 | EA | - | - | ES | ET1 | EX1 | ET0 | EX0 |
IP | 中断优先级控制寄存器 | - | - | - | PS | PT1 | PX1 | PT0 | PX0 |
TCON | 定时/计数器状态字 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
---|
(1)IT0:外部中断0信号方式控制位
IT0 = 0时,外部中断0为电平触发,INT0(非)为低电平时有效;
IT0 = 1时,外部中断0为边沿触发,INT0(非)为负跳变时有效。
(2)IE0:外部中断0中断请求标志位
检测到中断信号时,该位由硬件置位,请求中断;
在边沿触发方式下,IE0由硬件清零;在电平触发模式下,只能由软件清零。
(3)(4)IT1和IE1同理
(5)TR0是T0的运行控制位
由软件置1和清0,当TR0 = 0时,停止计数;当TR0 = 1时,启动计数。
(6)TF0溢出标志位
T0产生溢出信号,TF0置1;如果溢出,TF0需用软件清0。
(7)(8)TR1和TF1同理
TMOD | 定时/计数器方式控制字 | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
---|
(1)M1 M0:定时器四种工作方式选择位
M1 M0 = 00 | 工作方式0 | 13位定时/计数器工作方式 |
---|---|---|
M1 M0 = 01 | 工作方式1 | 16位定时/计数器工作方式 |
M1 M0 = 10 | 工作方式2 | 自动重装载8位定时/计数器工作方式 |
M1 M0 = 11 | 工作方式3 | 两个独立8位定时/计数器(仅T0可用,T1停止工作) |
(2)C/T(非):功能选择位
C/T(非)=0时为定时功能: 加1计数器对脉冲f进行计数,每来一个脉冲,计数器加1,直到计时器TFx满溢出;
C/T(非)=1时为计数功能: 加1计数器对来自输入引脚T0(P3.4)和T1(P3.5)的外信号脉冲进行计数,每来一个脉冲,计数器加1,直到计时器TFx满溢出;
(3)GATE:门控位
GATE = 0时,仅由TCON中的TR0(TR1)位启动/停止T0(T1);
GATE = 1时,T0(T1)的启动或停止受外部中断信号INT0(非)(P3.2)或 INT1(非)(P3.3)的控制,此时TR0(TR1)需置位。
以下各位都是为0禁止,置1允许
IE | 中断允许控制寄存器 | EA | - | - | ES | ET1 | EX1 | ET0 | EX0 |
---|
(1)EX0:外部中断0允许位
(1)ET1:定时/计数器0中断允许位
(1)EX1:外部中断1允许位
(1)ET1:定时/计数器1中断允许位
(1)ES:串行口中断允许位
(1)EA:中断允许总控制位
IP | 中断优先级控制寄存器 | - | - | - | PS | PT1 | PX1 | PT0 | PX0 |
---|
中断自然优先级(由高到低):外部中断0、定时/计数器0、外部中断1、定时/计数器1、串行口中断
若某一位置1,则相应的中断源为高优先级;若某一位为0,则则相应的中断源为低优先级。
SCON | 串口控制寄存器 | SM0 | SM1 | SM2 | REN | TB8 | RB8 | T1 | R1 |
---|
(1)SM0和SM1:串行接口工作方式设置位
SM0 | SM1 | 工作方式 | 功能说明 | 波特率 |
---|---|---|---|---|
0 | 0 | 方式0 | 同步移位寄存器,用于I/O拓展 | fosc/12 |
0 | 1 | 方式1 | 10位异步收发器 | 由定时器T1溢出率控制 |
1 | 0 | 方式2 | 11位异步收发器 | fosc/32或fosc/64 |
1 | 1 | 方式3 | 11位异步收发器 | 由定时器T1溢出率控制 |
方式0:波特率 = fosc/12
方式1和方式3:
波 特 率 = 2 S 32 ∗ f o s c 12 ( 256 − X ) 波特率 = \frac{2^S}{32}*\frac{fosc}{12(256-X)} 波特率=322S∗12(256−X)fosc
其中:S = SMOD
方式2:
波 特 率 = 2 S 64 ∗ f o s c 波特率 = \frac{2^S}{64}*fosc 波特率=642S∗fosc
其中:S = SMOD
(2)SM2:方式2和方式3主要用于多机通信控制
当串行接口工作在方式2或方式3时,若SM2=1,则允许多机通信。
多机通信规定:第9位数据位为1 (即TB8=1),说明本帧数据为地址帧:第9位数据为0(即TB8=0),则本帧数据为数据帧。
当从机接收到的第9位数据(在RB8中)为1时,数据才装入接收缓冲器SBUF,并置RI=1向CPU申请中断;如果接收到的第9位数据(在RB8中)为0,则不置位中断标志RI且信息丢失。
当SM2=0时,则不管接收到第9位数据是否为1,都产生中断标志RI,并将接收到的数据装入SBUF。应用这一特点可以实现多机通信。
串行口工作在方式0时,SM2必须设置为0;工作在方式1时,如SM2=1,则只有接收到有效的停止位时才会激活RI。
(3)REN:允许接收控制位
当REN=1时,允许接收;当REN=0时,禁止接收。此位由软件置1或清零。
(4)TB8:发送数据的第9位
在方式2和方式3中,在多机通信中作为发送地址帧或数据帧的标志。
TB8=1,说明该发送帧为地址帧;TB8=0,说明该发送帧为数据帧。
在许多通信协议中,它可作为奇偶校验位。此位由软件置1或清零。在方式0和方式1中,此位未使用。
(5)RB8: 接收数据的第9位
在方式2和方式3中,接收到的第9位数据放在RB8中。它或是约定的奇/偶校验位,或是约定的地址/数据标志位。
在方式2和方式3多机通信中,RB8=1,说明该接收帧为地址帧;RB8=0,说明该接收帧为数据帧。
(6)TI: 发送中断标志位
在一帧数据发送完时,由硬件置位。
TI=1,可申请中断,说明发送缓冲器SBUF已空,CPU可以发送下一帧数据。中断被响应后,TI不能自动清零,必须由软件清零。
(7)RI: 接收中断标志位
在接收到一帧有效数据后,由硬件置位。
RI=1,可申请中断,表示一帧数据接收结束,并已装入接收缓冲器SBUF中。CPU响应中断,取走数据后,RI不能自动清零,必须由软件
清零。
串行口发送中断标志TI和接收中断标志RI共为一个中断源。因此,CPU接收到中断请求后,不知道是发送中断TI还是接收中断RI,必须用软件来判别。单片机复位后,控制寄存器SCON的各位均清零。
最高位D7:SMOD:串行接口波特率的倍率控制位。
在方式1、方式2和方式3下,当SMOD = 1时,波特率加倍;当SMOD = 0时,波特率不加倍,即波特率和2^SMOD成正比。
1、单片机复位时,SMOD = 0
2、PCON没有位地址,要操作SMOD,需要对整个寄存器进行操作
晶振频率为fosc, 晶振周期:P = 1/fosc, 机器周期 = 12P = 12/fosc;
设定计数初始值为X,定时时间Tc
(1)在工作方式0的情况下,13位定时/计数器,溢出值为2^13 = 8192
① 计数值 = 溢出值 - 计数初值 = 8192 - X;
② 定时时间Tc = 机器 * 计数值 =
T c = 12 ∗ ( 8192 − X ) f o s c Tc = \frac{12*(8192 - X)}{fosc} Tc=fosc12∗(8192−X)
③计数值计算公式:
X = 8192 − T c ∗ f o s c 12 X = 8192 - \frac{Tc*fosc}{12} X=8192−12Tc∗fosc
(2)在工作方式1的情况下,16位定时/计数器,溢出值为2^16 = 65536
① 计数值 = 溢出值 - 计数初值 = 65536 - X;
② 定时时间Tc = 机器 * 计数值 =
T c = 12 ∗ ( 65536 − X ) f o s c Tc = \frac{12*(65536 - X)}{fosc} Tc=fosc12∗(65536−X)
③计数值计算公式:
X = 65536 − T c ∗ f o s c 12 X = 65536 - \frac{Tc*fosc}{12} X=65536−12Tc∗fosc