51单片机MOVX指令详细执行过程

合集下载

51单片机指令使用方法

51单片机指令使用方法

51单片机指令使用方法51单片机是一种常用的嵌入式微控制器,广泛应用于各种电子设备中。

它具有强大的控制能力和灵活的指令集,为我们开发各种应用提供了便利。

在使用51单片机时,我们需要熟悉其指令的使用方法,下面我们来介绍一些常用的指令及其应用。

首先,我们来讲解一些与数据传输和处理相关的指令。

MOV指令是最常用的指令之一,用于将一个数据从一个寄存器或内存单元传输到另一个寄存器或内存单元。

通过MOV指令,我们可以在单片机中实现数据的复制、传递和处理等操作。

除了MOV指令,还有一些其他常用的数据传输和处理指令,比如ADD指令用于进行加法运算,AND指令用于进行逻辑与操作,OR指令用于进行逻辑或操作等。

这些指令可以实现各种数据处理、逻辑运算和位操作等功能,为我们的程序提供灵活性和多样性。

接下来,我们介绍一些与控制流程相关的指令。

循环结构是程序中常用的一种控制结构,而JMP指令和CJNE指令可以实现跳转和循环控制。

JMP指令用于无条件跳转到指定的地址,而CJNE指令则根据比较结果决定是否跳转到指定的地址。

通过这些指令,我们可以实现程序的分支、循环和条件控制等功能。

此外,还有一些与中断处理相关的指令需要我们熟悉。

中断是单片机中常用的一种事件触发机制,通过中断处理,我们可以实现对外部事件的及时响应。

EA指令用于使能全局中断,而EN和DIS指令用于使能和禁止外部中断。

通过这些指令,我们可以合理利用中断机制,提高程序的响应速度和实时性。

最后,我们来介绍一些与IO口操作相关的指令。

单片机的IO口是与外部设备进行通信的接口,而P1、P2等寄存器则是与IO口对应的数据寄存器。

通过MOV指令和SETB/C指令,我们可以实现对IO口数据的读写操作和控制。

通过这些指令,我们可以与外部设备进行数据交互,实现各种输入输出功能。

总结起来,51单片机的指令使用是嵌入式开发中的基础知识,熟练掌握各种指令的使用方法能够提高我们的开发效率和程序的性能。

由MOVX指令深入分析51单片机总线时序及扩展

由MOVX指令深入分析51单片机总线时序及扩展

1 MC S 5 1单 片 机 系 统 的 四要 素
1 . 1 5 1单 片 机 系 统 的 启 动
MC S 5 1单 片 机 上 电 正 常 工 作 , 需具 备 以下 四点 : ( 1 ) 电 源 。A T 8 9 S 5 1系 列单 片机 的 第 4 0引 脚 为 V 外
加电压 5 V工 作 电 压 ,另 外 ,单 片 机 的 第 2 0 引 脚 是
中 图 分 类 号 :T P 3 1 3 文 献 标 识 码 :A 文 章 编 号 :1 6 7 4 — 7 7 2 0 ( 2 0 1 3 ) 2 0 — 0 0 0 4 — 0 4
De e p l y a n a l y z i n g b u s s e q u e n c e a n d e x p a n s i o n o f 5 1 MUC b y c o mma n d M OVX
So f t wa r e Te ch n o l o g y
由 MO V X指令 深入分析 5 1 单片机总线 时序及扩展
周 姝 颖 ,林 凡 强 ,何 凌 霄 ,富 饶 ( 成都 理 工 大 学 信 息 科 学 与 技 术 学 院 , 四川 成 都 6 1 0 0 5 9 )
摘 要 :分 析 了 MC S 5 1单 片 机 访 问 外 部 存 储 器 指 令 MO V X 的 执 行 过 程 ,介 绍 了 5 1系 列 单 片 机 使
ቤተ መጻሕፍቲ ባይዱ
Ke y wor d s:MC U;b u s ;s e q u e n c e i n t i me ;s p a c e o f me mo  ̄ ;d e c o d i n g
A T 8 9 C 5 l单 片 机 是 A T ME L 公 司 设 计 生 产 的 与 MC S 5 1内 核 兼 容 的 5 1系 列 单 片 机 之 一 ,该 系 列 单 片 机 以 其 优 越 的 性 能 和 成 熟 的 技 术 在 控 制 和 自动 化 应 用 领 域 占有着 较 大的 市场 ; 除此 以外 , 5 1单 片 机 有 着 计 算 机 系统 中经 典 的总线结 构 , 即: 数据 总线 、 地 址 总 线 和 控 制 总线 。 在 实 际 应 用 中 ,单 片 机 的 4个 端 口 中 , P O 口通 常 是

常见51单片机指令及详解

常见51单片机指令及详解

常见51单片机指令及详解1. 简介单片机是一种集成电路,具备处理和控制功能。

51单片机是指Intel公司推出的一系列8位单片机,常用于嵌入式系统和物联网设备。

本文将介绍一些常见的51单片机指令,并对其进行详解。

2. 数据传送指令2.1 MOV指令MOV指令用于将数据从一个寄存器或内存位置传送到另一个寄存器或内存位置。

例如:MOV A, #10 ;将立即数10传送给累加器AMOV R0, R1 ;将寄存器R1的值传送给R02.2 XCH指令XCH指令用于交换两个寄存器或内存位置中的数据。

例如:XCH A, B ;交换累加器A和B的值3. 算术运算指令3.1 ADD指令ADD指令用于将两个操作数相加,并将结果保存在累加器中。

例如:ADD A, B ;将累加器A和寄存器B的值相加,结果存储在A中3.2 SUBB指令SUBB指令用于将第二个操作数的补码与累加器的值相减,并将结果存储在累加器中。

例如:SUBB A, B ;将B的补码与累加器A的值相减,结果存储在A中4. 逻辑运算指令4.1 ANL指令ANL指令用于对两个操作数进行按位与运算,并将结果存储在目的操作数中。

例如:ANL A, B ;将累加器A和寄存器B的值按位与,结果存储在A 中4.2 ORL指令ORL指令用于对两个操作数进行按位或运算,并将结果存储在目的操作数中。

例如:ORL A, B ;将累加器A和寄存器B的值按位或,结果存储在A 中5. 跳转指令5.1 JMP指令JMP指令用于无条件跳转至指定的目标地址。

例如:JMP 2000H ;跳转至内存地址2000H处执行指令5.2 JZ指令JZ指令用于在累加器为零时跳转至指定的目标地址。

例如:JZ 3000H ;当累加器为零时,跳转至内存地址3000H处执行指令6. 输入输出指令6.1 IN指令IN指令用于将外部设备的数据输入到累加器或指定的寄存器中。

例如:IN A, P1 ;将P1端口的数据输入到累加器A中6.2 OUT指令OUT指令用于将累加器或指定的寄存器中的数据输出到外部设备。

MCS--51单片机指令

MCS--51单片机指令

MCS--51单片机指令一、数据传送类指令1、内部数据存储器间数据传送指令MOV A,#dataMOV A,directMOV A,RnMOV A,@RiMOV Rn,#dataMOV Rn,directMOV Rn,AMOV direct,#dataMOV direct,AMOV direct,RnMOV direct,@RiMOV direct,directMOV @Ri,#dataMOV @Ri,AMOV @Ri,direct2、以DPTR为目的的MOV DPRT,#data 163、访问片外RAMMOVX A,@DPTRMOVX A,@RiMOVX @DPTR,AMOVX @Ri,A4、访问片外ROMMOVC A,@A+DPTR ;(A) ←((A)+(DPTR))MOVC A,@A+PC ;(PC) ←(PC)+1,(A) ←((A)+(PC))5、数据交换指令XCH A,direct ;(A) ↔(direct)XCH A,@Ri ;(A) ↔((Ri))XCH A,Rn ;(A) ↔(Rn)XCHD A,@Ri ;(A3~0)↔ ((Rn)3~0)SWAP A ;(A7~4)↔ (A3~0)6、堆栈操作类指令PUSH direct ;(SP)←(SP)+1,(SP)←(direct)POP direct ;(direct)←(SP),(SP)←(SP)-1二、算术运算类指令1、加法指令ADD A,#dataADD A,directADD A,@RiADD A,Rn2、带进位加法指令ADDC A,#data ;(A)←(A)+(CY)+#dataADDC A,directADDC A,@RiADDC A,Rn3、带借位减法SUBB A,#data ;(A)←(A)-(CY)-#dataSUBB A,directSUBB A,@RiSUBB A,Rn4、加1、减1指令INC AINC directINC @RiINC RnINC DPRTDEC ADEC directDEC @RiDEC Rn5、乘、除法指令乘法指令MUL AB ;(B)←((A)×(B))15~8,(A)←((A)×(B))7~0(CY)←0除法指令DIV AB ;(A)←(A)÷(B)之商,(B)←(A)÷(B)之余数(CY)←0,(OV)←06、十进制调整指令DA A ;若(A)3~0>9或(AC)=1,则(A)3~0←(A)3~0+06H;若(A)7~4>9或(CY)=1,则(A)7~4←(A)7~4+06H三、逻辑运算及移位类指令1、逻辑“与”运算指令ANL direct,AANL direct,#dataANL A,#dataANL A,directANL A,@RiANL A,Rn2、逻辑“或”运算指令ONL direct,AONL direct,#dataONL A,#dataONL A,directONL A,@RiONL A,Rn3、逻辑“异或”运算指令XNL direct,AXNL direct,#dataXNL A,#dataXNL A,directXNL A,@RiXNL A,Rn4、累加器A清零与取反指令CLR A ;(A)←00HCPL A ;(A)←(Ᾱ)5、移位指令RL A ;(A n+1)←(A n),(A0)←(A7)RLC A ;(A n+1)←(A n),(CY)←(A7),(A0)←(CY)RR A ;(A n)←(A n+1),(A7)←(A0)RRC A ;(A n)←(A n+1),(CY)←(A0),(A7)←(CY)四、控制转移类指令1、无条件转移指令LJMP addr16AJMP addr11SJMP relJMP @A+DPTR2、条件转移指令1)累加器判零转移指令JZ rel ;若(A)=0,则跳转JNZ rel ;若(A)≠0,则跳转2)比较转移指令CJNE A,#data,relCJNE A,direct,relCJNE @Ri,#data,relCJNE Rn,#data,rel若目的操作数=源操作数,则执行下一条指令若目的操作数>源操作数,则跳转,CY=0若目的操作数<源操作数,则跳转,CY=13)减1条件转移指令DJNZ direct,rel ;(direct)←(direct)-1若(direct)=0,则执行下一条指令否则,跳转DJNZ Rn,rel ;(Rn)←(Rn)-1若(Rn)=0,则执行下一条指令否则,跳转3、子程序调用及返回指令LCALL addr16ACALL addr11RETRETI4、空操作指令NOP五、位操作类指令1、位传送指令MOV C,bitMOV bit,C2、位置位指令CLR bit ;(bit)←0CLR C ;(CY)←0SETB bit ;(bit)←1SETB C ;(CY)←13、位逻辑指令ANL C,bitANL C,/bitORL C,bitORL C,/bitCPL bitCPL C4、位条件转移指令1)、以CY内容为条件的双字节双周期转换指令JC rel;若(CY)=1,则转移否则,顺序执行JNC rel;若(CY)=0,则转移否则,顺序执行2)、以位地址内容为条件的三字节双周期转移指令JB bit,rel;若(bit)=1,则转移否则,顺序执行JNB bit,rel;若(bit)=0,则转移否则,顺序执行JBC bit,rel;若(bit)=1,则转移,(bit)←0否则,顺序执行。

MCS-51单片机的指令

MCS-51单片机的指令

MCS-51单⽚机的指令MCS-51单⽚机的指令⼀.数据传送类指令(29条).1 通⽤传送指令(16条)格式:MOV ⽬的操作数,源操作数功能:把第⼆操作数指定的字节内容传送到第⼀操作数指定的单元中。

不影响源操作数内容,不影响别的寄存器和标志。

根据⽬的操作数的不同,通⽤传送指令⼜分为以下⼏种类型:1.1 以累加器A为⽬的操作数的传送类指令(4条)指令助记符及功能说明如下:⽬的操作数源操作数功能说明源操作数寻址⽅式MO V A, direct ;(A)←(direct)直接寻址MO V A, @Ri ;(A)←((Ri))寄存器间接寻址MO V A, Rn ;(A)←(Rn)寄存器寻址MO A, #data ;(A)←data ⽴即寻址V这类指令的功能是将源操作数送到⽬的操作数A中。

指令执⾏后的结果:除了奇偶标志P始终跟踪A中数据的奇偶性外,不影响PSW中的其他标志位。

1.2 以Rn为⽬的操作数的传送类指令(3条)指令助记符及功能说明如下:⽬的操作数源操作数功能说明源操作数寻址⽅式MOVRn, A ;(Rn)←(A) 寄存器寻址MO V Rn, direct ;(Rn)←(direct)其中,Rn是R0,…,R7中的任意⼀个。

例1 若(A)=20H,则执⾏指令MOV R3, A后,(R3)=20H。

注意:Rn寄存器之间不能直接传送数据。

如指令“MOV R1, R7”是错误的。

该类指令执⾏后,不影响PSW中的标志位。

1.3. 以直接地址directX为⽬的操作数的传送类指令(5条)指令助记符及功能说明如下:⽬的操作数源操作数功能说明源操作数寻址⽅式M OV directX, A ;(directX)←(A)寄存器寻址M directX, Rn ;(directX)←寄存器寻址OV (Rn)M OV directX, directY ;(directX)←(directY)直接寻址M OV directX, @Ri ;(directX)←((Ri))寄存器间接寻址M OV directX, #data ;(directX)←data⽴即寻址这类指令的功能是把源操作数的内容送到直接地址directX中去。

51系列单片机指令系统

51系列单片机指令系统

MOV DPTR,#1000H MOVX A,@DPTR INC DPTR, MOVX @DPTR,A 7、程序存储器向累加器A传送指令 MOVC A,@A+DPTR MOV DPTR,#100H MOV A,R0 MOVC A,@A+DPTR ORG 0100H. DB 0,1,4,9,16,25 8、堆栈操作指令 PUSH direct POP direct 第一条指令称之为入栈指令,就是将direct中的内容 送入堆栈中,第二条指令称之为弹出指令,就是将堆栈 中的内容送回到direct中。
位寻址时,操作数是二进制数的某一位,其位地 址出现在指令中,例如指令 • SETB bit ;(bit) ← l • 51系列单片机可用于位寻址的空间是内部RAM的可 位寻址区和SFR区中的字节地址可以被8整除(即地址以 “0”或“8”结尾)的寄存器所占空间,寻址方式如表 2-2所示。
表2-2 寻址方式一览表
寻 址 方 式
寻 址 范 围
R0-R7 ,DPTR ACC,B,C(CY位)
内部RAM 00H-7FH 特殊功能寄存器 80H-FFH 内部RAM位寻址区 (20H-2FH): 位地址00H-7FH 可寻址的特殊功能寄存器: 位地址 80H-F7H 以数据指针表示操作数 内部RAM 00H-7FH 外部RAM或I/O端口 00H-FFH / 0000H-FFFFH
图2-3 寄存器间接寻址
图2-4 立即寻址
4、立即寻址

立即寻址时,指令中直接给出操作数。例如指令 MOV A,#76H ;数据76H送累加器 A。 • 立即数寻址过程如图2-4所示。
5、变址寻址

变址寻址时,指定的变址寄存器的内容与指令中 给出的偏移量相加,所得的结果作为操作数的地址。 例如指令MOVC A, @A+DPTR ;((A)+(DPTR))送 A。变址寻址过程如图2-5所示。 不论用DPTR或PC作为基址指针,变址寻址方式都 只适用于51系列单片机的程序存储器,通常用于读取 数据表也就是将程序存储器中的数送入A中。因此也称 为查表指令,常用此指令来查一个已做好在程序存储 器中的表格,这条指令采用变址寻址。

mcs51单片机位操作指令及编程举例

mcs51单片机位操作指令及编程举例

mcs51单片机位操作指令及编程举例MCS-51 单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量处理的指令集。

在进行位处理时,CY(就是我们前面讲的进位位)称位累加器。

有自已的位RAM,也就是我们刚讲的内部RAM 的20H-2FH 这16 个字节单元即128 个位单元,还有自已的位I/O 空间(即P0.0..P0.7,P1.0.P1.7,P2.0..P2.7,P3.0..P3.7)。

当然在物理实体上它们与原来的以字节寻址用的RAM,及端口是完全相同的,或者说这些RAM 及端口都能有两种使用办法。

(1)位传送指令MOV C,BITMOV BIT,C 这组指令的功能是实现位累加器(CY)和其它位地址之间的数据传递。

例:MOV P1.0,CY ;将CY中的状态送到P1.0 管脚上去(如果是做算术运算,我们就能通过观察知道现在CY 是多少啦)。

MOV P1.0,CY ;将P1.0 的状态送给CY。

(2)位修正指令位清0 指令CLR C ;使CY=0CLR bit ;使指令的位地址等于0。

例:CLR P1.0 ;即使P1.0 变为0 位置1 指令SETB C ;使CY=1SETB bit ;使指定的位地址等于1。

例:SETB P1.0 ;使P.0 变为1 位取反指令CPL C ;使CY 等于原来的相反的值,由1 变为0,由0 变为1。

CPL bit ;使指定的位的值等于原来相反的值,由0 变为1,由1 变为0。

例:CPL P1.0 以我们做过的实验为例,如果原来灯是亮的,则执行本指令后灯灭,反之原来灯是灭的,执行本指令后灯亮。

(3)位逻辑运算指令位与指令ANL C,bit ;CY 与指定的位地址的值相与,结果送回CYANL C,/bit ;先将指定的位地址中的值取出后取反,再和CY 相与,结果送回CY,但注意,指定的位地址中的值本身并不发生变化。

例:ANL C,/P1.0 设执行本指令前,CY=1,P1.0 等于1(灯灭),则执行完本指令后CY=0,而P1.0 也是等于1。

51单片机执行指令的过程

51单片机执行指令的过程

51单片机执行指令的过程单片机是一种集成度高的微控制器。

它由中央处理器单元(CPU)、存储器和外设接口电路等功能模块组成,能够实现数据的输入与输出、控制系统中各种设备的工作。

其执行指令的过程可以简单地分为指令存储、指令译码和指令执行三个阶段。

首先,在指令存储阶段,将程序存储到单片机的存储器中。

单片机通过地址线从存储器中读取指令,并通过数据线将指令传送到指令译码器中。

存储器中的指令由二进制代码表示,每条指令的位数和格式由单片机的体系结构决定。

接下来,在指令译码阶段,译码器根据指令的操作码(OpCode)来判断指令的类型,并将指令传送给相应的功能块进行执行。

根据不同的指令类型,所需的操作包括运算、逻辑判断、数值传输等等。

译码器还负责解析指令的操作数及寻址方式。

最后,在指令执行阶段,指令被单片机的CPU执行。

根据译码器解析出来的指令类型和操作数,CPU通过执行相应的操作完成指令的功能。

执行过程中,各个功能模块之间的数据传递通过数据总线进行。

CPU还会根据指令的结果和条件码更新标志寄存器,以便用于后续指令的判断和跳转。

在指令的执行过程中,单片机的工作频率决定了指令的执行速度。

频率越高,单片机能够处理的指令越多,执行的速度越快。

同时,单片机还可以根据需要选择不同的时钟选项,以满足不同应用场景对执行速度和功耗的要求。

除了基本的指令执行过程,单片机还提供了各种中断机制,用于及时响应外部事件。

当发生中断事件时,CPU会根据优先级去中断向量表中查找相应的中断服务程序,并执行相关操作,以处理中断请求。

中断机制的存在大大提高了单片机的实时性和可用性。

总结起来,单片机执行指令的过程包括指令存储、指令译码和指令执行三个阶段。

指令存储阶段将程序存储到存储器中,指令译码阶段根据指令的操作码进行译码,指令执行阶段根据译码结果执行相应的操作。

通过这一过程,单片机能够实现各种应用场景下的控制和数据处理。

MCS-51单片机指令系统-数据传送类指令

MCS-51单片机指令系统-数据传送类指令

• 例 从片外程序存储器2000H单元 开始存放0~9的平方值,以DPTR作 为基址寄存器进行查表得3的平方 值。
1FFDH 1FFEH 1FFFH 2000H 0 1 4 9 16 25 36 49 64 81
• • • • •
如果用以DPTR为基址寄存器 2001H 的查表指令,其程序如下: MOV DPTR, #2000H;置表首地址 MOV A, #03H MOVC A, @A+DPTR 2009H
• 设MOVC指令所在地址(PC)=1FFDH,则 偏移量=2000H-(1FFDH+1)=02H。 • 相应的程序如下: MOV A,#03H ;(A)←03H ADD A,#02H ;用加法指令 进 行地址调整 MOVC A,@A+PC ;(A)←(A+PC+1) 执行结果为:(PC)=1FFEH,(A)=09。
• 前一条指令采用DPTR作基址寄存器,因此可以很方便地把 一个16位地址送到DPTR,实现在整个64 KB程序存储器单 元到累加器A的数据传送。即数据表格可以存放在程序存 储器64 KB地址范围的任何地方。 • 后一条指令以PC作为基址寄存器,CPU取完该指令操作码 时PC会自动加1,指向下一条指令的第一个字节地址,即 此时是用(PC)+1作为基址的。另外,由于累加器A中的内 容为8位无符号数,这就使得本指令查表范围只能在256个 字节范围内(即(PC)+1H~(PC)+100H),使表格地址空间分 配受到限制。同时编程时还需要进行偏移量的计算,即 MOVC A,@A+PC指令所在地址与表格存放首地址间的距离 字节数的计算,并需要一条加法指令进行地址调整。偏移 量计算公式为: • 偏移量 = 表首地址-(MOVC指令所在地址+1)

MCS51单片机的指令时序

MCS51单片机的指令时序

单片机时序图MCS51单片机的指令时序接下来我们分别对几个典型的指令时序加以说明。

·单字节单周期指令:单字节单周期指令只进行一次读指令操作,当第二个ALE信号有效时,PC并不加1,那么读出的还是原指令,属于一次无效的读操作。

·双字节单周期指令:这类指令两次的ALE信号都是有效的,只是第一个ALE信号有效时读的是操作码,第二个ALE信号有效时读的是操作数。

·单字节双周期指令:两个机器周期需进行四读指令操作,但只有一次读操作是有效的,后三次的读操作均为无效操作。

单字节双周期指令有一种特殊的情况,象MOVX这类指令,执行这类指令时,先在ROM 中读取指令,然后对外部数据存储器进行读或写操作,头一个机器周期的第一次读指令的操作码为有效,而第二次读指令操作则为无效的。

在第二个指令周期时,则访问外部数据存储器,这时,ALE信号对其操作无影响,即不会再有读指令操作动作。

上页的时序图中,我们只描述了指令的读取状态,而没有画出指令执行时序,因为每条指令都包含了具体的操作数,而操作数类型种类繁多,这里不便列出,有兴趣的读者可参阅有关书籍时序是用定时单位来描述的,MCS-51的时序单位有四个,它们分别是节拍、状态、机器周期和指令周期,接下来我们分别加以说明。

·节拍与状态:我们把振荡脉冲的周期定义为节拍(为方便描述,用P表示),振荡脉冲经过二分频后即得到整个单片机工作系统的时钟信号,把时钟信号的周期定义为状态(用S表示),这样一个状态就有两个节拍,前半周期相应的节拍我们定义为1(P1),后半周期对应的节拍定义为2(P2)。

·机器周期:MCS-51有固定的机器周期,规定一个机器周期有6个状态,分别表示为S1-S6,而一个状态包含两个节拍,那么一个机器周期就有12个节拍,我们可以记着S1P1、S1P2……S6P1、S6P2,一个机器周期共包含12个振荡脉冲,即机器周期就是振荡脉冲的12分频,显然,如果使用6MHz的时钟频率,一个机器周期就是2us,而如使用12MHz的时钟频率,一个机器周期就是1us。

51单片机 第三章指令系统

51单片机   第三章指令系统
; DPH ← #56H,DPL ← #78H
10
3.2.5 变址寻址方式
1.
变址寻址方式是以程序计数器PC或数据指针 DPTR作为基址寄存器,以累加器A作为变址寄 存器,它们两者内容之和为有效地址。 寻址范围:
程序存储器空间。
2.
3.
变址寻址方式的指令只有3条:
⑴ MOVC A, @A+DPTR ⑵ MOVC A, @A+PC ⑶ JMP @A+DPTR ; 查表指令 ; 查表指令 ; 散转指令
⑴ 低128个存储单元,8-bit二进制数表示地址。 ⑵ 特殊功能寄存器,用直接地址或称号表示。
2.
3.
例如,指令 MOV A, 30H
; A ← (30H)
8
3.2.3 寄存器间接寻址方式
1.
寄存器间接寻址时,指令中给出的寄存器为地 址指针。 寻址范围:
⑴ 片内和片外RAM 256单元,用R0或R1间接寻址。
34
4.
除法
整数部分
DIV AB
A
被除数
X B
除数

A
B
余数部分
除数为0,商的A和B内容不确定,且(OV)=1 。 标志Cy总是被清0。 例: 若(A)=FBH(251),(B)=12H (18),执行指令 DIV AB 之后,(A)=0DH, (B)=11H,(OV)=0,(Cy)=0。
35
3.3.3 逻辑运算及移位类指令
例: 若(A)=C3H,(R0)=AAH,执行指令 ANL A, R0 之后,(A)=82H。
37

逻辑或 源操作数与直接地址单元内容相或
ORL direct, A #data
源操作数与累加器A的内容相或

51单片机常见汇编程序实验代码

51单片机常见汇编程序实验代码

51单片机常见汇编程序实验代码1. 将片外8000H-80FFH单元写入数据AB 32. 将片内RAM20H单元中数据在数码管上显示出来 (3)3. 将片内ARM30H-40H单元清零 54. 将六位数显示在数码管上 55. 8255并口芯片的应用:交通灯控制系统的设计 (6)6. 将交通灯点亮 (7)7. AD转换实验 (8)8. DA转换实验 (10)9. 定时器的应用 ·· 1110. 开关控制LED的亮灭及速度 1211. 计数器实验 (12)12. 串并转换实验 · 1413. 直流电机速度检测1514. 8255PB外接8个开关,编程将开关状态显示在数码管上(串并转换动态扫描方式)17 15. P3.4接开关K,编程将开关拨动次数,通过串并转换的方式进行显示1816. 比较片内RAM30H、31H两个单元值的大小,将较大的数显示在数码管上1917. 单片机P1口接8个开关,编程将开关状态显示在数码管上(串并转换动态扫描方式) (21)18. 将片内50H单元的值显示在数码管上2219. 开关K1接P1.0,K2接P1.1,编程实现当按下K1时在数码管上显示50H单元的值,按下K2在数码管上显示51H单元的值231. 将片外8000H-80FFH单元写入数据ABORG 0000H ;程序从0000H开始执行AJMP MAIN ;跳转到主程序ORG 0030H ;以免覆盖中断MAIN: MOV SP,#60H; 避免堆栈和工作寄存器区冲突MOV DPTR,#8000HMOV R0,#0LOOP: MOV A,#0ABHMOVX @DPTR,AINC DPTRINC R0CJNE R0,#0,LOOP ; 判断AJMP $; 等待END ;调试-视图-M存储器(输入X:8000H)2. 将片内RAM20H单元中数据在数码管上显示出来ORG 0000H ;程序从0000H开始执行AJMP MAIN ;跳转到主程序ORG 0030H ;以免覆盖中断MAIN: MOV SP,#60H ;避免堆栈和工作寄存器区冲突MOV DPTR,#0E100H ;指向命令口MOV A,#03H ;PA、PB口输出MOVX @DPTR,A ;所有并口显示程序先进行8155初始化MOV 20H,#34HMOV A,20HACALL CHAILOOP: MOV R0,#10H ;第一个显示数的送R0MOV R1,#2 ;显示2个数MOV R2,#1 ;从倒数第一个数码管开始显示ACALL DISPLAYLJMP LOOP ;判断CHAI: MOV B,#10HDIV ABMOV 10H,BMOV 11H,ARETDISPLAY: MOV A,@R0MOV 0FH,#8ACALL P164ACALL PBITACALL DELAYMOV A,#0MOVX @DPTR,AINC R0DJNZ R1,DISPLAYRETP164: MOV DPTR,#TABMOVC A,@A+DPTRP164_1: RRC AMOV R3,AMOV ACC.0,CANL A,#0FDHMOV DPTR,#0E102HMOVX @DPTR,AORL A,#0FEHMOVX @DPTR,AMOV A,R3DJNZ 0FH,P164_1MOV 0FH,#8RETPBIT: MOV DPTR,#0E101HMOV A,R2MOVX @DPTR,ARL AMOV R2,ARETDELAY: MOV R6,#4DEL: MOV R7,#250DJNZ R7,$DJNZ R6,DELRETTAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H DB 0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EHEND3. 将片内ARM30H-40H单元清零ORG 0000H ;程序从0000H开始执行AJMP MAIN ;跳转到主程序ORG 0030H ;以免覆盖中断MAIN: MOV SP,#60H ;避免堆栈和工作寄存器区冲突MOV R0,#30HMOV A,#0LOOP: MOV @R0,AINC R0CJNE R0,#41H,LOOP ;判断AJMP $ ;等待END ;D:30H4. 将六位数显示在数码管上ORG 0000H ;程序从0000H开始执行AJMP MAIN ;跳转到主程序ORG 0030H ;以免覆盖中断MAIN: MOV SP,#60H ;避免堆栈和工作寄存器区冲突MOV DPTR,#0E100H ;指向命令口MOV A,#03H ;PA、PB口输出MOVX @DPTR,A ;所有并口显示程序先进行8155初始化LOOP: MOV R0,#10H ;第一个显示数的送R0MOV 10H,#0HMOV 11H,#3HMOV 12H,#1HMOV 13H,#2HMOV 14H,#1HMOV 15H,#1HMOV R1,#6 ;显示6个数MOV R2,#1 ;从倒数第一个数码管开始显示ACALL DISPLAYLJMP LOOPDISPLAY: MOV A,@R0MOV 0FH,#8ACALL P164ACALL PBITACALL DELAYMOV A,#0MOVX @DPTR,AINC R0DJNZ R1,DISPLAYRETP164: MOV DPTR,#TABMOVC A,@A+DPTRP164_1: RRC AMOV R3,AMOV ACC.0,CANL A,#0FDHMOV DPTR,#0E102HMOVX @DPTR,AORL A,#0FEHMOVX @DPTR,AMOV A,R3DJNZ 0FH,P164_1MOV 0FH,#8RETPBIT: MOV DPTR,#0E101HMOV A,R2MOVX @DPTR,ARL AMOV R2,ARETDELAY: MOV R6,#4DEL: MOV R7,#250DJNZ R7,$DJNZ R6,DELRETTAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0HDB 0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EHEND5. 8255并口芯片的应用:交通灯控制系统的设计ORG 0000HAJMP STARTORG 0030HSTART: MOV DPTR,#0AC03HMOV A,#80HMOVX @DPTR,A //8155初始化(所有并口显示中都要先8155初始化)MOV R5,#0F0HACALL DENGMOV R1,#20ACALL DELAYMOV R0,#1LOOP01: MOV R5,#5AHACALL DENGMOV R1,#100ACALL DELAYDJNZ R0,LOOP01MOV R0,#3 // LED_2闪烁次数LOOP02: MOV R5, #0FAHACALL DENGMOV R1,#10ACALL DELAYMOV R5,#50HACALL DENGMOV R1,#10ACALL DELAYDJNZ R0,LOOP02MOV R5,#0A5HACALL DENGMOV R1,#100ACALL DELAYMOV R0,#3LOOP03: MOV R5, #0F5HACALL DENGMOV R1,#10ACALL DELAYMOV R5,#0A0HACALL DENGMOV R1,#10ACALL DELAYDJNZ R0,LOOP03AJMP LOOP01DENG: MOV DPTR,#0AC00H //8155 PA口输出MOV A,R5MOVX @DPTR,A //8155 PA口送出显示参数RET //100ms延时子程序DELAY: MOV R7,#200DEL: MOV R6,#229DJNZ R6,$DJNZ R7,DELDJNZ R1,DELAYRETEND6. 将交通灯点亮ORG 0000HAJMP STARTORG 0030HSTART: MOV DPTR,#0AC03HMOV A,#80HMOV DPTR,#0AC00HMOV A,#05AHMOVX @DPTR,AAJMP $END7. AD转换实验ORG 0000AJMP STARTORG 000BHAJMP INT_0ORG 0030H START: MOV SP,#60HMOV TMOD,#01HMOV TH0,#4BHMOV TL0,#0FDHMOV R4,#2SETB EASETB ET0SETB TR0MOV DPTR,#0E100HMOV A,#3MOVX @DPTR,AMOV 22H,#9MOV 23H,#0MOV 24H,#8MOV 25H,#0 LOOP: MOV R0,#20HMOV R1,#6MOV R2,#1ACALL DISPLAYSJMP LOOPINT_0: MOV TH0,#4BHMOV TL0,#0FDHDJNZ R4,EXITPUSH ACCPUSH DPHPUSH DPLMOV DPTR,#0A000HMOVX A,@DPTRMOV B,#10HDIV ABMOV 21H,AMOVX @DPTR,AMOV R4,#2POP DPLPOP DPHPOP ACCEXIT: RETIDISPLAY: MOV A,@R0MOV 0FH,#8ACALL P164ACALL PBITACALL DELAYMOV A,#0MOVX @DPTR,AINC R0DJNZ R1,DISPLAYRETP164: MOV DPTR,#TABMOVC A,@A+DPTRP164_1: RRC AMOV R3,AMOV ACC.0,CANL A,#0FDHMOV DPTR,#0E102HMOVX @DPTR,AORL A,#0FEHMOVX @DPTR,AMOV A,R3DJNZ 0FH,P164_1MOV 0FH,#8RETPBIT: MOV DPTR,#0E101HMOV A,R2MOVX @DPTR,ARL AMOV R2,ARETDELAY: MOV R6,#4DEL: MOV R7,#250DJNZ R7,$DJNZ R6,DELRETTAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H DB 0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EHEND8. DA转换实验ORG 0000SJMP STARTORG 0030HSTART: MOV SP,#60HMOV A,#0LOOP1: MOV DPTR,#0B000HMOVX @DPTR,AACALL XSACALL DELAYINC ACJNE A,#0FFH,LOOP1LOOP2: MOV DPTR,#0B000HMOVX @DPTR,AACALL XSACALL DELAYDEC ACJNE A,#0,LOOP2SJMP LOOP1XS: PUSH ACCMOV DPTR,#TABMOV B,#51DIV ABMOV R1,AXCH A,BMOV B,#5DIV ABMOVC A,@A+DPTRMOV R4,#8ACALL S164MOV A,R1MOVC A,@A+DPTRMOV R4,#8ACALL S164MOV A,#0CLR CMOV R4,#16ACALL S164POP ACCRETS164: RRC AMOV P1.0,CCLR P1.1SETB P1.1DJNZ R4,S164RETDELAY: MOV R7,#200DEl: MOV R6,#229DJNZ R6,$DJNZ R7,DELRETTAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H DB 0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EHEND9. 定时器的应用ORG 0000HAJMP STARTORG 00BHAJMP INT_0ORG 0030HSTART: MOV TMOD,#01HMOV TH0,#4BHMOV TL0,#0FDHMOV R0,#20MOV R1,#0SETB ET0SETB TR0SETB EAAJMP $INT_0: MOV TH0,#4BHMOV TL0,#0FDHDJNZ R0,EXITMOV R0,#20MOV A,R1MOV DPTR,#TABMOVC A,@A+DPTRMOV P1,AINC R1CJNE R1,#8,EXITMOV R1,#0EXIT: RETITAB: DB 0FFH,0FAH,0F5H,0AFH,05FH,0AAH,55H,0H,0FFH END10. 开关控制LED的亮灭及速度ORG 0000H ;程序从0000H开始执行AJMP START ;跳转到主程序ORG 0030H ;以免覆盖中断START: MOV R4,#1 ;立即数传送到累加器LOOP: CLR P3.3 ;进位标志位清零LOOP1: JNB P3.5,LOOP ;直接寻址位为0则转移JB P3.4,LOOP2 ;直接寻址位为1则转移JNB P3.4,$INC R4 ;寄存器增1LOOP2: CPL P3.3 ;累加器求反MOV A,R4 ;寄存器内容传送到累加器AMOV R5,A ;累加器内容传送到累加器ACALL DELAY ;调用延时函数AJMP LOOP1 ;循环DELAY: MOV R6,#200DEL: MOV R7,#229DJNZ R7,$DJNZ R6,DEL ;寄存器减1,不为0则转移DJNZ R5,DELAYRET ;子程序返回END11. 计数器实验ORG 0000SJMP STARTORG 001BHLJMP INT_1START: MOV SP,#60HMOV R5,#20MOV TMOD,#15HMOV TH1,#4BHMOV TL1,#0FDHMOV TH0,#0MOV TL0,#0SETB ET1SETB EASETB TR1SETB TR0MOV DPTR,#0E100HMOV A,#3MOVX @DPTR,ALOOP: MOV R0,#50H;MOV R1,#4LCALL DISPLAYSJMP LOOPINT_1: MOV TH1,#4BHMOV TL1,#0FDHDJNZ R5,CONMOV R5,#20PUSH ACCPUSH BMOV A,TL0MOV B,#10HDIV ABMOV 50H,BMOV 51H,AMOV A,TH0MOV B,#10HDIV ABMOV 52H,BMOV 53H,AMOV TH0,#0MOV TL0,#0POP BPOP ACCCON: RETIDISPLAY: MOV A,@R0MOV 0FH,#8ACALL P164ACALL PBITACALL DELAYMOV A,#0MOVX @DPTR,AINC R0DJNZ R1,DISPLAYRETP164: MOV DPTR,#TABMOVC A,@A+DPTR P164_1: RRC AMOV R3,AMOV ACC.0,CANL A,#0FDHMOV DPTR,#0E102HMOVX @DPTR,AORL A,#0FEHMOVX @DPTR,ADJNZ 0FH,P164_1MOV 0FH,#8RETPBIT: MOV DPTR,#0E101HMOV A,R2MOVX @DPTR,ARL AMOV R2,ARETDELAY: MOV R6,#4DEL: MOV R7,#250DJNZ R7,$DJNZ R6,DELRETTAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H DB 0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EHEND12. 串并转换实验ORG 0000SJMP STARTORG 0030HSTART: MOV SP,#60HMOV R1,#0MOV DPTR,#TABLOOP: MOV A,#0CLR CMOV R4,#24ACALL S164MOV A,R1MOVC A,@A+DPTRMOV R4,#8ACALL S164INC R1MOV R5,#10ACALL DELAYCJNE R1,#10,EXITMOV R1,#0EXIT: SJMP LOOPS164: RRC AMOV P1.0,CCLR P1.1SETB P1.1DJNZ R4,S164RETDELAY: MOV R6,#200DEL: MOV R7,#230DJNZ R7,$DJNZ R6,DELDJNZ R5,DELAYRETTAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H, 0FEH,0F6H END13. 直流电机速度检测ORG 0000HAJMP MAINORG 001BHAJMP INT_1ORG 0030HMAIN: MOV SP,#60HMOV TMOD,#15HMOV TH1,#4BHMOV TL1,#0FDHMOV R0,#20MOV TH0,#0MOV TL0,#0SETB ET1SETB EASETB TR0SETB TR1MOV R2,#00HUP: MOV A,R2MOV DPTR,#0A000H //注意片选接YC2,非YC3MOVX @DPTR,AMOV R5,#1ACALL DELAY ;100msINC R2CJNE R2,#0FFH,UPDOWN:MOV A,R2MOV DPTR,#0A000HMOVX @DPTR,AMOV R5,#1ACALL DELAY ;100msDEC R2CJNE R2,#00H,DOWNAJMP UPINT_1: MOV TH1,#4BHMOV TL1,#0FDHDJNZ R0,EXITMOV R0,#20PUSH ACCPUSH DPHPUSH DPLMOV A,TL0ACALL XSMOV TL0,#0MOV A,TH0ACALL XSMOV TH0,#0POP DPLPOP DPHPOP ACCEXIT: RETIXS: MOV DPTR,#TAB;MOV A,R2MOV B,#10 ;显示10进制数DIV ABXCH A,B;MOV DPTR,#TABMOVC A,@A+DPTRACALL FSXCH A,B;MOV DPTR,#TABMOVC A,@A+DPTRACALL FSRETFS: MOV R1,#8YW:RRC AMOV P1.0,CCLR P1.1SETB P1.1DJNZ R1,YWRETDELAY:MOV R6,#200DEL:MOV R7,#230DJNZ R7,$DJNZ R6,DELDJNZ R5,DELAYRETTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0HDB 0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EHEND14. 8255PB外接8个开关,编程将开关状态显示在数码管上(串并转换动态扫描方式)ORG 0000AJMP STARTORG 0030HSTART: MOV DPTR,#0AC03HMOV A, #82HMOVX @DPTR, AMOV DPTR,#0E100HMOV A,#3MOVX @DPTR,ALOOP: MOV DPTR,#0AC01HMOVX A,@DPTRMOV B,#10HDIV ABMOV 10H,BMOV 11H,AMOV R0,#10HMOV R1,#2MOV R2,#1ACALL DISPLAYSJMP LOOPDISPLAY:MOV A,@R0MOV 0FH,#8ACALL P164ACALL PBITACALL DELAYMOV A,#0MOVX @DPTR,AINC R0DJNZ R1,DISPLAYRETP164: MOV DPTR,#TABMOVC A,@A+DPTRP164_1: RRC AMOV R3,AMOV ACC.0,CANL A,#0FDHMOV DPTR,#0E102HMOVX @DPTR,AORL A,#0FEHMOVX @DPTR,ADJNZ 0FH,P164_1MOV 0FH,#8RETPBIT: MOV DPTR,#0E101HMOV A,R2MOVX @DPTR,ARL AMOV R2,ARETDELAY: MOV R6,#4DEL: MOV R7,#250DJNZ R7,$DJNZ R6,DELRETTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0HDB 0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EHEND15. P3.4接开关K,编程将开关拨动次数,通过串并转换的方式进行显示ORG 0000SJMP STARTORG 0030HSTART: MOV SP,#60HMOV R5,#0LOOP: JB P3.4,$ACALL DELAYJB P3.4,LOOPINC R5ACALL XSLOOP1: JNB P3.4,$ACALL DELAYJNB P3.4,LOOP1INC R5ACALL XSSJMP LOOPDELAY: MOV R7,#200DEL: MOV R6,#229DJNZ R6,$DJNZ R7,DELRETXS: MOV DPTR,#TABMOV A,R5MOV B,#10HMOV R1,AMOV A,BMOVC A,@A+DPTRMOV R4,#8ACALL S164MOV A,R1MOVC A,@A+DPTRMOV R4,#8ACALL S164MOV A,#0CLR CMOV R4,#16ACALL S164RETS164: RRC AMOV P1.0,CCLR P1.1SETB P1.1DJNZ R4,S164RETTAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0HDB 0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EHEND16. 比较片内RAM30H、31H两个单元值的大小,将较大的数显示在数码管上ORG 0000SJMP STARTORG 0030HSTART: MOV SP,#60HMOV DPTR,#0E100HMOV A,#3MOVX @DPTR,AMOV 30H,#06H ;随便赋两个值,显示较大的MOV 31H,#11HMOV A,30HSUBB A,31HJC SMALLMOV B,#10HMOV A,30HDIV ABMOV 30H,BMOV 31H,ABIG: MOV R0,#30HMOV R1,#2MOV R2,#1ACALL DISPLAYSJMP BIG SMALL: MOV B,#10HMOV A,31HDIV ABMOV 30H,BMOV 31H,ASMALL1:MOV R0,#30HMOV R1,#2MOV R2,#1ACALL DISPLAYSJMP SMALL1 DISPLAY:MOV A,@R0MOV 0FH,#8ACALL P164ACALL PBITACALL DELAYMOV A,#0MOVX @DPTR,AINC R0DJNZ R1,DISPLAYRETP164: MOV DPTR,#TABMOVC A,@A+DPTR P164_1: RRC AMOV R3,AMOV ACC.0,CANL A,#0FDHMOV DPTR,#0E102HMOVX @DPTR,AORL A,#0FEHMOVX @DPTR,AMOV A,R3DJNZ 0FH,P164_1MOV 0FH,#8RETPBIT: MOV DPTR,#0E101HMOV A,R2MOVX @DPTR,ARL AMOV R2,ARETDELAY: MOV R6,#4DEL: MOV R7,#250DJNZ R7,$DJNZ R6,DELRETTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0HDB 0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EHEND17. 单片机P1口接8个开关,编程将开关状态显示在数码管上(串并转换动态扫描方式)ORG 0000HSJMP STARTORG 0030HSTART: MOV SP,#60HMOV DPTR,#0E100HMOV A,#3MOVX @DPTR,ALOOP: MOV A,P1MOV B,#10HDIV ABMOV 20H,BMOV 21H,AMOV R0,#20HMOV R1,#2MOV R2,#1ACALL DISPLAYAJMP LOOPDISPLAY:MOV A,@R0MOV 0FH,#8ACALL P164ACALL PBITACALL DELAYMOV A,#0MOVX @DPTR,AINC R0DJNZ R1,DISPLAYRETP164: MOV DPTR,#TABMOVC A,@A+DPTRP164_1: RRC AMOV R3,AMOV ACC.0,CANL A,#0FDHMOV DPTR,#0E102HMOVX @DPTR,AORL A,#0FEHMOVX @DPTR,AMOV A,R3DJNZ 0FH,P164_1MOV 0FH,#8RETPBIT: MOV DPTR,#0E101HMOV A,R2MOVX @DPTR,ARL AMOV R2,ARETDELAY: MOV R6,#4DEL: MOV R7,#250DJNZ R7,$DJNZ R6,DELRETTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H DB 0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EHEND18. 将片内50H单元的值显示在数码管上ORG 0000HSJMP STARTORG 0030HSTART: MOV SP,#60HMOV DPTR,#0E100HMOV A,#3MOVX @DPTR,ALOOP: MOV A,P1MOV B,#10HDIV ABMOV 20H,BMOV 21H,AMOV R0,#20HMOV R1,#2MOV R2,#1ACALL DISPLAYAJMP LOOPDISPLAY:MOV A,@R0MOV 0FH,#8ACALL P164ACALL PBITACALL DELAYMOV A,#0MOVX @DPTR,AINC R0DJNZ R1,DISPLAYRETP164: MOV DPTR,#TABMOVC A,@A+DPTRP164_1: RRC AMOV R3,AMOV ACC.0,CANL A,#0FDHMOV DPTR,#0E102HMOVX @DPTR,AORL A,#0FEHMOVX @DPTR,AMOV A,R3DJNZ 0FH,P164_1MOV 0FH,#8RETPBIT: MOV DPTR,#0E101HMOV A,R2MOVX @DPTR,ARL AMOV R2,ARETDELAY: MOV R6,#4DEL: MOV R7,#250DJNZ R7,$DJNZ R6,DELRETTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0HDB 0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EHEND19. 开关K1接P1.0,K2接P1.1,编程实现当按下K1时在数码管上显示50H单元的值,按下K2在数码管上显示51H单元的值ORG 0000SJMP STARTORG 0030HSTART: MOV SP,#60HMOV DPTR,#0E100HMOV A,#3MOVX @DPTR,AMOV 50H,#18H ;50H,51H 随便赋两个值MOV 51H,#22HLOOP:JB P1.0,D50JB P1.1,D51SJMP LOOPD51: MOV R0,#10HMOV R1,#2MOV R2,#1MOV A,51HMOV B,#10HDIV ABMOV 10H,BMOV 11H,AACALL DISPLAYSJMP LOOPD50: MOV R0,#10HMOV R1,#2MOV R2,#1MOV A,50HMOV B,#10HDIV ABMOV 10H,BMOV 11H,AACALL DISPLAYSJMP LOOPDISPLAY:MOV A,@R0MOV 0FH,#8ACALL P164ACALL PBITACALL DELAYMOV A,#0MOVX @DPTR,AINC R0DJNZ R1,DISPLAYRETP164:MOV DPTR,#TABMOVC A,@A+DPTRP164_1:RRC AMOV R3,AMOV ACC.0,CANL A,#0FDHMOV DPTR,#0E102HMOVX @DPTR,AORL A,#0FEHMOVX @DPTR,AMOV A,R3DJNZ 0FH,P164_1MOV 0FH,#8RETPBIT:MOV DPTR,#0E101HMOV A,R2MOVX @DPTR,ARL AMOV R2,ARETDELAY:MOV R6,#4DEL:MOV R7,#250DJNZ R7,$DJNZ R6,DELRETTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H DB 0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EHEND。

常见51单片机指令及详解

常见51单片机指令及详解

常见51单片机指令及详解数据传递类指令(1)以累加器为目的操作数的指令MOV A,RnMOV A,directMOV A,@RiMOV A,#data第一条指令中,Rn代表的是R0-R7。

第二条指令中,direct就是指的直接地址,而第三条指令中,就是我们刚才讲过的。

第四条指令是将立即数data送到A中。

下面我们通过一些例子加以说明:MOV A,R1 ;将工作寄存器R1中的值送入A,R1中的值保持不变。

MOV A,30H ;将内存30H单元中的值送入A,30H单元中的值保持不变。

MOV A,@R1 ;先看R1中是什么值,把这个值作为地址,并将这个地址单元中的值送入A中。

如执行命令前R1中的值为20H,则是将20H单元中的值送入A中。

MOV A,#34H ;将立即数34H送入A中,执行完本条指令后,A中的值是34H。

(2)以寄存器Rn为目的操作的指令MOV Rn,AMOV Rn,directMOV Rn,#data这组指令功能是把源地址单元中的内容送入工作寄存器,源操作数不变。

(3)以直接地址为目的操作数的指令MOV direct,A 例: MOV 20H,AMOV direct,Rn MOV 20H,R1MOV direct1,direct2 MOV 20H,30HMOV direct,@Ri MOV 20H,@R1MOV direct,#data MOV 20H,#34H(4)以间接地址为目的操作数的指令MOV @Ri,A 例:MOV @R0,AMOV @Ri,direct MOV @R1,20HMOV @Ri,#data MOV @R0,#34H(5)十六位数的传递指令MOV DPTR,#data168051是一种8位机,这是唯一的一条16位立即数传递指令,其功能是将一个16位的立即数送入DPTR中去。

其中高8位送入DPH,低8位送入DPL。

例:MOV DPTR,#1234H,则执行完了之后DPH中的值为12H,DPL中的值为34H。

movx的用法

movx的用法

MOVX指令是用于将数据从片外RAM(外部RAM)传输到累加器A或从累加器A传输到片外RAM的指令。

执行MOVX指令时,/DR和/WR(读写选通信号)会自动有效,从而允许对片外RAM进行读写。

在MOVX指令中,可以使用寄存器间接寻址方式来指定要访问的外部RAM地址。

具体来说,可以使用@Ri寄存器来指定外部RAM的地址,其中i可以是0、1、2或3。

MOVX A, @Ri指令表示将外部RAM地址i处存储的数据传输到累加器A中,或者将累加器A中的数据传输到外部RAM地址i处。

需要注意的是,MOVX指令只能访问外部RAM的低8位00H~FFH的256B,高8位由P2决定。

此外,MOVX指令还可以用于片内片外ROM(程序存储器)之间的数据转移。

具体来说,可以使用MOVC指令来实现。

MOVC指令的源操作数可以是寄存器间接寻址方式,例如MOVC A, @A + PC或MOVC A, @A + DPTR等。

这些指令将程序存储器中的数据读取到累加器A中,或者将累加器A中的数据写入到程序存储器中。

总之,MOVX指令是用于在片外RAM和片内片外ROM之间进行数据传输的指令,可以实现寄存器间接寻址方式来指定要访问的地址。

51单片机汇编指令集(附记忆方法)

51单片机汇编指令集(附记忆方法)

51单片机汇编指令集一、数据传送类指令(7种助记符)MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送;MOVC(Move Code)读取程序存储器数据表格的数据传送;MOVX (Move External RAM) 对外部RAM的数据传送;XCH (Exchange) 字节交换;XCHD (Exchange low-order Digit) 低半字节交换;PUSH (Push onto Stack) 入栈;POP (Pop from Stack) 出栈;二、算术运算类指令(8种助记符)ADD(Addition) 加法;ADDC(Add with Carry) 带进位加法;SUBB(Subtract with Borrow) 带借位减法;DA(Decimal Adjust) 十进制调整;INC(Increment) 加1;DEC(Decrement) 减1;MUL(Multiplication、Multiply) 乘法;DIV(Division、Divide) 除法;三、逻辑运算类指令(10种助记符)ANL(AND Logic) 逻辑与;ORL(OR Logic) 逻辑或;XRL(Exclusive-OR Logic) 逻辑异或;CLR(Clear) 清零;CPL(Complement) 取反;RL(Rotate left) 循环左移;RLC(Rotate Left throught the Carry flag) 带进位循环左移;RR(Rotate Right) 循环右移;RRC (Rotate Right throught the Carry flag) 带进位循环右移;SWAP (Swap) 低4位与高4位交换;四、控制转移类指令(17种助记符)ACALL(Absolute subroutine Call)子程序绝对调用;LCALL(Long subroutine Call)子程序长调用;RET(Return from subroutine)子程序返回;RETI(Return from Interruption)中断返回;SJMP(Short Jump)短转移;AJMP(Absolute Jump)绝对转移;LJMP(Long Jump)长转移;CJNE (Compare Jump if Not Equal)比较不相等则转移;DJNZ (Decrement Jump if Not Zero)减1后不为0则转移;JZ (Jump if Zero)结果为0则转移;JNZ (Jump if Not Zero) 结果不为0则转移;JC (Jump if the Carry flag is set)有进位则转移;JNC (Jump if Not Carry)无进位则转移;JB (Jump if the Bit is set)位为1则转移;JNB (Jump if the Bit is Not set) 位为0则转移;JBC(Jump if the Bit is set and Clear the bit) 位为1则转移,并清除该位;NOP (No Operation) 空操作;五、位操作指令(1种助记符)CLR 位清零;SETB(Set Bit) 位置1。

51单片机汇编指令详解

51单片机汇编指令详解

MCS-51系列单片机指令以A开头的指令有18条,分别为:ACALL addr11ADD A,RnADD A,directADD A,@RiADD A,#dataADDC A,RnADDC A,directADDC A,@RiADDC A,#dataAJMP addr11ANL A,RnANL A,directANL A,@RiANL A,#dataANL direct,AANL direct,#dataANL C,bitANL C,/bit1、ACALL addr11指令名称:绝对调用指令指令代码:{A10,A9,A8,10001},A[7:0]指令功能:构造目的地址,进行子程序调用。

其方法是以指令提供的11位地址(al0~a0),取代PC的低11位,PC的高5位不变。

操作内容:PC←(PC)+2SP←(SP)+1(SP)←(PC)7~0SP←(SP)+1(SP)←(PC)15~8PC10~0←addrl0~0字节数: 2机器周期:2使用说明:由于指令只给出子程序入口地址的低11位,因此调用范围是2KB。

2、ADD A,Rn指令名称:寄存器加法指令指令代码:28H~2FH指令功能:累加器内容与寄存器内容相加操作内容:A←(A)+(Rn), n=0~7字节数: 1机器周期;1影响标志位:C,AC,OV3、ADD A,direct指令名称:直接寻址加法指令指令代码:25H指令功能:累加器内容与内部RAM单元或专用寄存器内容相加操作内容:A←(A)+(direct)字节数: 2机器周期:1影响标志位:C,AC,OV4、ADD A,@Ri指令名称:间接寻址加法指令指令代码:26H~27H指令功能:累加器内容与内部RAM低128单元内容相加操作内容:A←(A)+((Ri)), i=0,1字节数: 1机器周期:1影响标志位:C,AC,OV5、ADD A,#data指令名称:立即数加法指令指令代码:24H指令功能:累加器内容与立即数相加操作内容:A←(A)+data字节数: 2机器周期:1影响标志位:C,AC,OV6、ADDC A,Rn指令名称:寄存器带进位加法指令指令代码:38H~3FH指令功能:累加器内容、寄存器内容和进位位相加操作内容:A←(A)+(Rn)+(C), n=0~7字节数: 1机器周期:1影响标志位:C,AC,OV7、ADDC A,direct指令名称:直接寻址带进位加法指令指令代码:35H指令功能:累加器内容、内部RAM低128单元或专用寄存器内容与进位位加操作内容:A←(A)+(direct)+(C)字节数: 2机器周期:1影响标志位:C,AC,OV8、ADDC A,@Ri指令名称:间接寻址带进位加法指令指令代码:36H~37H指令功能:累加器内容、内部RAM低128单元内容及进位位相加操作内容:A←(A)+((Ri))+(C), i=0,1字节数: 1机器周期:1影响标志位:C,AC,OV9、ADDC A,#data指令名称:立即数带进位加法指令指令代码:34H指令功能:累加器内容、立即数及进位位相加操作内容:A←(A)+data+(C)字节数: 2机器周期:1影响标志位:C,AC,OV10、AJMP addr11指令名称:绝对转移指令指令代码:{A10,A9,A8,00001},A[7:0]指令功能:构造目的地址,实现程序转移。

51单片机片内ram读写流程

51单片机片内ram读写流程

51单片机片内ram读写流程在51单片机中,对内部RAM(Random Access Memory)的读写流程主要包括以下几个步骤:一、读取操作流程:1. 地址定位:首先需要将待读取的内部RAM单元地址送入地址寄存器(通过`MOV`指令将地址值加载到`DPTR`或者`R0/R1`、`R2/R3`等间接寻址寄存器对中,对于低128字节直接寻址区,可以直接使用`ACC`配合`@Ri`或直接用`MOV`指令从指定地址读取)。

2. 读取数据:1)一旦地址被正确加载到地址总线,CPU会自动根据当前的地址去访问相应的RAM单元。

2)使用`MOVX A,@DPTR`指令可以从间接寻址区读取数据到累加器A(对于高128字节特殊功能寄存器区域,通常有特定的指令如`MOV A, direct`来读取)。

3)对于低128字节的数据存储区,可以使用`MOV A, @Ri`直接读取。

3. 数据处理:将读取到的数据进行所需的计算或逻辑操作。

二、写入操作流程:1. 地址定位:同样首先需要确定要写入数据的目标RAM单元地址,并将其送入地址寄存器。

2. 准备数据:确保要写入的数据已经存在于累加器A或其他可立即使用的寄存器中。

3. 执行写入:1)对于间接寻址区,使用`MOVX @DPTR,A`指令将累加器A中的数据写入到指定的RAM单元。

2)对于低128字节的数据存储区,使用`MOV @Ri, A`直接写入。

3)如果是向特殊功能寄存器区域写入,例如P1口寄存器,可以使用类似`MOV P1, A`这样的指令。

以上即为51单片机对片内RAM进行读写的基本流程。

在实际编程过程中,还需要结合具体的程序需求和内存分布情况灵活运用不同的寻址方式和指令集。

51单片机MOVX指令详细执行过程

51单片机MOVX指令详细执行过程

外部数据存储器读周期
访问外部存储器指令MOVX
执行访问外部存储器指令MOVX时,首先从程序存储器中取出指令,然后从外部数据存储器中取出数据,因此该指令执行时序图与前三类指令不同。

由于MOVX是单字节双周期指令,所以在取指令阶段(即第一个机器周期的S1P1到S4P2)是读1丢1,而在执行指令读数据阶段(即第一个机器周期的S5到第二个机器周期的S3)所完成的操作如下:
(1)先将外部数据存储单元的地址ADDR由DPTR从P0与P2口输出,即时序图中的S5P1到S6P2阶段。

并在S4P2到S5P2阶段,发ALE信号将地址锁存。

(2)在第二个机器周期S1P2到S2P2内取消ALE与程序选通信号PSEN (即取消取指操作),使P0口专门用于传送数据。

同时发读信号,通过P0口将外部数据存储单元中的数据传送到累加器A中。

即:时序图的S6P2到S4P1阶段。

(3)由于锁存的地址为外部数据存储单元的地址,所以在第二个机器周期S4取消取指令的操作,即:不再发程序选通信号PSEN 。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

外部数据存储器读周期
访问外部存储器指令MOVX
执行访问外部存储器指令MOVX时,首先从程序存储器中取出指令,然后从外部数据存储器中取出数据,因此该指令执行时序图与前三类指令不同。

由于MOVX是单字节双周期指令,所以在取指令阶段(即第一个机器周期的S1P1到S4P2)是读1丢1,而在执行指令读数据阶段(即第一个机器周期的S5到第二个机器周期的S3)所完成的操作如下:
(1)先将外部数据存储单元的地址ADDR由DPTR从P0与P2口输出,即时序图中的S5P1到S6P2阶段。

并在S4P2到S5P2阶段,发ALE信号将地址锁存。

(2)在第二个机器周期S1P2到S2P2内取消ALE与程序选通信号PSEN (即取消取指操作),使P0口专门用于传送数据。

同时发读信号,通过P0口将外部数据存储单元中的数据传送到累加器A中。

即:时序图的S6P2到S4P1阶段。

(3)由于锁存的地址为外部数据存储单元的地址,所以在第二个机器周期S4取消取指令的操作,即:不再发程序选通信号PSEN 。

相关文档
最新文档