单片机常用指令.docx
- 文档编号:28577341
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:17
- 大小:22.98KB
单片机常用指令.docx
《单片机常用指令.docx》由会员分享,可在线阅读,更多相关《单片机常用指令.docx(17页珍藏版)》请在冰豆网上搜索。
单片机常用指令
计算机通过执行程序完成人们指定的任务,程序由一条一条指令构成,能为CPU识别并执行的指令的集合就是该CPU的指令系统。
MCS-51单片机汇编语言指令格式:
操作符目的操作数,源操作数
指令中的常用符号
Rn:
n=(0~7),表示当前工作寄存器R0~R7中的一个
Ri:
i=(0、1),代表R0和R1寄存器中的一个,用作间接寻址寄存器
dir:
8位直接字节地址(片内RAM和SFR)
#data:
8位立即数,即8位常数。
可以为2进制(B)、10进制、16进制(H)、字符(‘’)
#data16:
表示16位立即数,即16位常数,取值范围为#0000H~#0FFFFH
addr16:
表示16位地址
addr11:
表示11位地址
rel:
相对偏移量(为一字节补码)用于相对转移指令中
bit:
位地址,在位地址空间中。
$:
表示当前指令的地址。
寻址方式
1、立即寻址
指令中直接给出操作数的寻址方式。
在51系列单片机的指令系统中,立即数用一个前面加“#“号的8位数(#data,如#30H)或16位数(#data16,如#2052H)表示。
立即寻址中的数,称为立即数。
例如指令:
MOVA,#30H
2、直接寻址
操作数的地址直接出现在指令中。
寻址对象:
①内部数据存贮器:
使用它的地址。
②特殊功能寄存器:
既可使用它的地址,也可以直接使用寄存器名。
3、寄存器寻址
操作数存放在寄存器中。
寻址对象:
A,B,DPTR,R0~R7。
B仅在乘除法指令中为寄存器寻址,在其他指令中为直接寻址。
A可以寄存器寻址又可以直接寻址,直接寻址时写作ACC
例如:
MOVA,R0;R0→A,A、R0均为寄
存器寻址,机器码E8
MULAB;A*B→BA,A、B为寄
存器寻址,机器码A4
MOVB,R0;R0→B,R0为寄存器寻
址,B为直接寻址
机器码88F0,其中F0为B的
字节地址(见表1-2)
PUSHACC;A的内容压入堆栈
机器码C0E0
4、寄存器间址
操作数存放在以寄存器内容为地址的单元中。
例如:
MOVR0,#20H
MOV@R0,A;A→(20H)地址的内部RAM
MOVXA,@R1;外部RAM(地址为P2R1)
的内容→A
MOVX@DPTR,A;A→以DPTR内容为地址的
外部RAM
5、变址寻址
以DPTR或PC寄存器内容为基地址,和A的内容为相加形成操作数的地址。
其中累加器A内容是可变的。
例如:
MOVCA,@A+DPTR
6、相对寻址
相对寻址是将程序计数器PC的当前值与指令第二字节给出的偏移量相加,从而形成转移的目标地址。
例如:
JZ61H
7、位寻址
对片内RAM中20H~2FH中的128个位地址及SFR中的可位寻址的位地址寻址。
例如:
MOVC,20H;20H位的内容送CY标志
位,C称为位累加器。
MOVA,20H;字节寻址,将内部
RAM中20H单元中的
内容送给累加器A。
以上两条指令均为寻址,究竟是位寻址还是字节寻址,根据两操作数类型一致的原则,由另一个操作数决定。
例R1=20H,(20H)=55H,
指令MOVA,@R1执行后,A=55H。
例(40H)=30H,指令MOVR7,40H执行后,R7=30H。
例MOVR7,#40H执行后,R7=40H。
MOVX指令举例
例:
实现片外数据存储器数据传送(2000H)→(2100H)。
使用P2口和8位寄存器Ri间址:
MOVP2,#20H;高位地址
MOVR0,#00;低位地址
MOVXA,@R0;读片外RAM
MOVP2,#21H;改变高位地址
MOVX@R0,A;写片外RAM
查表指令MOVC
注:
①只能从程序存储器读取数据到A累加器。
②只能使用变址间接寻址方式
多用于查常数表程序,直接求取常数表中的函数值
1)DPTR为基址寄存器
MOVCA,@A+DPTR;A←(A+DPTR)
查表范围为64KB程序存储器任意空间。
例查表法求Y=X2。
设X(0≤X≤15)在片内RAM20H单元,要求将查表求Y,存入片内RAM21H单元
1)用DPTR作基址寄存器
ORG0100H
SQU:
MOVDPTR,#TAB;确定表首地址
MOVA,20H;取X
MOVCA,@A+DPTR;查表求Y=X2
MOV21H,A;保存Y
RET;子程序结束
…;其它程序段
2)用PC作基址寄存器
指令地址源程序
ORG0100H;程序起始地址
0100HSQU:
MOVA,20H;取X
0102HADDA,#3;修正偏移量
0104HMOVCA,@A+PC;查表求Y=X2
0105HMOV21H,A;存结果
0107HRET;子程序结束
0108HTAB:
DB00,01,04;平方表
010BHDB09,…,225
3.堆栈操作指令
例:
设A=02,B=56H,执行下列指令序列后,SP=?
A=?
,B=?
2.2.2交换指令
实现片内RAM区的数据双向传送
1.字节交换指令
XCHA,Rn;A←→Rn
XCHA,@Ri;A←→(Ri)
XCHA,n;A←→(n)
2.半字节交换指令
例将片内RAM2AH和2BH单元中的ASCII码转换成压缩式BCD码存入20H单元
算术类指令的操作意义非常明确,不一一赘述,
注意减指令只有带借位减,因此在多字节减法中,
最低字节作减法时,注意先清CY。
逻辑运算是按位进行的,两数运算的运算法则是:
与:
有“0”则“0”;
或:
有“1”则“1”
异或:
同为“0”,异为“1”;
与“0”异或值不变:
与“1”异或值变反。
逻辑指令常用于对数据位进行加工。
3.十进制调整指令
计算机完成二进制加法其和也为二进制,如果是十进制相加(即BCD码相加)想得到十进制的结果,就必须进行十进制调整(即BCD码调整)。
调整指令:
DAA;将A中二进制相加和调整成BCD码
调整方法:
和低4位大于9或有半进位则低4位加6;
和的高4位大于9或有进位,则高4位加6。
指令根据相加和及标志自行进行判断,因此该指令应紧跟在加指令之后,至少在加指令和该指令之间不能有影响标志的指令。
DAA指令只对一个字节和调整,如为多字节相加必须进行多次调整。
此指令不能对减法结果进行调整。
例完成56+17的编程。
MOVA,#56H;A存放BCD码56H
MOVB,#17H;B存放BCD码17H
ADDA,B;A=6dH
DAA;A=73H
SJMP$
指令对标志位的影响有如下规律:
1)凡是对A操作指令(包括传送指令)都将A中1个的奇偶反映到PSW的P标志位上。
即A中奇数个“1”,P=1;偶数个“1”,P=0。
2)传送指令、加1、减1指令、逻辑运算指令不影响Cy、OV、AC标志位。
3)加减运算指令影响标志位,乘除指令使Cy=0,当乘积大于255,或除数为0时,OV置1。
4)对进位位Cy(指令中用C表示)进行操作的指令和大环移指令,显然会影响Cy。
具体指令对标志位的影响可参阅附录A。
标志位的状态是控制转移指令的条件,因此指令对标志位的影响应该记住。
控制转移指令
这一类指令的功能是改变指令的执行顺序,转到指令指示的新的PC地址执行。
MCS-51单片机的控制转移指令有以下类型:
无条件转移:
无需判断,执行该指令就转移到目的地址。
条件转移:
需判断标志位是否满足条件,满足条件转移到目的地址,否则顺序执行。
绝对转移:
转移的目的地址用绝对地址指示,通常为无条件转移。
相对转移:
转移的目的地址用相对于当前PC的偏差(偏移量)指示,通常为条件转移。
长转移或长调用:
目的地址距当前PC64KB地址范围内。
短转移或短调用:
目的地址距当前PC2KB地址范围。
1.长调用
LCALLaddrl16;addr16→PC0~15
说明:
(1)该指令功能是
①保护断点,即当前PC(本指令的下一条指令的首地址)压入堆栈。
②子程序的入口地址addr16送PC,转子程序执行。
(2)本指令为64KB地址范围内的调子程序指令,子程序可在64KB地址空间的任一处。
(3)本指令的机器码为三字节12addr16。
2.短调用
ACALLaddr11;addr11→PC0~10
说明:
(1)该指令的功能是
①保护断点,即当前PC压入堆栈。
②addrl11→PC0~10,而PC11~15保持原值不变。
(2)本指令为2KB地址范围的调子程序指令,子程序入口距当前PC不得超过2KB地址范围。
(3)本指令的机器码为二字节,设addr11的各位是a10a9a8…a2a1a0,则ACALL指令机器码a10a9a810001a7a6a5a4a3a2a1a0,其中10001是ACALL指令的操作码。
例子程序调用指令ACALL在程序存储器中的首地址为0100H,子程序入口地址为0205H。
试确定能否使用ACALL指令实现调用?
如果能使用,确定该指令的机器码。
解:
因为ACALL指令首地址在0100H,而ACALL是2字节指令,所以下一条指令的首地址在0102H。
0102H和0250H在同一2KB地址范围内,故可用ACALL调用。
调用入口地址为0250H,ACALL指令的机器码形式为:
000B=5150H。
3.子程序返回指令
RET;从调用子程序返回。
功能:
从栈顶弹出断点到PC。
RETI;从中断服务程序返回。
功能:
从栈顶弹出断点到PC,并恢复中断优先级状态触发器。
2.4.2转移指令
1.无条件转移指令
(1)短转移
AJMPaddr11;addr11→PC0~10
说明:
①转移范围:
本指令为2KB地址范围内的转移指令。
对转移目的地址的要求与ACALL指令对子程序入口地址的要求相同。
②机器码形式:
本指令为2字节指令。
设addr11的各位是a10a9a8…a2a1a0,则指令的机器码为a10a9a800001a7a6a5a4a3a2a1a0。
(2)长转移
LJMPaddr16;addr16→PC0~15
说明:
①本指令为64KB程序存储空间的全范围转移指令。
转移地址可为16位地址中的任意值。
②本指令为3字节指令02addr16。
(3)间接转移
JMP@A+DPTR;A+DPTR→PC
例A=02H,DPTR=2000H,指令JMP@A+DPTR执行后,PC=2002H。
也就是说,程序转移到2002H地址单元去执行。
例现有一段程序如下:
MOVDPTR,#TABLE
JMP@A+DPTR
TABLE:
AJMPPROC0
AJMPPROC1
AJMPPROC2
AJMPPROC2
根据JMP@A+DPTR指令的操作可知,
当A=00H时,程序转入到地址PROC0处执行;
当A=02H时,转到PROC1处执行……
可见这是一段多路转移程序,进入的路数由A确定。
因为AJMP指令是2字节指令,所以A必须为偶数。
以上均为绝对转移指令,下面介绍相对转移指令。
(4)无条件相对转移
SJMPrel;PC+rel→PC,
即As+2+rel→PC,机器码为80rel
说明:
As为源地址(本指令的首地址),该指令为2字节指令,执行本指令时
当前PC=As+2,rel为转移的偏移量,转移可以向前转(目的地址小于源地址),也可以向后转(目的地址大于源地址),因此偏移量rel是1字节有符号数,用补码表示(-128~+127),所以指令转移范围在离源地址As的-126~+129字节之间。
2.条件转移指令
(1)累加器为零(非零)转移
JZrel
;A=0则转移(As+2+rel→PC)
JNZrel
;A≠0程序顺序执行,机器码为60rel
说明:
①CJNE指令都是3字节指令,作减操作,不回送结果,影响CY标志。
②若第一操作数大于或等于第二操作数,则标志CY=0。
若第一操作数小于第二操作数,则CY=1。
这几条指令除实现两操作数相等与否的判断外,利用对CY的判断,还可完成两数大小的比较。
试说明以下一段程序运行后A中的结果。
MOV23H,#0AH
CLRA
LOOP:
ADDA,23H
DJNZ23H,LOOP
SJMP$
根据程序可知
A=10+9+8+7+6+5+4+3+2+1=55=37H
例编写程序,要求读P1端口上的信息,若不为55H,则程序等待,直到P1端口为55H时,程序才往下顺序执行。
程序:
MOVA,#55H;A=55H
CJNEA,P1,$;P1≠55H,则程序循环执行本指令
…
在实际编程中,转移的目的地址不管是addr11、addr16、还是rel,均是一符号地址表示的(如SJMPABC,AJMPLOOP…),转移的类型是通过指令的操作符来决定的。
3.相对偏移量rel的求法
在相对转移中,用偏移量rel和转移指令所处的
地址值来计算转移的目的地址,rel是1字节补码.
在填机器码时,需计算rel,下面介绍计算rel的方法。
设本条转移指令的首地址为As——源地址,
指令字节数为Bn——2字节或3字节,
要转移的目标地址为Ad——目的地址,
当前PC=As+Bn因为在执行本条指令时,PC
已经指向了下一条指令,见下图:
Ad0100MN:
…….
…....
As0125BF05relCJNER7,#06,MN
当前PC0128
当前PC=As+Bn=0125+3=0128
例MCS-51单片机指令系统中,没有停机指令,通常用短转移指令SJMP$($为本条指令的首地址)来实现动态停机的操作,试写出这条指令中机器码。
解:
查附录A,SJMPrel的指令码为80rel据题意本条指令的首地址As=$,转移的目的地址是本条指令地址,即Ad=$该指令为两字节,即Bn=2,
rel=(Ad-As-Bn)补=($-$-2)补=(-2)补=FEH
所以SJMP$指令的机器码是80FEH。
例计算下面程序中CJNE指令的偏移量。
LOOP:
MOVA,P1
CJNEA,#55H,LOOP
解:
由于MOVA,P1是2字节指令,故CJNE指令的首
地址是LOOP+2。
又因为CJNE是3字节指令,于是
有:
Ad=LOOP,As=LOOP+2,Bn=3
rel=[LOOP-(LOOP+2)-3]补=[-5]补=FBH
所以CJNEA,#55H,LOOP的指令码为B455FBH。
2.4.3空操作指令
NOP机器码00
该指令经取指,译码后不进行任何操作(空操作)而转到下一条指令,常用于生产一个机器周期的延时,或上机修改程序时作填充指令,以方便增减指令。
例将A累加器的低四为取反四次、高四位不变。
每变换一次,从P1输出。
方法一加1计数:
MOVR0,#0;计数初值送0
LL:
XRLA,#0FH;高4位不变,低四位取反
INCR0;次数加1
MOVP1,A;从P1输出
CJNER0,#04,LL;不满四次循环
RET
方法二减1计数:
MOVR0,#04H;计数初值送4
LL:
XRLA,#0FH
MOVP1,A
DJNZR0,LL;次数减1不等于0循环
RET
例在内部RAM的40H地址单元中,有1字节符号数,编写求其绝对值后放回原单元的程序。
程序如下:
MOVA,40H
ANLA,#80H
JNZNEG;为负数转移
SJMP$;为正数,绝对值=原数,不
改变原单元内容
NEG:
MOVA,40H;为负数求补,得其绝对值
CPLA
INCA
MOV40H,A
SJMP$
有符号数在计算机中以补码形式存放,例如-5,存放在内部RAM中为FBH,求补后得5,即|-5|=5。
位操作指令
MCS-51单片机的特色之一就是具有丰富的位处理功能,以进位标志CY为位累加器C,使得开关量控制系统的设计变得十分方便。
在程序中位地址的表达有多种方式:
1)用直接位地址表示,如D4H。
2)用“·”操作符号表示,如,或
3)用位名称表示,如RS1。
4)用用户自定义名表示。
如ABCBITD4H,其中ABC定义为D4H位的位名,BIT为位定义伪指令。
以上各例均表示的RS1位。
位操作类指令的对象是C和直接位地址,由于C是位累加器,所以位的逻辑运算指令目的操作数只能是C,这就是位操作指令的特点。
下面将位操作的17条指令介绍如下。
1.位清零
CLRC;0→CY
CLRbit;0→bit
2.位置1
SETBC;1→CY
SETBbit;1→bit
3.位取反
CPLC;CY→CY
CPLbit;bit→bit
4.位与
ANLC,bit;CY∧(bit)→CY
ANLC,/bit;CY∧(bit)→CY
5.位或
ORLC,bit;CY∨(bit)→CY
ORLC,/bit;CY∨(bit)→CY
6.位传送
MOVC,bit;(bit)→CY
MOVbit,C;CY→bit
7.位转移
位转移根据位的值决定转移,均为相对转移指令,设As为下面各指令的首地址。
JCrel;CY=1,则转移(As+2+rel→PC),否则程
序顺序执行
JNCrel;CY=0,则转移(As+2+rel→PC),否则程
序顺序执行
JBbit,rel;(bit)=1,则转移(As+3+rel→PC),否则程
序顺序执行
JNBbit,rel;(bit)=0,则转移(As+3+rel→PC),否则
程序顺序执行
JBCbit,rel;(bit)=1,则转移(As+3+rel→PC),且该
位清零;否则程序顺序执行
例用位操作指令实现X=X0⊕X1,设X0为,X1为,X为。
解
(1):
因位操作指令中无异或指令,依据X=X0⊕X1=X0X1+X0X1用与、或指令完成,编程如下:
XBIT
X0BIT
X1BIT;位定义
MOVC,X0
ANLC,/X1;C=X0∧X1
MOV20H,C;暂存于20H单元
MOVC,X1
ANLC,/X0;C=X0∧X1
ORLC,20H;C=X0X1+X0X1
MOVX,C
SJMP$
解
(2):
根据异或规则,一个数与“0”异或,该数值不变;与“1”异或,该数值变反,编程如下:
MOVC,X0
JNBX1,NCEX;X1=0,X=C=X0
CPLC
NCEX:
MOVX,C;X1=1,X=C=X0
SJMP$
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 常用 指令