CLR Rn指令宝贝对吗

扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
单片机指令结构
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口单片机传送指令题?
介绍一些题型
09-10-11 &匿名提问 发布
前面已经讲述了单片机的几个主要组成部分,这些部分构成了单片机的硬件。   所谓硬件(Hardware),就是看得到,摸得到的实体。但是,光有这样的硬件,还只是有了实现计算和控制功能的可能性。单片机要真正地能进行计算和控制,还必须有软件(Software)的配合。软件主要指的是各种程序。只有将各种正确的程序“灌入”(存入)单片机,它才能有效地工作。   单片机所以能自动地进行运算和控制,正是由于人把实现计算和控制的步骤一步步地用命令的形式,即一条条指令(Instruction)预先存入到存贮器中,单片机在CPU的控制下,将指令一条条地取出来,并加以翻译和执行。就以两个数相加这一简单的运算来说,当需要运算的数已存入存贮器后,还需要进行以下几步:   第一步:把第一个数从它的存贮单元(Location)中取出来,送至运算器。   第二步:把第二个数从它所在的存贮单元中取出来,送至运算器;   第三步:相加;   第四步:把相加完的结果,送至存贮器中指定的单元。   所有这些取数、送数、相加、存数等等都是一种操作(Operation),我们把要求计算机执行的各种操作用命令的形式写下来,这就是指令。但是怎样才能辨别和执行这些操作呢?这是在设计单片机时由设计人员赋予它的指令系统所决定的。一条指令,对应着一种基本  操作;单片机所能执行的全部指令,就是该单片机的指令系统     (IustructionSet),不同种类的单片机,其指令系统亦不同。   使用单片机时,事先应当把要解决的问题编成一系列指令。这些指令必须是选定的单片机能识别和执行的指令。单片机用户为解决自己的问题所编的指令程序,称为源程序(SourceProgram)。   指令通常分为操作码(Opcode)和操作数(Operand)两大部分。操作码表示计算机执行什么操作,即指令的功能;操作数表示参加操作的数或操作数所在的地址(即操作数所存放的地方编号)。   因为单片机是一种可编程器件,只“认得”二进码(0、1)。要单片机运作,单片机系统中的所有指令,都必须以二进制编码的形式来表示。例如,在Intel公司的MCS-51系列单片机中,从存贮器中取出一数到CPU中的累加器(在运算器中,参与运算、存放运算结果的专用寄存器)的指令代码为74H,累加器内容加立即数的代码为24H,再加上立即数代码,累加器送数到内部RAM存贮器的代码为F6H~F7H等。这些指令是用十六进制表示二进制的机器码。MCS-51单片机的字长为8位,有时,要完成某些操作用一个字节尚不能充分表达。所以,在指令系统中有单字节指令,也有多字节指令。   机器码是由一连串的0和1组成,没有明显的特征,不好记忆,不易理解,易出错。所以,直接用它来编写程序十分困难。因而,人们就用一些助记符(Muemonic)——通常是指令功能的英文缩写来代替操作码,如MCS-51中数的传送常用MOV(Move的缩写)、加法用Add(Addition的缩写)来作为助记符。这样,每条指令有明显的动作特征,易于记忆和理解,也不容易出错。用助记符来编写的程序称为汇编语言程序。   但是,助记符编写的程序便于人理解,可单片机却只认识二进制机器代码,因此,为了让单片机能“读懂”汇编语言程序必须再转换成由二进制机器码构成的程序,这种转换过程,就称为“汇编”。汇编可借助于人工查表法来实现,也可借助PC机通过所谓“交叉汇编程序”来完成。   由机器码构成的用户程序一旦“进入”了单片机,再“启动”单片机,就可让它执行输入程序所规定的任务。
请登录后再发表评论!
只要把汇编指令都写出来了,你就可以到指令表中找到每一条指令所对应的机器码,然后你只要在机器码后面加上操作数即可,比如,把一个30H单元送入A累加器;指令是这样的:MOV A , 30H .那么你可以在指令表中查到执行这条指的机器码是,但是由于这条指令后面的那个30H单元的数是根据你的要求在不断的变的,机器没规定你只能用30H单元,所以这个30的操作数必须由你填,它们和在一块儿,这条指令的机器码是:11 0000用十六进制来表示:E530,很明显前两位E5是机器指定的,而后两位30是你自己加进去的。共是十六位,占用两个字节……。你说的LED灯闪烁,不知是指的流水灯还是一只发光二极管在不停地闪烁?但不管是哪一种,有一点很重要。你在编写此程序时必须要考虑延时,因为51单片机的晶体振荡器最低频率可能是6M(具体数值我已记不清了)。也就是说单片机的每一个机器周期所占用的时间仅2微秒,如果你不考虑延时的话,那么你设计的那盏灯,它闪烁的结果是;亮2微秒,熄2微秒,也就是说每一秒钟要亮暗50万次,肉眼看这盏灯根本就不会有熄灭的时候,只是比不闪的灯暗了一半。我们生活中用的白炽灯,每秒钟亮暗100次,你能感觉出灯泡有熄灭的时候吗?更何况那是50万次啊!比如设计流水灯的程序,不妨可以这样考虑它的算法。计数寄存器的高八位加上低八位,合起来也只有十六位,它能数的数最大也就是65535,就算单片机用的是最低的6M的晶体振荡器,一个机器周期是12个机器节拍,所以,每一个机器周期占用2微秒时间,从0数到65535,仅用了131070微秒就数完了,约130毫秒,如果就按这个延时去改变灯的亮暗时间,那么这盏灯每秒钟要亮暗3、4次,肉眼虽然能够看到灯有熄灭的时间了。但是眼睛看这样的灯总不会那么舒服,所以至少应让它延时到1秒钟亮暗一次。为了计算方便,就让计数器数100毫秒的时间吧!等计数器数到100毫秒后,就让它再数一次,然后再数一次……,等它数满5次后,这就是500毫秒(半秒钟),然后,我们再去改变灯的亮暗状态。这个程序可以这样来编: MOV  A ,#0FEH
;最低位设为0 MOV  P1, A
;点亮最低位灯 MOV  TCON,#10H
;T1为方式1,定时BEGIN: MOV  R7  ,#05H
;设循环5次STAR: MOV  TH1  #3CH
;计数器数100毫秒 MOV  TL1  #AFH SETB  TR1
;开始计数ROU: JBC   TF1
;100毫秒到否? SJMP ROU
        ;等待到100毫秒SE: CLR TR1
;关闭计数器 DJNZ  R7   STAR
        ;5次循环到否?
RL  A
;把0向左移一位         MOV  P1 ,A
;改下一只灯亮 SJMP BEGIN
51的单片机     ORG  0000HMAIN:MOV R2,#2  L1:MOV R3,#200  L2:MOV R4,#200  L3:NOP     NOP     DJNZ R4,L3     DJNZ R3,L2     DJNZ R2,L1     CPL P1.7     JMP MAIN     ENDMedwin编写C51汇编
八只LED灯做流水灯实验单片机在上电初始后,其各端口输出为高电平。如果我们现在想让接在P1.0口的LED1亮,那么我们只要把P1.0口的电平变为低电平就可以了。想让LED1灭,LED0亮,只需将P1.0升高,P1.1变低,LED1就熄灭LED2随后既点亮!依始类推如下所示8只LED变会一亮一暗的做流水灯了.P1.0低、P1.0高、P1.1低、P1.1高、P1.2低、P1.2高、P1.3低、P1.3高、P1.4低、P1.4高、P1.5低、P1.5高、P1.6低、P1.6高、P1.7低、P1.7高、返回到开始、程序结束。我们不能说P1.1你变低,它就变低了。因为单片机听不懂我们的汉语的,只能接受二进制的“1、0......”代码。我们又怎样来用二进制语议论使单片机按我们的意思去工作呢?为了让单片机工作,只能将程序写为二进制代码交给其执行;早期单片机开发人员就是使用人工编写的二进制代码交给单片机去工作的。今天,我们不必用烦人的二进制去编写程序,完全可以将我们容易理解的“程序语言”通过“翻译”软件“翻译”成单片机所需的二进制代码,然后交给单片机去执行。这里的“程序语言”目前主要有汇编和C两种;在这里我们所说的“翻译”软件,同行们都叫它为“编译器”,将“程序语言”通过编译器产生单片机的二进制代码的过程叫编译。前面说到,要想使LED1变亮,只需将对应的单片机引脚电平变为低电平就可以了。现在让我们将上面提到的8只LED流水灯实验写为汇编语言程序。“汉语”语言 汇编语言 开始: star: P1.0低 clr p1.0 P1.0高 setb p1.0 P1.1低 clr p1.1 P1.1高 setb p1.1 P1.2低 clr p1.2 P1.2高 setb p1.2 P1.3低 clr p1.3 P1.3高 setb p1.3 P1.4低 clr p1.4 P1.4高 setb p1.4 P1.5低 clr p1.5 P1.5高 setb p1.5 P1.6低 clr p1.6 P1.6高 setb p1.6 P1.7低 clr p1.7 P1.7高 setb p1.7 返回到开始 ljmp star 结束 end 这里用到了四条汇编指令:clr、 setb、 ljmp 、end;clr:是将其后面指定的位清为0;setb:是将其后面指定的位置成1;ljmp:是无条件跳转指令,意思是:跳转到指定的标号处继续运行。end:是一条告诉编译器:程序到此结束的伪指令。伪指令只告诉编译器此程序到此有何 要求或条件,它不参与和影响程序的执行。这里需要说明的是,按汇编语法要求,所编制的程序(下称源程序)之格式和书写要求必须依下列原则:1、源程序必须为纯文本格式文件,如用Windows“附件”中的“记事本”编写的文本文件;2、源程序的扩展名应是 *.ASM; 3、一行只能写一条语句,以回车作为本句的结束,每一语句行长度应少于80个字符(即40个汉字)。 4、每行的格式应为:标号: 命令 参数 ;注释即一行由四部份组成,各部份的顺序不能搞错,依实际要求可以缺省其中的一部份或几部份,甚至全部省去,即空白行。需要使用标号时标号后面必须有“:”(冒号),而命令语句和参数之间必须用空格分开,如果命令有多个参数,则参数与参数之间必须用“,”(逗号)分开,需要注释时注释前必须用“;”(分号),“;”后面的语句可以写任何字符,包括汉字用于解释前面的汇编语句,它将不参与汇编,不生成代码。由于汇编程序对我们还不直观,所以在编写源程序时,应当养成多写注释的习惯,这样有助于今后源程序的阅读和维护。标号是标志程序中某一行的符号名,编译后标号的数值就是标号所在行代码的地址。在宏汇编ASM51中标号的长度不受限制,但标号中不能包含‘:’或其它的一些特殊符号,也不能用汉字,可以用数字作标号,但必须用字母开头。当标号作参数用(如标号作转移地址),在命令后面出现时,必须舍去‘:’(如上面程序中的 LJMP STAR中的 STAR 是不能再有:)。每行只能有一个标号,一个标号只能用在一处,如果有两行用了同一个标号,则汇编时就会出错。由于标号的长度没有限制,可以用有意义的英文或汉语拼音来说明行,使源程序读起来更方便。源程序中的字母不区分大小写,也就是说 star 和 STAR 是一样的,请不要用大小写方式去区分不同的标号:流水灯实验详解二 上一节的实验最后没有得到“流水”显示的效果,主要是单片机执行每条指令的时间很短,我们肉眼无法看到LED的熄灭与点亮。单片机内部能按部就班的自动工作,正是在系统时钟的作用下,内部各逻辑硬件产生各种所需脉冲信号而实现的。这个时钟信号(既晶体振荡信号)的周期称“振荡周期”。我们这个实验中晶体使用的是12MHZ. 在单片机中,要处理最短周期的一条指令需要由12个振荡周期(既晶振振荡周期)组成的,这个叫“机器周期”。 8051核的单片机,大多数指令只用一个机器周期(既单周期),也有双周期和四周期的指令。本实验中用到的SETB P.x和CLR P.x均属于单周期指令,也就是说,执行一句 SETB P.x 用时仅1uS(微秒),CLR P.x 也是1uS;难怪我们前面的程序不能看到流水效果。 现在,将程序改动一下,在每点亮一个LED后,让程序干点别的事,也就是让它等一会再将该LED熄灭,继续执行下面的程序:DDW: ;程序开始 CLR P1.0 ;LED1亮 ACALL DELAY ;调用延时子程序 SETB P1.0 ;LED1灭 CLR P1.1 ;换灯,同上 ACALL DELAY   SETB P1.1   CLR P1.2   ACALL DELAY   SETB P1.2   CLR P1.3   ACALL DELAY   SETB P1.3   CLR P1.4   ACALL DELAY   SETB P1.4   CLR P1.5   ACALL DELAY   SETB P1.5   CLR P1.6   ACALL DELAY   SETB P1.6   CLR P1.7   ACALL DELAY   SETB P1.7   LJMP DDW ;返回到开始循环 DELAY:   ;延时子程序 MOV R1,#50   AD10:     MOV R2,#100   AD11:     MOV R3,#100   DJNZ R3,$   DJNZ R2,AD11   DJNZ R1,AD10   RET ;延时子程序结束,返回到调用处的下一句 END   请将上面的程序保存为 1LED.asm,进行编译,并烧写到AT89S51中,之后将89S51安装到套件的实验部份插座上实验,这回显示的就是“流水灯”的效果了!?回过头,让我们看看延时子程序是怎样工作的:单片机内部有不少寄存器,这些寄存器在单片机通电时,你可以给他写入数据(是单片机按你程序要求写的数据,而不是编程器写的),当第二次给他写入新数据时,前次的数据就被新数据覆盖;当然也可以从寄存器中读取数据。当单片机没有电源供给时,寄存器内部的数据也随即消失;这些寄存器人们叫他RAM,而用编程器将我们编写的程序烧写到单片机中的存储器叫ROM;现在,我们应该清楚:RAM是让程序去使用的,ROM是我们编写的程序存放的地方! 前面说过,单片机内部有不少RAM,本实验用的AT89C51有多少寄存器?我们现在不必关心,现在只须知道单片机内部有名叫R0~R7 的这8个寄存器。这8个寄存器每个都由8个单独的位寄存器组成,最大存放数据为二进制的 ,十六进制 = FF,十进制 = 255。在使用时注意不要大于其有效范围。上面延时程序中,先用到 MOV R1,#50 ,MOV是移动的意思,该句是将50这个十进制数放到R1中;50是立即数,按汇编语言要求前面要加“#”号,汇编语言还规定,十六进制数后面要加“?H”,十六进制数的高位是字母时在字母前面还要加“0”,例如:#0F8H;二进制数后面加“B”,例如:#B。十进制不加,例如:#100。延时程序的第二、三句为: MOV R2,#100 ;MOV R3,#100 ;这两句意思同前。第四句中DJNZ R3,$ 的意思是将 R3 里面的数减 1 后如果 R3 不等于 0 则跳到后面指定的程序位置,这里的“$”既要跳转的程序位置,“$”代表当前语句处,也就是说,R3不等于 0,程序返回再次执行本句。如果R3 减 1 后等于0,程序结束本句,继续执行下面的语句。延时程序的最后一句是RET ,意思是退出本子程序,返回到调用本子程序处的下一句。根据上面的解释,一进入延时子程序首先为R1, R2, R3 寄存器装入我们需要的数据,然后先对R3 进行减数,每次减 1 ,R3 减完后减R2 ,减R2 时就费事啦,因为R2 每减 1 后不为 0 需要跳转到AD11 标号处执行下面的语句,此时R3 再次装入数据100,并且还要再次对R3 进行减数......,R2 减完后减R1,减R1的过程你研究研究看看。 每执行 DJNZ ?Rn,rel (Rn 指 R0~R7,rel 指转移地址)指令一次,需要2个机器周期,单片机需耗时2uS(指本实验),若忽略装数等语句,延时子程序从开始到结束,单片机共耗时100*100*50*2nS,既1000000uS=1秒!若加上装数等语句的耗时,延时时间大于1秒。 到此,我们做的流水灯已成功,原理大致也明白啦,若你自认为这一课你完全明白了,那请你将“流水灯”的流向改变一下,也可以改为两边向内流,内部向外流......,我想你一定能用前面学到的方法实现这些功能。可能有些高手说,前面的编程方法是最最笨的!,不错!但玩单片机初期不必讲究语言的简练,只要能完成预先要求就好,这是初学者要知道的。那么还有更好的编程思路吗?有!请继续学习下节课做流水灯实验详解三在上节课中让 LED 流水是去逐个控制P1端口的每个位来实现的,那么我们在程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后让这个数据向高位移动不就实现“流水”效果啦?的确如此!可惜,8051没有让P1数据移动的指令,但有对累加器ACC中数据左移或右移的指令,ACC是8051单片机内部算术逻辑单元中的一个“寄存器”(这里叫他寄存器是不正确的,但你可以先这样理解,ACC在指令中常写为A),他在数据传输和数据处理过程中作用十分重要,ACC为8位。他可与片内所有单字节寄存器交换数据,实际上P1和其他端口在单片机中也是一个寄存器。这样我们可以将需移动的数据先放到ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样同样可以实现“流水”效果。程序如下:DDW:   ;开始 MOV ACC,#0FEH ;ACC中先装入LED1熄灭的数据(即二进制的 ) MOV P1,ACC ;将ACC的数据送P1口 MOV R0,#7 ;因上句送到?p1口的数据就熄灭了一位,所以将数据再移动7次就完成一个8位流水过程 LOOP:   ;数据移动循环 Rl A ;将ACC中的数据左移一位 MOV P1,A ;把ACC移动过的数据送p1口显示 ACALL DELAY ;调用延时 DJNZ R0,LOOP ;没有移动够7次继续移动 LJMP DDW ;移动完7次后跳到开始重来,以达到循环流动效果 DELAY:   ;延时子程序,就是上节课中的延时子程序 MOV R1,#50   ADl0:     MOV R2,#100   ADl1:     MOV R3,#100   DJNZ R3,$   DJNZ R2,AD11   DJNZ R1,AD10   RET   ;延时子程序结束,返回到调用处的下一句 END   ;本汇编程序到此结束 接下来,将上述程序编译,并烧写到前面我们的实验芯片中,流水效果与第二节课的一样。 其实8051单片机有111条指令,这111条指令好比以前我们使用数字传呼机时的“短语代码”一样,可以用几个“短语代码”去表示一句完整、通顺的语句段落。有的指令常用,有的指令不常用,只要遵守语法规则,你可以用这些指令“组合”成你想象到的任何程序。当然,有时一条指令可以替代很多条指令,这样会使程序简捷,费码减少,在编写较大程序时可以让程序存储器放得下你需要的代码。这也是单片机高手所追求的。当然,在程序存储器空间不成问题时,你不这样做但也可以达到预期的功能,这也不算错。 单片机内部还有很多“部件”我们只是用到什么说什么,很不系统。但是我也不想系统的介绍这些,因系统介绍单片机结构和指令的书很多,何况写的远比我好,因此,希望你在看本讲座的过程中,还要结合正规的教材学习其更多的指令和“部件”。这是我在别的地方找过来的,希望对你有所帮助。我用的是WAVE6000编译的。
请登录后再发表评论!
MCS-51数据传送指令 数据传送指令共有29条,数据传送指令一般的操作是把源操作数传送到目的操作数,指令执行完成后,源操作数不变,目的操作数等于源操作数。如果要求在进行数据传送时,目的操作数不丢失,则不能用直接传送指令,而采用交换型的数据传送指令,数据传送指令不影响标志C,AC和OV,但可能会对奇偶标志P有影响。 [1]. 以累加器A为目的操作数类指令(4条) 这4条指令的作用是把源操作数指向的内容送到累加器A。有直接、立即数、寄存器和寄存器间接寻址方式: MOV A,(data)→(A) 直接单元地址中的内容送到累加器A MOV A,##data→(A) 立即数送到累加器A中 MOV A,R(Rn)→(A) Rn中的内容送到累加器A中 MOV A,@R((Ri))→(A) Ri内容指向的地址单元中的内容送到累加器A [2]. 以寄存器Rn为目的操作数的指令(3条) 这3条指令的功能是把源操作数指定的内容送到所选定的工作寄存器Rn中。有直接、立即和寄存器寻址方式: MOV Rn,(data)→(Rn) 直接寻址单元中的内容送到寄存器Rn中 MOV Rn,##data→(Rn) 立即数直接送到寄存器Rn中 MOV Rn,A ;(A)→(Rn) 累加器A中的内容送到寄存器Rn中 [3]. 以直接地址为目的操作数的指令(5条) 这组指令的功能是把源操作数指定的内容送到由直接地址data所选定的片内RAM中。有直接、立即、寄存器和寄存器间接4种寻址方式: MOV data,(data)→(data) 直接地址单元中的内容送到直接地址单元 MOV data,##data→(data) 立即数送到直接地址单元 MOV data,A ;(A)→(data) 累加器A中的内容送到直接地址单元 MOV data,R(Rn)→(data) 寄存器Rn中的内容送到直接地址单元 MOV data,@R((Ri))→(data) 寄存器Ri中的内容指定的地址单元中数据送到直接地址单元 [4]. 以间接地址为目的操作数的指令(3条) 这组指令的功能是把源操作数指定的内容送到以Ri中的内容为地址的片内RAM中。有直接、立即和寄存器3种寻址方式: MOV @Ri,(data)→((Ri)) 直接地址单元中的内容送到以Ri中的内容为地址的RAM单元 MOV @Ri,##data→((Ri)) 立即数送到以Ri中的内容为地址的RAM单元 MOV @Ri,A ;(A)→((Ri)) 累加器A中的内容送到以Ri中的内容为地址的RAM单元 [5]. 查表指令(2条) 这组指令的功能是对存放于程序存储器中的数据表格进行查找传送,使用变址寻址方式: MOVC A,@A+DPTR ;((A))+(DPTR)→(A) 表格地址单元中的内容送到累加器A中 MOVC A,@A+PC ;((PC))+1→(A),((A))+(PC)→(A) 表格地址单元中的内容送到累加器A中 [6]. 累加器A与片外数据存储器RAM传送指令(4条) 这4条指令的作用是累加器A与片外RAM间的数据传送。使用寄存器寻址方式: MOVX @DPTR,A ;(A)→((DPTR)) 累加器中的内容送到数据指针指向片外RAM地址中 MOVX A, @DPTR ;((DPTR))→(A) 数据指针指向片外RAM地址中的内容送到累加器A中 MOVX A, @R((Ri))→(A) 寄存器Ri指向片外RAM地址中的内容送到累加器A中 MOVX @Ri,A ;(A)→((Ri)) 累加器中的内容送到寄存器Ri指向片外RAM地址中 [7]. 堆栈操作类指令(2条) 这4类指令的作用是把直接寻址单元的内容传送到堆栈指针SP所指的单元中,以及把SP所指单元的内容送到直接寻址单元中。这类指令只有两条,下述的第一条常称为入栈操作指令,第二条称为出栈操作指令。需要指出的是,单片机开机复位后,(SP)默认为07H,但一般都需要重新赋值,设置新的SP首址。入栈的第一个数据必须存放于SP+1所指存储单元,故实际的堆栈底为SP+1所指的存储单元。 PUSH(SP)+1→(SP),(data)→(SP) 堆栈指针首先加1,直接寻址单元中的数据送到堆栈指针SP所指的单元中 POP(SP)→(data)(SP)-1→(SP), 堆栈指针SP所指的单元数据送到直接寻址单元中,堆栈指针SP再进行减1操作 [8]. 交换指令(5条) 这5条指令的功能是把累加器A中的内容与源操作数所指的数据相互交换。 XCH A,R(A)←→(Rn)累加器与工作寄存器Rn中的内容互换 XCH A,@R(A)←→((Ri))累加器与工作寄存器Ri所指的存储单元中的内容互换 XCH A,(A)←→(data)累加器与直接地址单元中的内容互换 XCHD A,@R(A 3-0 )←→((Ri) 3-0 )累加器与工作寄存器Ri所指的存储单元中的内容低半字节互换 SWAP A ;(A 3-0 )←→(A 7-4 )累加器中的内容高低半字节互换 [9]. 16位数据传送指令(1条) 这条指令的功能是把16位常数送入数据指针寄存器。 MOV DPTR,#data16 ;#dataH→(DPH),#dataL→(DPL)16位常数的高8位送到DPH,低8位送到DPL MCS-51算术运算指令 算术运算指令共有24条,算术运算主要是执行加、减、乘、除法四则运算。另外MCS-51指令系统中有相当一部分是进行加、减1操作,BCD码的运算和调整,我们都归类为运算指令。虽然MCS-51单片机的算术逻辑单元ALU仅能对8位无符号整数进行运算,但利用进位标志C,则可进行多字节无符号整数的运算。同时利用溢出标志,还可以对带符号数进行补码运算。需要指出的是,除加、减1指令外,这类指令大多数都会对PSW(程序状态字)有影响。这在使用中应特别注意。 [1]. 加法指令(4条) 这4条指令的作用是把立即数,直接地址、工作寄存器及间接地址内容与累加器A的内容相加,运算结果存在A中。 ADD A,#(A)+#data→(A) 累加器A中的内容与立即数#data相加,结果存在A中 ADD A,(A)+(data)→(A) 累加器A中的内容与直接地址单元中的内容相加,结果存在A中 ADD A,R(A)+(Rn)→(A) 累加器A中的内容与工作寄存器Rn中的内容相加,结果存在A中 ADD A,@R(A)+((Ri))→(A) 累加器A中的内容与工作寄存器Ri所指向地址单元中的内容相加,结果存在A中 [2]. 带进位加法指令(4条) 这4条指令除与[1]功能相同外,在进行加法运算时还需考虑进位问题。 ADDC A,(A)+(data)+(C)→(A) 累加器A中的内容与直接地址单元的内容连同进位位相加,结果存在A中 ADDC A,#(A)+#data +(C)→(A) 累加器A中的内容与立即数连同进位位相加,结果存在A中 ADDC A,R(A)+Rn+(C)→(A) 累加器A中的内容与工作寄存器Rn中的内容、连同进位位相加,结果存在A中 ADDC A,@R(A)+((Ri))+(C)→(A) 累加器A中的内容与工作寄存器Ri指向地址单元中的内容、连同进位位相加,结果存在A中 [3]. 带借位减法指令(4条) 这组指令包含立即数、直接地址、间接地址及工作寄存器与累加器A连同借位位C内容相减,结果送回累加器A中。 这里我们对借位位C的状态作出说明,在进行减法运算中,CY=1表示有借位,CY=0则无借位。OV=1声明带符号数相减时,从一个正数减去一个负数结果为负数,或者从一个负数中减去一个正数结果为正数的错误情况。在进行减法运算前,如果不知道借位标志位C的状态,则应先对CY进行清零操作。 SUBB A,(A)-(data) - (C)→(A) 累加器A中的内容与直接地址单元中的内容、连同借位位相减,结果存在A中 SUBB A,#(A)-#data -(C)→(A) 累加器A中的内容与立即数、连同借位位相减,结果存在A中 SUBB A,R(A)-(Rn) -(C)→(A) 累加器A中的内容与工作寄存器中的内容、连同借位位相减,结果存在A中 SUBB A,@R(A)-((Ri)) -(C)→(A) 累加器A中的内容与工作寄存器Ri指向的地址单元中的内容、连同借位位相减,结果存在A中 [4]. 乘法指令(1条) 这个指令的作用是把累加器A和寄存器B中的8位无符号数相乘,所得到的是16位乘积,这个结果低8位存在累加器A,而高8位存在寄存器B中。如果OV=1,说明乘积大于FFH,否则OV=0,但进位标志位CY总是等于0。 MUL AB ;(A)×(B)→(A)和(B) 累加器A中的内容与寄存器B中的内容相乘,结果存在A、B中 [5]. 除法指令(1条) 这个指令的作用是把累加器A的8位无符号整数除以寄存器B中的8位无符号整数,所得到的商存在累加器A,而余数存在寄存器B中。除法运算总是使OV和进位标志位CY等于0。如果OV=1,表明寄存器B中的内容为00H,那么执行结果为不确定值,表示除法有溢出。 DIV AB ;(A)÷(B)→(A)和(B) 累加器A中的内容除以寄存器B中的内容,所得到的商存在累加器A,而余数存在寄存器B中。 [6]. 加1指令(5条) 这5条指令的的功能均为原寄存器的内容加1,结果送回原寄存器。上述提到,加1指令不会对任何标志有影响,如果原寄存器的内容为FFH,执行加1后,结果就会是00H。这组指令共有直接、寄存器、寄存器减间址等寻址方式: INC A ;(A)+1→(A) 累加器A中的内容加1,结果存在A中 INC(data)+1→(data) 直接地址单元中的内容加1,结果送回原地址单元中 INC @R((Ri))+1→((Ri)) 寄存器的内容指向的地址单元中的内容加1,结果送回原地址单元中 INC R(Rn)+1→(Rn)寄存器Rn的内容加1,结果送回原地址单元中 INC DPTR ;(DPTR)+1→(DPTR)数据指针的内容加1,结果送回数据指针中 在INC data这条指令中,如果直接地址是I/O,其功能是先读入I/O锁存器的内容,然后在CPU进行加1操作,再输出到I/O上,这就是“读—修改—写”操作。 [7]. 减1指令(4条) 这组指令的作用是把所指的寄存器内容减1,结果送回原寄存器,若原寄存器的内容为00H,减1后即为FFH,运算结果不影响任何标志位,这组指令共有直接、寄存器、寄存器间址等寻址方式,当直接地址是I/O口锁存器时,“读—修改—写”操作与加1指令类似。 DEC A ;(A)-1→(A)累加器A中的内容减1,结果送回累加器A中 DEC(data)-1→(data)直接地址单元中的内容减1,结果送回直接地址单元中 DEC @R((Ri))-1→((Ri))寄存器Ri指向的地址单元中的内容减1,结果送回原地址单元中 DEC R(Rn)-1→(Rn)寄存器Rn中的内容减1,结果送回寄存器Rn中 [8]. 十进制调整指令(1条) 在进行BCD码运算时,这条指令总是跟在ADD或ADDC指令之后,其功能是将执行加法运算后存于累加器A中的结果进行调整和修正。 DA A MCS-51逻辑运算及移位指令 逻辑运算和移位指令共有25条,有与、或、异或、求反、左右移位、清0等逻辑操作,有直接、寄存器和寄存器间址等寻址方式。这类指令一般不影响程序状态字(PSW)标志。 [1]. 循环移位指令(4条) 这4条指令的作用是将累加器中的内容循环左或右移一位,后两条指令是连同进位位CY一起移位。 RL A ;累加器A中的内容左移一位 RR A ;累加器A中的内容右移一位 RLC A ;累加器A中的内容连同进位位CY左移一位 RRC A ;累加器A中的内容连同进位位CY右移一位 [2]. 累加器半字节交换指令(1条) 这条指令是将累加器中的内容高低半字节互换,这在上一节中内容已有介绍。 SWAP A ; 累加器中的内容高低半字节互换 [3]. 求反指令(1条) 这条指令将累加器中的内容按位取反。 CPL A ; 累加器中的内容按位取反 [4]. 清零指令(1条) 这条指令将累加器中的内容清0。 CLR A ; 0→(A),累加器中的内容清0 [5]. 逻辑与操作指令(6条) 这组指令的作用是将两个单元中的内容执行逻辑与操作。如果直接地址是I/O地址,则为“读—修改—写”操作。 ANL A,累加器A中的内容和直接地址单元中的内容执行与逻辑操作。结果存在寄存器A中。 ANL data,#直接地址单元中的内容和立即数执行与逻辑操作。结果存在直接地址单元中。 ANL A,#累加器A的内容和立即数执行与逻辑操作。结果存在累加器A中。 ANL A,R累加器A的内容和寄存器Rn中的内容执行与逻辑操作。结果存在累加器A中。 ANL data,A ;直接地址单元中的内容和累加器A的内容执行与逻辑操作。结果存在直接地址单元中。 ANL A,@R累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行与逻辑操作。结果存在累加器A中。 [6]. 逻辑或操作指令(6条) 这组指令的作用是将两个单元中的内容执行逻辑或操作。如果直接地址是I/O地址,则为“读—修改—写”操作。 ORL A,累加器A中的内容和直接地址单元中的内容执行逻辑或操作。结果存在寄存器A中。 ORL data,#直接地址单元中的内容和立即数执行逻辑或操作。结果存在直接地址单元中。 ORL A,#累加器A的内容和立即数执行逻辑或操作。结果存在累加器A中。 ORL A,R累加器A的内容和寄存器Rn中的内容执行逻辑或操作。结果存在累加器A中。 ORL data,A ;直接地址单元中的内容和累加器A的内容执行逻辑或操作。结果存在直接地址单元中。 ORL A,@R累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑或操作。结果存在累加器A中。 [7]. 逻辑异或操作指令(6条) 这组指令的作用是将两个单元中的内容执行逻辑异或操作。如果直接地址是I/O地址,则为“读—修改—写”操作。 XRL A,累加器A中的内容和直接地址单元中的内容执行逻辑异或操作。结果存在寄存器A中。 XRL data,#直接地址单元中的内容和立即数执行逻辑异或操作。结果存在直接地址单元中。 XRL A,#累加器A的内容和立即数执行逻辑异或操作。结果存在累加器A中。 XRL A,R累加器A的内容和寄存器Rn中的内容执行逻辑异或操作。结果存在累加器A中。 XRL data,A ;直接地址单元中的内容和累加器A的内容执行逻辑异或操作。结果存在直接地址单元中。 XRL A,@R累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑异或操作。结果存在累加器A中。 MCS-51控制转移指令 控制转移指令用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移指令相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令,这些指令的执行一般都不会对标志位有影响。 [1]. 无条件转移指令(4条) 这组指令执行完后,程序就会无条件转移到指令所指向的地址上去。长转移指令访问的程序存储器空间为16地址64kB,绝对转移指令访问的程序存储器空间为11位地址2kB空间。 LJMP addr16 ;addr16→(PC),给程序计数器赋予新值(16位地址) AJMP addr11 ;(PC)+2→(PC),addr11→(PC 10-0 )程序计数器赋予新值(11位地址),(PC 15-11 )不改变 SJMP(PC)+ 2 + rel→(PC)当前程序计数器先加上2再加上偏移量给程序计数器赋予新值 JMP @A+DPTR ;(A)+ (DPTR)→(PC),累加器所指向地址单元的值加上数据指针的值给程序计数器赋予新值 [2]. 条件转移指令(8条) 程序可利用这组丰富的指令根据当前的条件进行判断,看是否满足某种特定的条件,从而控制程序的转向。 JZ A=0,(PC)+ 2 + rel→(PC),累加器中的内容为0,则转移到偏移量所指向的地址,否则程序往下执行 JNZ A≠0,(PC)+ 2 + rel→(PC),累加器中的内容不为0,则转移到偏移量所指向的地址,否则程序往下执行 CJNE A, data, A≠(data),(PC)+ 3 + rel→(PC),累加器中的内容不等于直接地址单元的内容,则转移到偏移量所指向的地址,否则程序往下执行 CJNE A, #data, A≠#data,(PC)+ 3 + rel→(PC),累加器中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行 CJNE Rn, #data, A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Rn中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行 CJNE @Ri, #data, A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Ri指向地址单元中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行 DJNZ Rn, (Rn)-1→(Rn),(Rn)≠0,(PC)+ 2 + rel→(PC)工作寄存器Rn减1不等于0,则转移到偏移量所指向的地址,否则程序往下执行 DJNZ data, (Rn)-1→(Rn),(Rn)≠0,(PC)+ 2 + rel→(PC)直接地址单元中的内容减1不等于0,则转移到偏移量所指向的地址,否则程序往下执行 [3]. 子程序调用指令(1条) 子程序是为了便于程序编写,减少那些需反复执行的程序占用多余的地址空间而引入的程序分支,从而有了主程序和子程序的概念,需要反复执行的一些程序,我们在编程时一般都把它们编写成子程序,当需要用它们时,就用一个调用命令使程序按调用的地址去执行,这就需要子程序的调用指令和返回指令。 LCALL addr16 ; 长调用指令,可在64kB空间调用子程序。此时(PC)+ 3→(PC),(SP)+ 1→(SP),(PC 7-0 )→(SP),(SP)+ 1→(SP),(PC 15-8 )→(SP),addr16→(PC),即分别从堆栈中弹出调用子程序时压入的返回地址 ACALL addr11 ; 绝对调用指令,可在2kB空间调用子程序,此时(PC)+ 2→(PC),(SP)+ 1→(SP),(PC 7-0 )→(SP),(SP)+ 1→(SP),(PC 15-8 )→(SP),addr11→(PC 10-0 ) RET ; 子程序返回指令。此时(SP)→(PC 15-8 ),(SP)- 1→(SP),(SP)→(PC 7-0 ),(SP)- 1→(SP) RETI ; 中断返回指令,除具有RET功能外,还具有恢复中断逻辑的功能,需注意的是,RETI指令不能用RET代替 [4]. 空操作指令(1条) 这条指令将累加器中的内容清0。 NOP ; 这条指令除了使PC加1,消耗一个机器周期外,没有执行任何操作。可用于短时间的延时 MCS-51布尔变量操作指令 布尔处理功能是MCS-51系列单片机的一个重要特征,这是出于实际应用需要而设置的。布尔变量也即开关变量,它是以位(bit)为单位进行操作的。 在物理结构上,MCS-51单片机有一个布尔处理机,它以进位标志做为累加位,以内部RAM可寻址的128个为存储位。 既然有布尔处理机功能,所以也就有相应的布尔操作指令集,下面我们分别谈论。 [1]. 位传送指令(2条) 位传送指令就是可寻址位与累加位CY之间的传送,指令有两条。 MOV C,bit→CY,某位数据送CY MOV bit,C ;CY→bit,CY数据送某位 [2]. 位置位复位指令(4条) 这些指令对CY及可寻址位进行置位或复位操作,共有四条指令。 CLR C ; 0→CY,清CY CLR 0→bit,清某一位 SETB C ; 1→CY,置位CY SETB 1→bit,置位某一位 [3]. 位运算指令(6条) 位运算都是逻辑运算,有与、或、非三种指令,共六条。 ANL C,(CY)∧(bit)→CY ANL C,/(CY)∧( )→CY ORL C,(CY)∨(bit)→CY ORL C,/(CY)∧( )→CY CPL C ;( )→CY CPL( )→bir [4]. 位控制转移指令(5) 位控制转移指令是以位的状态作为实现程序转移的判断条件,介绍如下: JC (CY)=1转移,(PC)+2+rel→PC,否则程序往下执行,(PC)+2→PC。 JNC (CY)=0转移,(PC)+2+rel→PC,否则程序往下执行,(PC)+2→PC。 JB bit, 位状态为1转移。 JNB bit, 位状态为0转移。 JBC bit, 位状态为1转移,并使该位清“0”。 后三条指令都是三字节指令,如果条件满足,(PC)+3+rel→PC,否则程序往下执行,(PC)+3→PC
请登录后再发表评论!

我要回帖

更多关于 指令宝贝全集 的文章

 

随机推荐