本目录主要用于实现MCS-51模拟器。对于非嵌入式平台可采用ucsim工具,本目录也参考其实现相应功能。
- Keil C51:MCS-51 集成开发环境。
- SDCC:支持MCS-51的编译器。
- mcu8051ide:MCS-51 集成开发环境,采用SDCC,支持模拟器,支持外设(如LED显示)。
编译器推荐使用SDCC,可采用部分较新的C语言特性。
注意:此章节的说明适用于SDCC,不适用于Keil C51。
- 内部RAM地址空间:
__data、__idata
- 外部RAM地址空间:
__xdata、__pdata
- 程序ROM地址空间:
__code
内存模型只影响默认的变量分配(如参数与局部变量),若用户指定变量存储位置,则不受影响。
- 128字节RAM(只可直接寻址)
- 128字节SFR(只可直接寻址)
- ROM空间不限(小于64KB)
此模型没有特定的编译器选项,可使用--model-small --iram-size 128
指定此模型。
- 256字节RAM(高128字节需要间接寻址,低128字节可直接寻址也可间接寻址)
- 128字节SFR(只可直接寻址)
- ROM空间不限(小于64KB)
可使用--model-small --iram-size 256
指定此模型。
- 256字节RAM(高128字节需要间接寻址,低128字节可直接寻址也可间接寻址)
- 256字节外部RAM(也可小于256字节)
- 128字节SFR(只可直接寻址)
- ROM空间不限(小于64KB)
可使用--model-medium --xram-size 外部RAM字节数
指定此模型。
- 256字节RAM(高128字节需要间接寻址,低128字节可直接寻址也可间接寻址)
- 64KB外部RAM(可小于64KB)
- 128字节SFR(只可直接寻址)
- ROM空间不限(小于64KB)
可使用--model-large --xram-size 外部RAM字节数
指定此模型。
- 256字节RAM(高128字节需要间接寻址,低128字节可直接寻址也可间接寻址)
- 64KB外部RAM(可小于64KB)
- 128字节SFR(只可直接寻址)
- ROM空间不限(大于64KB,ROM空间被分为两块,0-0x7FFF的映射不可改变,0x8000-0xFFFF可通过某个SFR切换映射关系以突破64KB限制)
可使用--model-huge --xram-size 外部RAM字节数
指定此模型。
MCS-51的经典外设如下:
- 定时器:至少2个16位定时器。
- 串口:具有一个串口外设。
对于各种基于8051内核的单片机而言,或许有更多类型的外设,但不在此章节描述。
名称 | SFR地址 | 说明 |
---|---|---|
SCON | 98H | 串口控制 |
PCON | 87H | 电源控制 |
IE | A8H | 中断使能 |
IP | B8H | 中断优先级 |
SBUF | 99H | 串口缓冲,写入/读取此寄存器表示发送/接收数据 |
名称 | 位(相对与寄存器) | 说明 |
---|---|---|
SM0 | 7 | 与SM1共同选择工作模式。 |
SM1 | 6 | 与SM0共同选择工作模式。模式0=同步位移模式,模式1=8位UART(波特率可变),模式2=9位UART,模式3=9位UART(波特率可变)。可变波特率时由定时器决定波特率。 |
SM2 | 5 | 在工作模式2与3时,选择多机通信还是单机通信,SM2=1时选择多机模式,SM2=0时选择双机模式。模式1需要清0。多机模式下,只接收RB8=1的地址数据。 |
REN | 4 | 接收使能。REN=1时允许接收。 |
TB8 | 3 | 发送数据第9位。 |
RB8 | 2 | 接收数据第9位。 |
TI | 1 | 发送中断请求。TI=1时有中断请求。 |
RI | 0 | 接收中断请求。RI=1时有中断请求。 |
注意:
- 双机(一对一)模式下,SM2必须清零。
- 多机(一主多从)模式下,主机发送地址数据时,SM2必须置位,接收数据时SM2必须清零,从机必须先将SM2置位接收地址数据,当接收到正确的地址后,从机才可以将SM2清零接收普通数据。
名称 | 位(相对于寄存器) | 说明 |
---|---|---|
SMOD | 7 | SMOD=1,波特率加倍。 |
注意:
- 只描述串口相关位
名称 | 位(相对于寄存器) | 说明 |
---|---|---|
EA | 7 | 全局中断使能。EA=1全局开中断。 |
ES | 4 | 串口中断使能。ES=1使能串口中断。 |
注意:
- 只描述串口相关位
名称 | 位(相对于寄存器) | 说明 |
---|---|---|
PS | 4 | 串口中断优先级。PS=1时串口为高优先级中断。 |
注意:
- 只描述串口相关位
8位串口数据。写入代表发送数据,读取表示接收数据。
名称 | SFR地址 | 说明 |
---|---|---|
TCON | 88H | 定时器/计数器控制 |
TMOD | 89H | 定时器/计数器模式控制 |
TL0 | 8AH | 定时器0低8位 |
TL1 | 8BH | 定时器1低8位 |
TH0 | 8CH | 定时器0高8位 |
TH1 | 8DH | 定时器1高8位 |
IE | A8H | 中断使能 |
IP | B8H | 中断优先级 |
名称 | 位(相对于寄存器) | 说明 |
---|---|---|
TF1 | 7 | 定时器1溢出标志。当中断过程结束时自动清0。 |
TR1 | 6 | 定时器1运行控制。 |
TF0 | 5 | 定时器0溢出标志。当中断过程结束时自动清0。 |
TR0 | 4 | 定时器0运行控制。 |
IE1 | 3 | 外部中断1标志。当中断过程结束时自动清0(边沿触发时)。 |
IT1 | 2 | 外部中断1类型控制。1=下降沿,0=低电平。 |
IE0 | 1 | 外部中断0标志。当中断过程结束时自动清0(边沿触发时)。 |
IT0 | 0 | 外部中断0类型控制。1=下降沿,0=低电平。 |
名称 | 位(相对于寄存器) | 说明 |
---|---|---|
G1 | 7 | 定时器1门控位。1=定时器由TR1与INT1引脚(高电平有效)共同控制(与),0=定时器由TR1控制。 |
CT1 | 6 | 定时器1功能选择位。1=计数器(对外部信号脉冲计数),0=定时器(对时钟信号计数)。 |
M11 | 5 | 定时器1工作模式位1,与M10共同选择工作模式。 |
M10 | 4 | 定时器1工作模式位0,与M11共同选择工作模式。0=13位定时器/计数器,1=16位定时器/计数器,2=8位自动重装载定时器/计数器,3=两个8位定时器/计数器。 |
G0 | 3 | 定时器0门控位。1=定时器由TR0与INT0引脚(高电平有效)共同控制(与),0=定时器由TR0控制。 |
CT0 | 2 | 定时器0功能选择位。1=计数器(对外部信号脉冲计数),0=定时器(对时钟信号计数)。 |
M01 | 1 | 定时器0工作模式位1,与M00共同选择工作模式。 |
M00 | 0 | 定时器0工作模式位0,与M01共同选择工作模式。0=13位定时器/计数器,1=16位定时器/计数器,2=8位自动重装载定时器/计数器,3=定时器停止。 |
定时器0低八位。
定时器1低八位。
定时器0高八位。当工作在工作模式2时,TH0为自动重装载的值。
定时器1高八位。当工作在工作模式2时,TH1为自动重装载的值。
名称 | 位(相对于寄存器) | 说明 |
---|---|---|
EA | 7 | 全局中断使能。EA=1全局开中断。 |
ET1 | 3 | 定时器1中断使能。1=启用中断。 |
EX1 | 2 | 外部中断1中断使能。1=启用中断。 |
ET0 | 1 | 定时器0中断使能。1=启用中断。 |
EX0 | 0 | 外部中断0中断使能。1=启用中断。 |
注意:
- 只描述本章节相关位
名称 | 位(相对于寄存器) | 说明 |
---|---|---|
PT1 | 3 | 定时器1中断优先级。1=高优先级。 |
PX1 | 2 | 外部中断1中断优先级。1=高优先级。 |
PT0 | 1 | 定时器0中断优先级。1=高优先级。 |
PX0 | 0 | 外部中断0中断优先级。1=高优先级。 |
注意:
- 只描述本章节相关位
MCS-51中断地址=(中断号*8)+3
,当需要执行中断过程时需要跳到中断地址。
名称 | 中断号 | 说明 |
---|---|---|
IE0 | 0 | 外部中断0 |
TF0 | 1 | 定时器0 |
IE1 | 2 | 外部中断1 |
TF1 | 3 | 定时器1 |
SI0 | 4 | 串口0中断 |
注意:
- 地址0为复位时跳转的地址(类似其它架构的复位中断),一般在此放一条长跳转指令。
中断优先级由相应寄存器(IP)设置。
最终的优先级顺序:
- 高优先级中断高于低优先级中断。
- 同一级优先级中断的执行顺序由硬件扫描顺序决定。
中断执行规则:
- 中断不能被低优先级/同一优先级中断打断。
- 高优先级中断可打断低优先级中断。
名称 | sfr地址 | 说明 |
---|---|---|
P0 | 80H | 此IO端口可位寻址,即单独对某一个引脚操作。 |
P1 | 90H | 此IO端口可位寻址,即单独对某一个引脚操作。 |
P2 | A0H | 此IO端口可位寻址,即单独对某一个引脚操作。 |
P3 | B0H | 此IO端口可位寻址,即单独对某一个引脚操作。 |
P0口可作为8位数据总线。
P0口可复用为16位地址总线低8位。
P2口可复用为16地址总线的高8位。
功能 | 位地址 | 说明 |
---|---|---|
RD | B7H | P3口引脚7 |
WR | B6H | P3口引脚6 |
T1 | B5H | P3口引脚5 |
T0 | B4H | P3口引脚4 |
INT1 | B3H | P3口引脚3 |
INT0 | B2H | P3口引脚2 |
TXD | B1H | P3口引脚1 |
RXD | B0H | P3口引脚0 |
PCON的SFR地址为87H。
名称 | 位(相对于寄存器) | 说明 |
---|---|---|
GF1 | 3 | 通用标志1,由用户决定用途。 |
GF0 | 2 | 通用标志2,由用户决定用途。 |
PD | 1 | 掉电模式。1=进入掉电模式。由复位清除。 |
IDL | 0 | 空闲模式标志。1=空闲模式,当有中断/复位发生时清除。 |
注意:
- 只描述增强的功能。
除了基础外设之外,8032/8052新增如下功能:
- 定时器2
注意:本章节只描述新增的功能。
名称 | sfr地址 | 说明 |
---|---|---|
T2CON | C8H | 定时器/计数器2控制器寄存器 |
RCAP2L | CAH | 捕获/重装载值低8位 |
RCAP2H | CBH | 捕获/重装载值高8位 |
TL2 | CCH | 定时器2低8位 |
TH2 | CDH | 定时器2高8位 |
IE | A8H | 中断使能 |
IP | B8H | 中断优先级 |
名称 | 位(相对于寄存器) | 说明 |
---|---|---|
TF2 | 7 | 定时器2溢出标志 |
EXF2 | 6 | 通过T2EX的负跳变触发捕获/重装时置位,将触发定时器2中断(若使能了定时器2中断)。 |
RCLK | 5 | 接收时钟。1=替代定时器1作为串口接收时钟。 |
TCLK | 4 | 发送时钟。1=替代定时器1作为发送接收时钟。 |
EXEN2 | 3 | 定时器外部使能。0=忽略T2EX引脚,1=当未被作为串口时钟时,由T2EX引脚触发捕获/重装载。 |
TR2 | 2 | 定时器2运行控制。 |
CT2 | 1 | 定时器2功能选择位。1=计数器(对外部信号脉冲计数),0=定时器(对时钟信号计数)。 |
CPRL2 | 0 | 定时器2捕获/重装控制。当定时器2作为串口时钟时此位被忽略。0=当定时器溢出/T2EX负跳变时自动重装,1=当T2EX负跳变时捕获(若使能了EXEN2)。 |
捕获/重装载值低8位
捕获/重装载值高8位
定时器2低8位
定时器2高8位
名称 | 位(相对于寄存器) | 说明 |
---|---|---|
EA | 7 | 全局中断使能。EA=1全局开中断。 |
ET2 | 5 | 定时器2中断使能。1=启用中断。 |
注意:
- 只描述本章节相关位
名称 | 位(相对于寄存器) | 说明 |
---|---|---|
PT2 | 5 | 定时器2中断优先级。1=高优先级。 |
注意:
- 只描述本章节相关位
MCS-51中断地址=(中断号*8)+3
,当需要执行中断过程时需要跳到中断地址。
名称 | 中断号 | 说明 |
---|---|---|
TF2 | 5 | 定时器2 |
功能 | 位地址 | 说明 |
---|---|---|
T2EX | 91H | P1口引脚1 |
T2 | 90H | P1口引脚0 |
注意:
- 只描述新增的特殊功能复用。
指令 汇编 字节 时钟周期数(针对原版MCS-51,不针对1T8051)
0x00 NOP 1 12
0x01 AJMP addr 2 24
0x02 LJMP addr 3 24
0x03 RR A 1 12
0x04 INC A 1 12
0x05 INC addr 2 12
0x06 INC @R0 1 12
0x07 INC @R1 1 12
0x08 INC R0 1 12
0x09 INC R1 1 12
0x0a INC R2 1 12
0x0b INC R3 1 12
0x0c INC R4 1 12
0x0d INC R5 1 12
0x0e INC R6 1 12
0x0f INC R7 1 12
0x10 JBC bit,addr 3 12
0x11 ACALL addr 2 24
0x12 LCALL addr 3 24
0x13 RRC A 1 12
0x14 DEC A 1 12
0x15 DEC addr 2 12
0x16 DEC @R0 1 12
0x17 DEC @R1 1 12
0x18 DEC R0 1 12
0x19 DEC R1 1 12
0x1a DEC R2 1 12
0x1b DEC R3 1 12
0x1c DEC R4 1 12
0x1d DEC R5 1 12
0x1e DEC R6 1 12
0x1f DEC R7 1 12
0x20 JB bit,addr 3 24
0x21 AJMP addr 2 24
0x22 RET 1 24
0x23 RL A 1 12
0x24 ADD A,#data 2 12
0x25 ADD A,addr 2 12
0x26 ADD A,@R0 1 12
0x27 ADD A,@R1 1 12
0x28 ADD A,R0 1 12
0x29 ADD A,R1 1 12
0x2a ADD A,R2 1 12
0x2b ADD A,R3 1 12
0x2c ADD A,R4 1 12
0x2d ADD A,R5 1 12
0x2e ADD A,R6 1 12
0x2f ADD A,R7 1 12
0x30 JNB bit,addr 3 12(?)
0x31 ACALL addr 2 24
0x32 RETI 1 24
0x33 RLC A 1 12
0x34 ADDC A,#data 2 12
0x35 ADDC A,addr 2 12
0x36 ADDC A,@R0 1 12
0x37 ADDC A,@R1 1 12
0x38 ADDC A,R0 1 12
0x39 ADDC A,R1 1 12
0x3a ADDC A,R2 1 12
0x3b ADDC A,R3 1 12
0x3c ADDC A,R4 1 12
0x3d ADDC A,R5 1 12
0x3e ADDC A,R6 1 12
0x3f ADDC A,R7 1 12
0x40 JC addr 2 24
0x41 AJMP addr 2 24
0x42 ORL addr,A 2 12
0x43 ORL addr,#data 3 24
0x44 ORL A,#data 2 12
0x45 ORL A,addr 2 12
0x46 ORL A,@R0 1 12
0x47 ORL A,@R1 1 12
0x48 ORL A,R0 1 12
0x49 ORL A,R1 1 12
0x4a ORL A,R2 1 12
0x4b ORL A,R3 1 12
0x4c ORL A,R4 1 12
0x4d ORL A,R5 1 12
0x4e ORL A,R6 1 12
0x4f ORL A,R7 1 12
0x50 JNC addr 2 24
0x51 ACALL addr 2 24
0x52 ANL addr,A 2 12
0x53 ANL addr,#data 3 24
0x54 ANL A,#data 2 12
0x55 ANL A,addr 2 12
0x56 ANL A,@R0 1 12
0x57 ANL A,@R1 1 12
0x58 ANL A,R0 1 12
0x59 ANL A,R1 1 12
0x5a ANL A,R2 1 12
0x5b ANL A,R3 1 12
0x5c ANL A,R4 1 12
0x5d ANL A,R5 1 12
0x5e ANL A,R6 1 12
0x5f ANL A,R7 1 12
0x60 JZ addr 2 24
0x61 AJMP addr 2 24
0x62 XRL addr,A 2 12
0x63 XRL addr,#data 3 24
0x64 XRL A,#data 2 12
0x65 XRL A,addr 2 12
0x66 XRL A,@R0 1 12
0x67 XRL A,@R1 1 12
0x68 XRL A,R0 1 12
0x69 XRL A,R1 1 12
0x6a XRL A,R2 1 12
0x6b XRL A,R3 1 12
0x6c XRL A,R4 1 12
0x6d XRL A,R5 1 12
0x6e XRL A,R6 1 12
0x6f XRL A,R7 1 12
0x70 JNZ addr 2 24
0x71 ACALL addr 2 24
0x72 ORL C,addr 2 24
0x73 JMP @A+DPTR 1 24
0x74 MOV A,#data 2 12
0x75 MOV addr,#data 3 24
0x76 MOV @R0,#data 2 12
0x77 MOV @R1,#data 2 12
0x78 MOV R0,#data 2 12
0x79 MOV R1,#data 2 12
0x7a MOV R2,#data 2 12
0x7b MOV R3,#data 2 12
0x7c MOV R4,#data 2 12
0x7d MOV R5,#data 2 12
0x7e MOV R6,#data 2 12
0x7f MOV R7,#data 2 12
0x80 SJMP addr 2 24
0x81 AJMP addr 2 24
0x82 ANL C,addr 2 24
0x83 MOVC A,@A+PC 1 24
0x84 DIV AB 1 48
0x85 MOV addr,addr 3 24
0x86 MOV addr,@R0 2 24
0x87 MOV addr,@R1 2 24
0x88 MOV addr,R0 2 24
0x89 MOV addr,R1 2 24
0x8a MOV addr,R2 2 24
0x8b MOV addr,R3 2 24
0x8c MOV addr,R4 2 24
0x8d MOV addr,R5 2 24
0x8e MOV addr,R6 2 24
0x8f MOV addr,R7 2 24
0x90 MOV DPTR,#data 3 24
0x91 ACALL addr 2 24
0x92 MOV addr,C 2 24
0x93 MOVC A,@A+DPTR 1 24
0x94 SUBB A,#data 2 12
0x95 SUBB A,addr 2 12
0x96 SUBB A,@R0 1 12
0x97 SUBB A,@R1 1 12
0x98 SUBB A,R0 1 12
0x99 SUBB A,R1 1 12
0x9a SUBB A,R2 1 12
0x9b SUBB A,R3 1 12
0x9c SUBB A,R4 1 12
0x9d SUBB A,R5 1 12
0x9e SUBB A,R6 1 12
0x9f SUBB A,R7 1 12
0xa0 ORL C,/addr 2 24
0xa1 AJMP addr 2 24
0xa2 MOV C,addr 2 12
0xa3 INC DPTR 1 24
0xa4 MUL AB 1 48
0xa5 ****************Breakpoint
0xa6 MOV @R0,addr 2 24
0xa7 MOV @R1,addr 2 24
0xa8 MOV R0,addr 2 24
0xa9 MOV R1,addr 2 24
0xaa MOV R2,addr 2 24
0xab MOV R3,addr 2 24
0xac MOV R4,addr 2 24
0xad MOV R5,addr 2 24
0xae MOV R6,addr 2 24
0xaf MOV R7,addr 2 24
0xb0 ANL C,/addr 2 24
0xb1 ACALL addr 2 24
0xb2 CPL bitaddr 2 12
0xb3 CPL C 1 12
0xb4 CJNE A,#data,addr 3 24
0xb5 CJNE A,addr,addr 3 24
0xb6 CJNE @R0,#data,addr 3 24
0xb7 CJNE @R1,#data,addr 3 24
0xb8 CJNE R0,#data,addr 3 24
0xb9 CJNE R1,#data,addr 3 24
0xba CJNE R2,#data,addr 3 24
0xbb CJNE R3,#data,addr 3 24
0xbc CJNE R4,#data,addr 3 24
0xbd CJNE R5,#data,addr 3 24
0xbe CJNE R6,#data,addr 3 24
0xbf CJNE R7,#data,addr 3 24
0xc0 PUSH addr 2 24
0xc1 AJMP addr 2 24
0xc2 CLR bitaddr 2 12
0xc3 CLR C 1 12
0xc4 SWAP A 1 12
0xc5 XCH A,addr 2 12
0xc6 XCH A,@R0 1 12
0xc7 XCH A,@R1 1 12
0xc8 XCH A,R0 1 12
0xc9 XCH A,R1 1 12
0xca XCH A,R2 1 12
0xcb XCH A,R3 1 12
0xcc XCH A,R4 1 12
0xcd XCH A,R5 1 12
0xce XCH A,R6 1 12
0xcf XCH A,R7 1 12
0xd0 POP addr 2 24
0xd1 ACALL addr 2 24
0xd2 SETB addr 2 12
0xd3 SETB C 1 12
0xd4 DA A 1 12
0xd5 DJNZ addr,addr 3 24
0xd6 XCHD A,@R0 1 12
0xd7 XCHD A,@R1 1 12
0xd8 DJNZ R0,addr 2 24
0xd9 DJNZ R1,addr 2 24
0xda DJNZ R2,addr 2 24
0xdb DJNZ R3,addr 2 24
0xdc DJNZ R4,addr 2 24
0xdd DJNZ R5,addr 2 24
0xde DJNZ R6,addr 2 24
0xdf DJNZ R7,addr 2 24
0xe0 MOVX A,@DPTR 1 24
0xe1 AJMP addr 2 24
0xe2 MOVX A,@R0 1 24
0xe3 MOVX A,@R1 1 24
0xe4 CLR A 1 12
0xe5 MOV A,addr 2 12
0xe6 MOV A,@R0 1 12
0xe7 MOV A,@R1 1 12
0xe8 MOV A,R0 1 12
0xe9 MOV A,R1 1 12
0xea MOV A,R2 1 12
0xeb MOV A,R3 1 12
0xec MOV A,R4 1 12
0xed MOV A,R5 1 12
0xee MOV A,R6 1 12
0xef MOV A,R7 1 12
0xf0 MOVX @DPTR,A 1 24
0xf1 ACALL addr 2 24
0xf2 MOVX @R0,A 1 24
0xf3 MOVX @R1,A 1 24
0xf4 CPL A 1 12
0xf5 MOV addr,A 2 12
0xf6 MOV @R0,A 1 12
0xf7 MOV @R1,A 1 12
0xf8 MOV R0,A 1 12
0xf9 MOV R1,A 1 12
0xfa MOV R2,A 1 12
0xfb MOV R3,A 1 12
0xfc MOV R4,A 1 12
0xfd MOV R5,A 1 12
0xfe MOV R6,A 1 12
0xff MOV R7,A 1 12