文章目录
51单片机指令执行时间有单周期指令(64条),双周期指令(45条)和四周期指令(2条)
一般格式:[标号: ]操作助记符 【目的操作数】【,源操作数】[;注释]
寻址方式

1.立即寻址:执行1010H: MOV A,#55H 结果(A)=55H
2.直接寻址:若(55H)=5AH ,执行2000H: MOV A,55H 结果(A)=5AH
3.寄存器寻址:若(R0)=44H,执行1000H: MOV A,R0 结果(A)=44H
4.寄存器间接寻址:若(R1)=44H,(44H)=2FH ,执行 3000H: MOV A, @R1, 结果(A)=2FH
【片内MOV,片外MOVX】
5.变址寻址:(A)=0FH,(DPTR)=2400H,执行2000H: MOVC A,@A+DPTR, 结果为(240FH)外ROM → A,(A)=88H
6.相对寻址:若rel为75H,PSW.7为1,JC rel存于1000H开始的单元。执行JC rel指令后,程序将跳转到1077H单元取指令并执行
指令系统
传送类指令分为:一般传送指令(MOV),特殊传送指令(13条)

堆栈指令PUSH和POP (后进先出)
系统初始化时使用MOV SP,#30H 51的堆栈是向上生长型
PUSH direct ;(SP)+1→SP,(direct) →(SP)
例:设(SP)=30H,(ACC)=20H,(B)=40H,执行下述指令: PUSH ACC ;
结果为:(31 H) =20H,(SP)=31H
POP direct ?(SP))→direct,(SP)-1 →SP
例:设(SP)=30H,(44 H)=20H, (30H)=88H,执行 POP 44H;
(44 H) =88H,(SP)=2FH
算数运算类指令

逻辑运算类指令
控制转移类指令

布尔变量操作指令
汇编语言指令
常用伪指令
1、起始地址设定伪指令 格式:ORG 表达式
功能:向汇编程序说明下面紧接的程序段或数据段存放的起始地址。表达式通常为16进制地址,也可以是已定义的标号地址。
在每一个汇编语言源程序的开始,都要设置一条ORG伪指令来指定该程序在存储器中存放的起始位置;
若省略ORG伪指令,则该程序段从0000H单元开始存放;
在一个源程序中,可以多次使用ORG伪指令规定不同程序段或数据段存放的起始地址,但要求地址值由小到大依序排列,不允许空间重叠;
2.汇编结束伪指令 END 格式:END
功能:结束汇编,在整个程序中只能出现一次
3、字节数据定义伪指令 DB 格式:[标号:] DB 字节数据表
功能:从标号指定的地址开始,在ROM中定义字节数据。
4、字数据定义伪指令 格式:[标号:] DW 字常数表
功能:DW定义一个字
5、空间定义伪指令 DS 格式:[标号:] DS 表达式
功能是从标号指定的地址单元开始,在程序存储器中保留由表达式所指定的个数的存储单元作为备用的空间,并都填以零值
6、定义常值为符号名伪指令 EQU 格式:符号名 EQU 常值表达式
功能:将表达式的常值或特定的某个汇编符号定义为一个指定的符号名。
汇编器在汇编过程中会把源程序中每个出现该符号的位置均用同EQU定义的数据或汇编符号来取代。
注意:这里的标号后不能加“:”,EQU伪指令中的字符名必须先赋值后才能使用,故该语句通常放在源程序的开头。
7、位地址符号定义伪指令 BIT 格式:符号名 BIT 位地址表达式
功能:将位地址赋给指定的符号名。其中,位地址表达式可以是绝对地址,也可以是符号地址
源程序的汇编:将汇编语言源程序转换为单片机能执行的机器码形式的目标程序的过程叫汇编
机器汇编:是PC机上,使用交叉汇编程序将汇编语言源程序转换为机器码形式的目标程序。生成的目标程序由PC机传送到开发机上,经调试无误后,再固化到单片机的程序存储器ROM中
一些例题的C51源程序和汇编程序
1.有一数据块从片内RAM的30H单元开始存入,设数据块长度为10个单元。根据下式求出Y值,并将Y值放回原处。
ORG 0000H
MOV R0,#10
MOV R1,#30H
START:MOV A,@R1 ;取数
JB ACC.7,NEG ;若为负数,转NEG
JZ ZER0 ;若为零,转ZER0在这里插入代码片
ADD A,#02H ;若为正数,求X+2
AJMP SAVE ;转到SAVE,保存数据
ZER0: MOV A,# 64H ;数据为零,Y=100
AJMP SAVE ;转到SAVE,保存数据
NEG: DEC A ;求∣X∣(减1后取反)
CPL A
SAVE: MOV @R1,A ;保存数据
INC R1 ;地址指针指向下一个地址
DJNZ R0,START ;数据未处理完,继续处理
SJMP $ ;暂停
END
C51源程序如下:
#include<reg51.h>
void main()
{
char i,X,*Y;
Y = 0x30;
for(i=0;i<10;i++)
{
X = *Y;
if(X>0) *Y = X+2;
if(X==0) *Y = 100;
if(X<0) *Y = 0-X;
Y++;
}
while(1);
}
2.编写程序,利用软件实现100ms的延时。假设使用12MHz晶振。
ORG 0000H
LJMP DELAY
ORG 1000H
DELAY: MOV R7,#250 ; 外循环次数
DELAY1: MOV R6,#200 ; 内循环次数
DELAY2: DJNZ R6,DELAY2 ; 内循环时间
DJNZ R7,DELAY1 ; 外循环时间
SJMP $
END