文档库 最新最全的文档下载
当前位置:文档库 › 第四章EMC系列单片机指令系统

第四章EMC系列单片机指令系统

第四章EMC系列单片机指令系统
第四章EMC系列单片机指令系统

第三章 EM78指令系统

3.1.EM78指令概述

EM78156 & EM78P156 单片机共有的 58 条指令,其宽度为 13 位。每一个指令码可分割成两部份,第一部分为标示指令功能的运算码( OPCODE ),第二部份則指出运算时所需之參数,亦即运算码( OPERAND )。而指令的类型大致可分为下列四种:

(1)控制型指令( control operation ):如

INT...等等。

(2)面向寄存器(字节操作)型指令( register oriented ):如

MOV A, Reg_B ; move Reg_B to A

ADD Reg_B, A ; add Reg_B with A, and save in Reg_B

... 等等。

(3)位操作型指令( bit oriented ):如

BC,JBS...等等。

(4)常数型指令( constant operation ):如

MOV A, @0x55 ; move 0x55 to A

XOR @0xFF ;Xor A with 0xFF

一般而言,EM78 系列八位微控制器除一个指令需两个周期之外,其他的指令只需一个指令周期,除了对 PC (Program Counter)做“写”的指令,需二个指令周期,如 (MOV PC, A)。

3.2.EMC 汇编语言指令集

符号解说:

1.符号‘R’:代表一般用途寄存器中的其中一个。

2.符号‘B’:代表一般用途寄存器中的某一位。

3.符号‘K’:代表8位或10位的常数或内容。

4.符号‘A’:代表累加寄存器。

3.2.1.面向寄存器(字节操作)型指令(26条)

3.2.2.面向位操作类指令(10条)

3.2.3.常数操作和控制类指令(22条)

3.3.EM78指令寻址方式

关于对寄存器的存取,必须要先说明寄存器的位址,说明暂存的位址的方式称做寻址方式,EM78的寻址方式有两种,一种为直接寻址,一种为间接寻址。

3.3.1.立即数寻址

这种方式就是操作数为立即数,可直接从指令中获取。

例:MOV A,@0x16 ;将常数0x16送给寄存器A

3.3.2.直接寻址

若是使用者要存取寄存器的内容,可以在运算码上直接描述1。

例:将寄存器0X20的内容,COPY到寄存器0X21中。

MOV A, 0X20

MOV 0X21, A

3.3.3.间接寻址

这种寻址方式是通过寄存器R4来实现的,R4的bit0-5是用来选择寄存器(地址:00-06,0F-3F)若是使用者所需要存取的寄存器,有位址相邻的特性,使用间接寻址是很方便的。

例:写一个程序,將寄存器0X20~0X3F的值都填0。

MOV 0X04, A

AGAIN:

CLR 0

INC 0X04

MOV A, 0X04

XOR A, 0X3F

JBS 0X03, 2

JMP AGAIN

END:

3.3.

4.位寻址

这种位寻址是对寄存器中的任一位(bit)进行操作。

例:BS 0x12,2 ;将寄存器0x12的第2位置为“1”。

3.4.EM78指令说明

ADD Add

语法ADD A,R

编码

操作內容 A + R --> A

受影响的标志Z,C,DC﹔零标志﹐进位标志和辅助进位标志都会受影响

说明將A寄存器的內含值加上R寄存器的內含值﹐並且把结果载入A寄存器中。语法ADD R,A

编码

操作內容 A + R --> R

受影响的标志Z,C,DC﹔零标志﹐进位标志和辅助标志都会受影响

说明將A寄存器的內含值加上R寄存器的內含值﹐並且把结果载入R寄存器中。语法ADD A, k

编码

操作內容K + A --> A

受影响的标志Z,C,DC﹔零标志﹐进位标志和辅助标志都会受影响

说明將A寄存器的內含值加上立即值K﹐並且把结果载入A寄存器中。

举例说明下两行指令敘述为 A = R11 + R12.

MOV A,0x11

ADD A,0x12 ;A = R11 + R12

下两行指令敘述为 R10 = R11 + R12.

MOV A,0x11

MOV 0x10,A

MOV A,0x12

ADD 0x10,A ;R10 = R11 + R12

下两行指令敘述为 A = 0x01 + 0x01.

MOV A,@0x01 ;A = 0x01

ADD A,@0x01 ;A = 0x02

AND And

语法AND A,R

编码

操作內容 A & R --> A

受影响的标志Z﹔零标志

说明將A寄存器和R寄存器AND在一起﹐并将结果存入A寄存器。

语法AND R,A

编码

操作內容 A & R --> R

受影响的标志Z﹔零标志

说明將A寄存器和R寄存器AND在一起﹐并将结果存入R寄存器。

语法AND A,K

编码

操作內容 A & K --> A

受影响的标志Z﹔零标志

说明將A寄存器和立即值K﹐AND在一起﹐并将结果存入A寄存器。

举例说明將port 6和R10 register AND起來, 并将结果输出到port6

MOV A,0x6 ;從port6输入内容

AND A,0x10 ;把内容和 R10 做AND MOV 0x6,A ;将结果输出到port6

R10 = R11 AND R12

MOV A,0x11

MOV 0x10,A

MOV A,0x12

AND 0x10,A ;R10 = R11 AND R12

BC Bit Clear

语法BC R,b

编码

操作內容0 --> R(b)

受影响的标志无

说明R寄存器的位“b”被清为0。

举例说明MOV A,@0x0f

MOV 0x10,A ;R10 = 00001111

BC 0x10,3 ;R10 = 00000111

BS Bit Set

语法BS R,b

编码

操作內容 1 --> R(b)

受影响的标志无

说明R寄存器的位“b”被设成1。

举例说明將狀态寄存器的零标志設成1。

BS 0x3,2

CALL Subroutine Call

语法CALL k

编码

操作內容PC+1 --> [Top of Stack]

k --> PC(9::0)

R3(7::5) --> PC(12::10)

受影响的标志无

说明当呼叫一个子程序时﹐首先会將下一个指令的执行位址存入堆栈中﹐接下來将子程序的进入位址载入程序计数器中。

举例说明HERE:

CALL S UBRTN

CONT:

MOV A,@10

执行CALL指令之前

PC = address HERE

执行CALL指令之后

PC = address SUBRTN

[Top of Stack] = address CONT CLRA Clear the A register

语法CLRA

编码

操作內容0 --> A﹔A寄存器清除为0

受影响的标志 1 --> Z﹔零标志设成1

说明清除A寄存器﹐同時设定Z标志

举例说明CLRA ;清除A寄存器﹐同時設定Z标志

CLR Clear Register

语法CLR R

编码

操作內容0 --> R﹔R寄存器清除为0

受影响的标志 1 --> Z﹔零标志設成1

说明清除R寄存器﹐并设定零标志。

举例说明CLR 0x10 ;清除 0x10寄存器

COMA Complement R, Place in A

语法COMA R

编码

操作內容R --> A

受影响的标志Z﹔零标志

说明将所指定的寄存器取补数﹐再放入A寄存器中。

从port6输入一个值﹐将其取补数之后在由port6输出。

MOV A,0x6

MOV 0x10,A

COMA 0x10

MOV 0x6,A

COM Complement R

语法COM R

编码

操作內容R.--> R

受影响的标志Z﹔零标志

说明将R暂存取补数﹐再存入R寄存器中。

举例说明将0x10寄存器的內含值﹐取补数。

MOV A,@0x11

MOV 0x10,A ;R10 = 0x11

COM 0x10 ;R10 = 0xEE

DAA Decimal Adjust

语法DAA

编码

操作內容if [A<3::0> > 9].OR.[DC=1]

then A<3::0> + 6 -> A<3::0>;

if [A<7::4> > 9].OR.[C=1]

then A<7::4> + 6 -> A<7::4>;

受影响的标志C进位标志

说明DAA用来调整在累加器中的8位的2进位数值﹐使累加器中的数值变成10进位的表示法﹐分別用两个4位來表示十位及个位。

举例说明做一个十进位加法运算6+9

MOV A,@0x6

MOV 0x10,A

MOV A,@0x9

ADD A,0x10 ;A = 0xf

DAA ;A = 15H (packed BCD)

DECA Decrement R, Place in A

语法DECA R

编码

操作內容R-1 --> A

受影响的标志Z零标志

说明递减R寄存器的值﹐并且将结果存入A寄存器中。

举例说明说明如何作一个计数16次的循环

STATUS == 3 ﹔状态寄存器

Z_FLAG == 2 ﹔零标志在状态暂存中是BIT2

MOV A,@0x10

MOV 0x10,A

LOOP:

DECA 0x10

MOV 0x10,A

JBS STATUS,Z_FLAG

JMP LOOP

DEC Decrement R

语法DEC R

编码

操作內容R-1 --> R

受影响的标志Z﹔零标志

说明将所指定的R寄存器內含值减1。

举例说明说明如何作一个计数16次的循环

STATUS == 3 ; 状态寄存器

Z_FLAG == 2 ﹔零标志在状态暂存中是BIT2

MOV A,@0x10

MOV 0x10,A

LOOP:

DEC 0x10

JBS STATUS,Z_FLAG

JMP LOOP

DJZA Decrement R, Place in the A register, Skip if 0

语法DJZA R

编码

操作內容R - 1 --> A, skip if 0

受影响的标志无

说明将所指定R寄存器的內含值减1﹐并将结果存於A寄存器上﹔如果结果为0﹐则下一个指令将被跳过。

举例说明HERE:

DJZA 0x9

CONT:

MOV A,0x10

SKIP:

ADD A,@10

在执行DJZA指令之前

PC = address HERE

在执行DJZA指令之后

A=R9-1

if A = 0, PC = address SKIP

if A ≠ 0, PC = address CONT

DJZ Decrement R, Skip if 0

语法DJZ R

编码

操作內容R - 1 --> R, skip if 0

受影响的标志无

说明将所指定R寄存器的內含值减1﹐并将结果存回R寄存器上﹔如果结果为0﹐则下一个指令将被跳过。

举例说明MOV A,@100

MOV 0x10,A

LOOP:

DJZ 0x10 ;寄存器R10递减﹐若结果不等于;0 , 执行JMP指令﹐若結果等;于0;JMP指令不执行JMP LOOP

INCA Increment R, Place in the A register

语法INCA R

编码

操作內容R + 1 --> A

受影响的标志Z﹔零标志

说明将被指定R寄存器的內含值加1,并将结果储于A寄存器中。

举例说明MOV A,@0x11

MOV 0x10,A ;R10 = 0x11

INCA 0x10 ;A = 0x12

INC Increment R

语法INC R

编码

操作內容R + 1 --> R

受影响的标志Z﹔零标志

说明将被指定R寄存器的內含值加1﹐並且将结果再存回R寄存器中。

举例说明MOV A,@0x11

MOV 0x10,A ;R10 = 0x11

INC 0x10 ;R10 = 0x12

INT Software Interrupt

语法INT

编码

操作內容PC + 1 --> [Top of Stack]

0001H --> PC

受影响的标志无

说明软件中断指令﹐首先将下一个位址存入堆栈中﹐然后将0x01载入程序寄存器中。

举例说明ORG 0x001

JMP SET_INT

???

SET_INT﹕

???

RET

MAIN﹕

???

HERE﹕

INT

CONT﹕

CLRA

执行INT指令之前

PC = address HERE

执行INT指令之后

PC = 0001H

[Top of Stack] = address CONT

IOR Move IOC R to the A register

语法IOR R

编码

操作內容IOC R --> A

受影响的标志无

说明将控制寄存器IOC R中的值移到寄存器A中。

举例说明IOR 0xf ;取得 IOC F中的內容﹐并载入A中

MOV 0x10,A ;储存在寄存器 0x10中

IOW Move the A register to IOC R

语法IOW R

编码

操作內容 A <-- IOC R

受影响的标志无

说明将A寄存器(累加器)的内容载入控制寄存器IOC R中。举例说明将port6設定成输出口。

MOV A,@0

IOW 0x6

JMP Unconditional Branch

语法JMP k

编码

操作內容k --> PC(9::0)

R3(7::5) --> PC(12::10)

受影响的标志无

说明当执行一个跳转指令﹐指令后所描述的执行位址会载入程序计数器中。

举例说明HERE J MP BRANCH

执行JMP指令之前

PC = address HERE

执行JMP指令之后

PC = address BRANCH

JZA Increment R, Place in the A register, Skip if 0

语法JZA R

编码

操作內容R+1 --> A, skip if result = 0

受影响的标志无

说明将所选定的寄存器R的內容加1﹐并将结果存于A寄存器﹐若结果为0﹐则跳过下一个指令。

举例说明Port 6输出递减的二进位数值。

MOV A,@x00

LOOP:

MOV 0x6,A

MOV 0x10,A

JZA 0x10

JMP LOOP

JZ Increment R, Skip if 0

语法JZ R

编码

操作內容R+1 --> R, skip if result = 0

受影响的标志无

说明将所选定的寄存器R的內容加1﹐并将结果存於R寄存器﹐若结果为0﹐则跳过下一个指令。

举例说明HERE:

JZ 0x10

CONT:

MOV A,0x10

SKIP:

ADD A,@10

执行JZ指令之前

PC = address HERE

执行JZ指令之后

R10 = R10-1

if R10 = 0, PC = address SKIP

if R10 0, PC = address CONT 语法

JBC Bit Test, Skip if Clear

语法JBC R,b

编码

操作內容if R(b) = 0, skip

受影响的标志无

说明如果寄存器R的位“b”是“0”,则跳过下一个指令。

举例说明测试0x10寄存器的bit0﹐若是为”0”则port5的bit0设成”0”﹔若0x10寄存器的bit0为”1”﹐則port5的bit0设成”1”。

JBC 0x10,0

BS 0x5,0

JBS 0x10,0

BC 0x5,0

JBS Bit Test, Skip if Set

语法JBS R,b

编码

操作內容if R(b) = 1, skip

受影响的标志无

说明如果寄存器R的位“b”是“1”,则跳过下一个指令。

举例说明HERE J BC 0x9,3

CONT M OV A,@10

SKIP A DD A,0x10

执行JBC指令之前

PC = address HERE

执行JBC指令之后

if R9(3) = 0, PC = address CONT

if R9(3) 0, PC = address SKIP

MOV Move Data

语法MOV R,A

编码

操作內容 A --> R

受影响的标志无

说明将A寄存器中的值载入寄存器R中。

语法MOV A,R

编码

操作內容R --> A

受影响的标志Z (零标志)

将R寄存器中的值载入A寄存器﹐如果A寄存器的結果为零﹐就会将Z标志设

成1﹔否则将Z标志清为0。

语法MOV A, k

编码

操作內容k --> A

受影响的标志无

说明将立即k载入A寄存器中。

举例说明將A Move data from accumulator to register

MOV A,@0x11 ;将立即值载入A寄存器中

MOV 0x10,A ;将A中的内容载入0X10中

MOV A,9 ;将寄存器9的值载入A中

NOP No Operation

语法NOP

编码

操作內容No Operation

受影响的标志None

说明不做任何工做﹐用来做时间的延迟。

举例说明P50输出3 μs的突波. (system clock = 2MHz)

BS 0x5,0x0 ;P50输出为high

NOP ;延迟两个指令周期

NOP

BC 0x5,0x0 ;P50输出为low

OR Inclusive OR

语法OR A,R

编码

操作內容A∨R --> A

受影响的标志Z 零标志

说明将A寄存器中的值和R寄存器中的值OR在一起﹐在存入A寄存器中。语法OR R,A

编码

操作內容A∨R --> R

受影响的标志Z 零标志

说明將A寄存器中的值和R寄存器中的值OR在一起﹐在存入R寄存器中。语法OR A, k

编码

操作內容A∨k --> A

受影响的标志Z 零标志

说明将A寄存器中的值和立即值k﹐OR在一起﹐在存入A寄存器中。

举例说明将port6的值和0x10寄存器的值OR在一起﹐并将结果输出到port6。

MOV A,0x6 ;将port6的值载入A中

OR A,0x10 ;OR,A和0x10的值存入A中

MOV 0x6,A ;將A的值输出到port6

说明右式应该如何完成﹕R10 = R11 OR R12.

MOV A,0x11

MOV 0x10,A

MOV A,0x12

OR 0x10,A ;R10=R11 OR R12

说明右式应該如何完成﹕ A = A OR 0xF0.

MOV A,@0x03 ;A = 0x03

OR A,0xF0 ;A = 0xF3

RET Return from Subroutine 语法RET

编码

操作內容[Top of Stack] --> PC

受影响的标志无

说明从子程序中返回﹐堆栈最上面的数值载入程序计数器(Program counter)。举例说明TEST:

???

RET

???

CALL T EST

HERE:

ADD A,@0x1

???

在呼叫RET指令之前。

堆栈的顶端Top of Stack = address HERE

在呼叫RET指令之后。

程序计数器PC = address HERE

RET L Return Immediate Data to the A register

语法RETL k

编码

操作內容k --> A

[Top of Stack] --> PC

受影响的标志无

说明从子程序返回﹐并将立即值载入A寄存器(累加器)中。

堆栈最顶端的数值载入程序计数器中。

建立一个7段显示器转換表﹐並用port6驱动7段显示器。

;REGISTER DEFINE

PC == 2

TRANS:

ADD PC,A RETL 0XFC RETL 0XC0 RETL 0XEA RETL 0XF2 RETL 0X66 RETL 0XB6 RETL 0XBE RETL 0XE0 RETL 0XFE RETL 0

XF6

MAIN:

???

MOV A,0x10 ;将寄存器的內含值载入A中

CALL TRANS

MOV 0x6,A ;输出到7段显示器

???

RLCA Rotate Left R through Carry, Place in the A register 语法RLCA R

操作內容R(n) --> A(n+1), R(7) --> C, C --> A(0)

受影响的标志C﹔进位标志

说明将所指定的寄存器的內容﹐连同进位标志一起向左移1位﹐并将结果存於A寄存器。

举例说明

BIT_BUF == 0x10

RLCA BIT_BUF

MOV 0x6,A

RLC Rotate Left R through Carry

语法RLCA R

编码

操作內容R(n) --> R(n+1), R(7) --> C, C --> R(0)

受影响的标志C﹔进位标志

说明将所指定的寄存器的內容﹐连同进位标志向左移1个位原﹐结果存在原先的寄存器。

举例说明将0X10

RLCA 0x10 A寄存器

RLC 0x10 ﹔將0x10寄存器的值向左移1位﹐此时执行的結果如上图。RRCA Rotate Right R through Carry, Place in the A register

语法RRCA R

编码

操作內容R(n) --> A(n-1), R(0) --> C, C --> A(7)

受影响的标志C进位标志被影响

说明R寄存器的內含值又移1-bit﹐右移时包含C(进位标志) ﹐如下图﹐并将结果存于A寄存器。

举例说明

BIT_BUF == 0x10

RRCA B IT_BUF

MOV 0x6,A

RRC Rotate Right R through Carry

语法RRC R

操作內容R(n) --> R(n-1), R(0) --> C, C --> R(7)

受影响的标志C﹔进位标志

说明所指定的寄存器的內容﹐连带着进位标志接向右移1位﹐如下图。

举例说明MOV A,@0x0f

CLR 0x3,0 ;clear C flag

MOV 0x10,A ;R10 = 00001111

RRC 0x10 ;R10 = 00000111, C = 1

SUB Subtract

语法SUB A,R

编码

操作內容R-A --> A

受影响的标志Z,C,DC﹔零标志﹐进位标志和辅助标志都会受影响

说明將R寄存器中的值减去A寄存器中的值﹐再存回A寄存器中。

语法SUB R,A

编码

操作內容R-A --> R

受影响的标志Z,C,DC,零标志﹐进位标志和辅助标志都会受影响

说明将R寄存器中的值减去A寄存器中的值﹐再存回R寄存器中。

语法SUB A, k

编码

操作內容k-A --> A

受影响的标志Z,C,DC﹔零标志﹐进位标志和辅助标志都会受影响

说明将立即值k的值减去A寄存器中的值﹐再存回A寄存器中。

举例说明说明如何完成A = 0x99-0x55的计算式

MOV A,@0x99

MOV 0x10,A ;R10 = 0x99

MOV A,@0x55

SUB A,0x10 ;A = 0x44

说明如何完成 A = 0x02 - A 的计算式

MOV A,@0x01 ;A = 0x01

SUB A,@0x02 ;A = 0x02 - 0x01 = 0x01

;C flag = 1 , 进位标志C =1﹐相减结果为正值。SWAPA Swap R, Place in the A register

语法SWAPA R

编码

操作內容R(3::0) --> A(7::4)

R(7::4) --> A(3::0)

受影响的标志无

说明将所选定的寄存器﹐高4位以及低4位﹐互換﹐并将结果存于A寄存器。

举例说明将port6的內容﹐高4位以及低4位互換。

MOV A,0x6

MOV 0x10,A

SWAP 0x10

MOV 0x6,A

SWAP Swap R

语法SWAP R

编码

操作內容R(3::0) <--> R(7::4)

受影响的标志无

说明将所选定的寄存器﹐高4位以及低4位﹐互換。

举例说明MOV A,@0x43

MOV 0x10,A ;R10 = 0x43

SWAP 0x10 ;R10 = 0x34

XOR Exclusive OR

语法XOR A,R

编码

操作內容 A ⊕ R --> A

受影响的标志Z ﹔零标志

说明将A寄存器的值和R寄存器的值XOR在一起﹐并且将结果存入A寄存器中。语法XOR R,A

编码

操作內容 A ⊕ R --> R

受影响的标志Z ﹔零标志

说明将A寄存器的值和R寄存器的值XOR在一起﹐并且将结果存入R寄存器中。语法XOR A, k

编码

操作內容 A ⊕ k --> A

受影响的标志Z ﹔零标志

说明將A寄存器的值和R寄存器的值XOR在一起﹐并且将结果存入A寄存器中。举例说明测试0x10寄存器內含值是否为0x55﹐如果0x10寄存器的內含值不为0x55﹐就跳到ERROR这支子程序。

STATUS == 3

Z_FLAG == 2

MOV A,@0x55

XOR A,0x10

JBS STATUS,Z_FLAG

JMP ERROR

下面的指令敘述﹐完成R10 = R11 XOR R12

MOV A,0x11

MOV 0x10,A

MOV A,0x12

XOR 0x10,A ;R10 = R11 XOR R12

下面的指令敘述﹐完成 A = A XOR 0xF0.

MOV A,@0x00 ;A = 0x00

XOR A,@0xF0 ;A = 0xF0

MCS-51指令详解

MCS-51指令详解 说明:为了使MCS-51单片机初学者快速入门,迅速掌握单片机指令含意、操作码、操作数及;对应地址,汇编语言怎样编写等,现按指令操作码按顺序编写,可对照本公司编写的<>一书第145页指令手册查看,更详细资料请阅第四章 MCS-51指令系统" 及第124页指令系统摘要。并在仿真器上装入;JJM.HEX文件,并对有关单元置数,用单步(F8)验证其正确性及其运行结果。 ORG 0000H NOP ;空操作指令 AJMP L0003 ;绝对转移指令 L0003: LJMP L0006 ;长调用指令

L0006: RR A ;累加器A内容右移(先置A为88H) INC A ; 累加器A 内容加1 INC 01H ;直接地址(字节01H)内容加1 INC @R0 ; R0的内容(为地址) 的内容即间接RAM加1 ;(设R0=02H,02H=03H,单步执行后02H=04H) INC @R1 ; R1的内容(为地址) 的内容即间接RAM加1 ;(设R1=02H,02H=03H,单步执行后02H=04H) INC R0 ; R0的内容加1 (设R0为00H,单步执行后查R0内容为多少) INC R1 ; R1的内容加1(设R1为01H,单步执行后查R1内容为多少)

INC R2 ; R2的内容加1 (设R2为02H,单步执行后查R2内容为多少) INC R3 ; R3的内容加1(设R3为03H,单步执行后查R3内容为多少) INC R4 ; R4的内容加1(设R4为04H,单步执行后查R4内容为多少) INC R5 ; R5的内容加1(设R5为05H,单步执行后查R5内容为多少) INC R6 ; R6的内容加1(设R6为06H,单步执行后查R6内容为多少) INC R7 ; R7的内容加1(设R7为07H,单步执行后查R7内容为多少) JBC 20H,L0017; 如果位(如20H,即24H的0位)为1,则转移并清0该位L0017: ACALL S0019 ;绝对调用 S0019: LCALL S001C ;长调用

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)比较不相等则转移;

单片机汇编指令大全

单片机汇编指令一览表 作者:乡下人 助记符指令说明字节数周期数 (数据传递类指令) MOV A,Rn 寄存器传送到累加器 1 1 MOV A,direct 直接地址传送到累加器 2 1 MOV A,@Ri 累加器传送到外部RAM(8 地址) 1 1 MOV A,#data 立即数传送到累加器 2 1 MOV Rn,A 累加器传送到寄存器 1 1 MOV Rn,direct 直接地址传送到寄存器 2 2 MOV Rn,#data 累加器传送到直接地址 2 1 MOV direct,Rn 寄存器传送到直接地址 2 1 MOV direct,direct 直接地址传送到直接地址 3 2 MOV direct,A 累加器传送到直接地址 2 1 MOV direct,@Ri 间接RAM 传送到直接地址 2 2 MOV direct,#data 立即数传送到直接地址 3 2 MOV @Ri,A 直接地址传送到直接地址 1 2 MOV @Ri,direct 直接地址传送到间接RAM 2 1 MOV @Ri,#data 立即数传送到间接RAM 2 2 MOV DPTR,#data16 16 位常数加载到数据指针 3 1 MOVC A,@A+DPTR 代码字节传送到累加器 1 2 MOVC A,@A+PC 代码字节传送到累加器 1 2 MOVX A,@Ri 外部RAM(8 地址)传送到累加器 1 2 MOVX A,@DPTR 外部RAM(16 地址)传送到累加器 1 2 MOVX @Ri,A 累加器传送到外部RAM(8 地址) 1 2 MOVX @DPTR,A 累加器传送到外部RAM(16 地址) 1 2 PUSH direct 直接地址压入堆栈 2 2 POP direct 直接地址弹出堆栈 2 2 XCH A,Rn 寄存器和累加器交换 1 1 XCH A, direct 直接地址和累加器交换 2 1 XCH A, @Ri 间接RAM 和累加器交换 1 1 XCHD A, @Ri 间接RAM 和累加器交换低4 位字节 1 1 (算术运算类指令) INC A 累加器加1 1 1 INC Rn 寄存器加1 1 1 INC direct 直接地址加1 2 1 INC @Ri 间接RAM 加1 1 1 INC DPTR 数据指针加1 1 2 DEC A 累加器减1 1 1 DEC Rn 寄存器减1 1 1 DEC direct 直接地址减1 2 2

51单片机各引脚及端口详解

51单片机各引脚及端口详解 51单片机引脚功能: MCS-51是标准的40引脚双列直插式集成电路芯片,引脚分布请参照----单片机引脚图: l P0.0~P0.7 P0口8位双向口线(在引脚的39~32号端子)。 l P1.0~P1.7 P1口8位双向口线(在引脚的1~8号端子)。 l P2.0~P2.7 P2口8位双向口线(在引脚的21~28号端子)。 l P3.0~P3.7 P2口8位双向口线(在引脚的10~17号端子)。 这4个I/O口具有不完全相同的功能,大家可得学好了,其它书本里虽然有,但写的太深,对于初学者来说很难理解的,我这里都是按我自已的表达方式来写的,相信你也能够理解的。 P0口有三个功能: 1、外部扩展存储器时,当做数据总线(如图1中的D0~D7为数据总线接口) 2、外部扩展存储器时,当作地址总线(如图1中的A0~A7为地址总线接口)

3、不扩展时,可做一般的I/O使用,但部无上拉电阻,作为输入或输出时应在外部接上拉电阻。 P1口只做I/O口使用:其部有上拉电阻。 P2口有两个功能: 1、扩展外部存储器时,当作地址总线使用 2、做一般I/O口使用,其部有上拉电阻; P3口有两个功能: 除了作为I/O使用外(其部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置,具体功能请参考我们后面的引脚说明。 有部EPROM的单片机芯片(例如8751),为写入程序需提供专门的编程脉冲和编程电源,这些信号也是由信号引脚的形式提供的, 即:编程脉冲:30脚(ALE/PROG) 编程电压(25V):31脚(EA/Vpp) 接触过工业设备的兄弟可能会看到有些印刷线路板上会有一个电池,这个电池是干什么用的呢?这就是单片机的备用电源,当外接电源下降到下限值时,备用电源就会经第二功能的方 式由第9脚(即RST/VPD)引入,以保护部RAM中的信息不会丢失。 在介绍这四个I/O口时提到了一个“上拉电阻”那么上拉电阻又是一个什么东东呢?他起什么作用呢?都说了是电阻那当然就是一个电阻啦,当作为输入时,上拉电阻将其电位拉高,若输 入为低电平则可提供电流源;所以如果P0口如果作为输入时,处在高阻抗状态,只有外接一个上拉电阻才能有效。 ALE 地址锁存控制信号:在系统扩展时,ALE用于控制把P0口的输出低8位地址送锁存器锁存起来,以实现低位地址和数据的隔离。参见图2(8051扩展2KB EEPROM电路,在图中ALE与4LS373锁存器的G相连接,当CPU对外部进行存取时,用以锁住地址的低位地址, 即P0口输出。 由于ALE是以晶振六分之一的固定频率输出的正脉冲,当系统中未使用外部存储器时,ALE 脚也会有六分之一的固定频率输出,因此可作为外部时钟或外部定时脉冲使用。

飞思卡尔单片机寄存器及汇编指令详解

附录I:寄存器地址列表 直接页面寄存器总结

高页面寄存器总结

非易失寄存器总结 注:直接页面寄存器表地址的低字节用粗体显示,直接寻址对其访问时,仅写地址低字节即可。第2列中寄存器名用粗体显示以区别右边的位名。有0的单元格表示未用到的位总是读为0,有破折号的单元格表示未用或者保留,对其读不定。

附录II 指令接与寻址方式 HCS08指令集概括 运算符 () = 括号种表示寄存器或存储器位置的内容 ← = 用……加载(读: “得到”) & = 布尔与 | = 布尔或 ⊕= 布尔异或 ×= 乘 ÷ = 除 : = 串联 + = 加 - = 求反(二进制补码) CPU registers A =>累加器 CCR =>条件代码寄存器 H =>索引寄存器,高8位 X => 索引寄存器,低8位 PC =>程序计数器 PCH =>程序计数器,高8位 PCL =>程序计数器,低8位 SP =>堆栈指针 存储器和寻址 M =>一个存储区位置或者绝对值数据,视寻址模式而定 M:M + 0x0001 => 两个连续存储位置的16位值.高8位位于M的地址,低8位位于更高的连续地址. 条件代码寄存器(CCR)位 V => 二进制补码溢出指示,第7位 H => 半进位,第4位 I => 中断屏蔽,第 3位 N => 求反指示器, 第2位 Z => 置零指示器, 第1位 C => 进/借, 第0位 (进位第 7位 ) CCR工作性符号 – => 位不受影响 0 = > 位强制为0 1 = > 位强制为1

= >根据运算结果设置或清除位 U = > 运算后没有定义 机器编码符号 dd =>一个直接寻址0x0000–0x00FF的低8位(高字节假设为0x00) ee => 16位偏移量的高8位 ff => 16位偏移量的低8位 ii => 立即数的一个字节 jj => 16位立即数值的高位字节 kk => 16位立即数值的低位字节 hh => 16位扩展寻址的高位字节 ll => 16位扩展寻址的低位字节 rr => 相对偏移量 n —任何表达范围在0–7之间的一个有符号数的标号或表达式 opr8i —任何一个表达8位立即值的标号或表达式 opr16 —任何一个表达16位立即值的标号或表达式 opr8a —任何一个表达一个8位值的标号或表达式.指令对待这个8位值为直接页面64K 字节地址空间(0x00xx)中地址的低8位. opr16a —任何一个表达16位值的标号或表达式.指令对待这个值为直接页面64K字节地址空间. oprx8 —任何一个表达8位无符号值的标号或表达式,用于索引寻址. oprx16 —任何一个16位值的标号或表达式.因为HCS08有一个16位地址总线,这可以为一个有符号或者无符号值. rel —任何指引在当前指令目标代码最后一个字节之后–128 to +127个字节之内的标号或表达式.汇编器会计算包括当前指令目标代码在内的8位有符号偏移量. 寻址方式 隐含寻址(Inherent)如CLRA,只有操作码,无操作数,需要操作的数据一般为CPU寄存器,因此不需要再去找操作数了。(INH) 立即寻址 (Immediate)如LDA #$0A,“$”表示16进制,此时操作数位于FLASH空间,与程序一起存放。(IMM) 直接寻址 (Direct)如 LDA $88,只能访问$0000-$00FF的存储器空间,指令短速度快; (DIR) 扩展寻址 (Extended)如果操作数地址超出了$00FF,自动为扩展寻址;(EXT) 相对寻址(Relative)如BRA LOOP,指令中一般给出8位有符号数表示的偏移量。(REL) 变址寻址 (Indexed) 采用[H:X]或SP作为指针的间接寻址方式。( IX )( IX1 )( IX2 ) 变址寻址 (Indexed) 1〉无偏移量:CLR ,X 简写(IX) 2〉无偏移量,指令完成后指针加1(H:X = H:X + 0x0001) ,简写(IX+)只用于指令MOV和CBEQ指令中;

51单片机教程:单片机逻辑与或异或指令详解

51单片机教程:单片机逻辑与或异或指令详解 ANL A,Rn ;A 与Rn 中的值按位’与’,结果送入A 中 ANL A,direct;A 与direct 中的值按位’与’,结果送入A 中 ANL A,@Ri;A 与间址寻址单元@Ri 中的值按位’与’,结果送入A 中 ANL A,#data;A 与立即数data 按位’与’,结果送入A 中 ANL direct,A;direct 中值与A 中的值按位’与’,结果送入direct 中 ANL direct,#data;direct 中的值与立即数data 按位’与’,结果送入direct 中。这几条指令的关键是知道什么是逻辑与。这里的逻辑与是指按位与 例:71H 和56H 相与则将两数写成二进制形式: (71H)01110001 (56H)00100110 结果00100000 即20H,从上面的式子可以看出,两个参与运算的值只要其中有一个位上是0,则这位的结果就是0,两个同是1,结果才是1。 理解了逻辑与的运算规则,结果自然就出来了。看每条指令后面的注释 下面再举一些例子来看。 MOV A,#45H;(A)=45H MOV R1,#25H;(R1)=25H MOV 25H,#79H;(25H)=79H ANL A,@R1;45H 与79H 按位与,结果送入A 中为41H (A)=41H ANL 25H,#15H;25H 中的值(79H)与15H 相与结果为(25H)=11H)ANL 25H,A;25H 中的值(11H)与A 中的值(41H)相与,结果为(25H)=11H 在知道了逻辑与指令的功能后,逻辑或和逻辑异或的功能就很简单了。逻辑或是按位或,即有1 为1,全0 为0。例:

51单片机的P0口工作原理详细讲解

51单片机的P0口工作原理详细讲解 一、P0端口的结构及工作原理P0端口8位中的一位结构图见下图: 由上图可见,P0端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路构成。再看图的右边,标号为P0.X引脚的图标,也就是说P0.X引脚可以是P0.0到 P0.7的任何一位,即在P0口有8个与上图相同的电路组成。下面,我们先就组成P0口的每个单元部份跟大家介绍一下:先看输入缓冲器:在P0口中,有两个三态的缓冲器,在学数字电路时,我们已知道,三态门有三个状态,即在其的输出端可以是高电平、低电平,同时还有一种就是高阻状态(或称为禁止状态),大家看上图,上面一个是读锁存器的缓冲器,也就是说,要读取D锁存器输出端Q的数据,那就得使读锁存器的这个缓冲器的三态控制端(上图中标号为‘读锁存器’端)有效。下面一个是读引脚的缓冲器,要读取P0.X引脚上的数据,也要使标号为‘读引脚’的这个三态缓冲器的控制端有效,引脚上的数据才会传输到我们单片机的部数据总线上。D锁存器:构成一个锁存器,通常要用一个时序电路,时序的单元电路在学数字电路时我们已知道,一个触发器可以保存一位的二进制数(即具有保持功能),在51单片机的32根I/O口线中都是用一个D触发器来构成锁存器的。大家看上图中的D 锁存器,D端是数据输入端,CP是控制端(也就是时序控制信号输入端),Q是输出端,Q非是反向输出端。对于D触发器来讲,当D输入端有一个输入信号,如果这时控制端CP没有信号(也就是时序脉冲没有到来),这时输入端D的数据是无法传输到输出端Q及反向输出端Q非的。如果时序控制端CP的时序脉冲一旦到了,这时D端输入的数据就会传输到Q及Q非端。数据传送过来后,当CP时序控制端的时序信号消失了,这时,输出端还会保持着上次输入端D的数据(即把上次的数据锁存起来了)。如果下一个时序控制脉冲信号来了,这时D端的数据才再次传送到Q端,从而改变Q端的状态。多路开关:在51单片机中,当部的存储器够用(也就是不需要外扩展存储器时,这里讲的存储器包括数据存储器及程序存储器)时,P0口可以作为通用的输入输出端口(即I/O)使用,对于8031(部没有ROM)的单片机或者编写的程序超过了单片机部的存储器容量,需要外扩存储器时,P0口就作为‘地址/数据’总线使用。那么这个多路选择开关就是用于选择是做为普通I/O口使用还是作为‘数据/地址’总线使用的选择开关了。大家看上图,当多路开关与下面接通时,P0口是作为普通的I/O口使用的,当多路开关是与上面接通时,P0口是作为‘地址/数据’总线使用的。输出驱动部份:从上图中我们已看出,P0口的输出是由两个MOS管组成的推拉式结构,也就是说,这两个MOS管一次只能导通一个,当V1导通时,V2就截止,当V2导通时,V1截止。 前面我们已将P0口的各单元部件进行了一个详细的讲解,下面我们就来研究一下P0口做为I/O口及地址/数据总线使用时的具体工作过程。1、作为I/O端口使用时的工作原理P0口作为I/O端口使用时,多路开关的控制信号为0(低电平),看上图中的线线部份,多路开关的控制信号同时与与门的一个输入端是相接的,我们知道与门的逻辑特点是“全1出1,

单片机电路图详解

单片机:交通灯课程设计(一)(2007-04-21 13:28:54) 目录 摘要--------------------------------------------------------- 1 1.概述 -------------------------------------------------------- 2 2.硬件设计----------------------------------------------------- 3 2.1单片机及其外围--------------------------------------------3 2.1.1单片机的选择-----------------------------------------3 2.1.2单片机的特点及其应用范围----------------------------- 3 2.1.3存储器的扩展----------------------------------------- 4 2.1.4内存的扩展------------------------------------------- 6 2.1.5MCS-52的I/O接口扩展--------------------------------- 8 2.2电路部分--------------------------------------------------11 2.2.1元器件选用-------------------------------------------11 2.2.2电路完成功能-----------------------------------------13 3.软件设计------------------------------------------------------15 3.1软件概述-------------------------------------------------15 3.2汇编语言指令说明-----------------------------------------16 3.3定时/计数器的原理----------------------------------------16 3.3.1定时/计数器的概述-----------------------------------16 3.3.2 8255A片选及各端口地址-------------------------------18 3.3.3信号控制码------------------------------------------18 3.3.4工作方式寄存器--------------------------------------19 3.3.5定时/计数器初值及定时器T0的工作方式----------------20

(完整版)51单片机汇编指令(全)

指令中常用符号说明 Rn当前寄存器区的8个工作寄存器R0~R7(n=0~7) Ri当前寄存器区可作为地址寄存器的2个工作寄存器R0和R1(i=0,1) Direct8位内部数据寄存器单元的地址及特殊功能寄存器的地址 #data表示8位常数(立即数) #data16表示16位常数 Add16表示16位地址 Addr11表示11位地址 Rel8位代符号的地址偏移量 Bit表示位地址 @间接寻址寄存器或基址寄存器的前缀 ( )表示括号中单元的内容 (( ))表示间接寻址的内容 指令系统 数据传送指令(8个助记符) 助记符中英文注释 MOV Move 移动 MOV A , Rn;Rn→A,寄存器Rn的内容送到累加器A MOV A , Direct;(direct)→A,直接地址的内容送A MOV A ,@ Ri;(Ri)→A,RI间址的内容送A MOV A , #data;data→A,立即数送A MOV Rn , A;A→Rn,累加器A的内容送寄存器Rn MOV Rn ,direct;(direct)→Rn,直接地址中的内容送Rn MOV Rn , #data;data→Rn,立即数送Rn MOV direct , A;A→(direct),累加器A中的内容送直接地址中 MOV direct , Rn;(Rn)→direct,寄存器的内容送到直接地址 MOV direct , direct;(direct)→direct,直接地址的内容送到直接地址 MOV direct , @Ri;((Ri))→direct,间址的内容送到直接地址 MOV direct , #data;8位立即数送到直接地址中 MOV @Ri , A;(A)→@Ri,累加器的内容送到间址中 MOV @Ri , direct;direct→@Ri,直接地址中的内容送到间址中 MOV @Ri , #data; data→@Ri ,8位立即数送到间址中 MOV DPTR , #data16;data16→DPTR,16位常数送入数据指针寄存器,高8位送入DPH,低8位送入DPL中(单片机中唯一一条16位数据传送指令) (MOV类指令共16条)

51单片机汇编语言教程:13课单片机逻辑与或异或指令详解

51单片机汇编语言教程:第13课-单片机逻辑与或异或指令详解

结果11111001 而所有的或指令,就是将与指仿中的ANL换成ORL,而异或指令则是将ANL换成XRL。即或指令: ORL A,Rn;A和Rn中的值按位'或',结果送入A中 ORL A,direct;A和与间址寻址单元@Ri中的值按位'或',结果送入A中 ORL A,#data;A和立direct中的值按位'或',结果送入A中 ORL A,@Ri;A和即数data按位'或',结果送入A中 ORL direct,A;direct中值和A中的值按位'或',结果送入direct中 ORL direct,#data;direct中的值和立即数data按位'或',结果送入direct中。 异或指令: XRL A,Rn;A和Rn中的值按位'异或',结果送入A中 XRL A,direct;A和direct中的值按位'异或',结果送入A中 XRL A,@Ri;A和间址寻址单元@Ri中的值按位'异或',结果送入A中 XRL A,#data;A和立即数data按位'异或',结果送入A中 XRL direct,A;direct中值和A中的值按位'异或',结果送入direct中 XRL direct,#data;direct中的值和立即数data按位'异或',结果送入direct中。 练习: MOV A,#24H MOV R0,#37H ORL A,R0 XRL A,#29H MOV35H,#10H ORL35H,#29H MOV R0,#35H ANL A,@R0 四、控制转移类指令 无条件转移类指令 短转移类指令 AJMP addr11 长转移类指令

常用51单片机汇编指令

常用单片机汇编指令: 1 .MOV A,Rn寄存器内容送入累加器 2 .MOV A,direct 直接地址单元中的数据送入累加器 3 .MOV A,@Ri (i=0,1) 间接RAM中的数据送入累加器 4 .MOV A,#data 立即数送入累加器 5 .MOV Rn,A累加器内容送入寄存器 6 .MOV Rn,direct 直接地址单元中的数据送入寄存器 7 .MOV Rn,#data 立即数送入寄存器 8 .MOV direct,A 累加器内容送入直接地址单元 9 .MOV direct,Rn 寄存器内容送入直接地址单元 10. MOV direct,direct 直接地址单元中的数据送入另一个 直接地址单元 11 .MOV direct,@Ri (i=0,1) 间接RAM中的数据送入直接地址单元 12 MOV direct,#data 立即数送入直接地址单元 13 .MOV @Ri,A (i=0,1) 累加器内容送间接RAM单元 14 .MOV@Ri,direct (i=0,1)直接地址单元数据送入间接RAM 单元 15 .MOV @Ri,#data (i=0,1) 立即数送入间接RAM单元 16 .MOV DPTR,#data16 16 位立即数送入地址寄存器 17 .MOVC A,@A+DPTR以DPTR^基地址变址寻址单元中的数 据送入累加器

18 .MOVC A,@A+PC以PC为基地址变址寻址单元中的数据送入累加器 19 .MOVX A,@Ri (i=0,1) 外部RAM(8位地址)送入累加器 20 .MOVX A,@DPTR外部RAM(16位地址)送入累加器 21 .MOVX @Ri,A (i=0,1) 累计器送外部RAM(8位地址) 22 .MOVX @DPTR,A累计器送外部RAM( 16位地址) 23 .PUSH direct 直接地址单元中的数据压入堆栈 24 .POP direct 弹栈送直接地址单元 25 .XCH A,Rn 寄存器与累加器交换 26 .XCH A,direct 直接地址单元与累加器交换 27 .XCH A,@Ri (i=0,1) 间接RAM与累加器交换 28 .XCHD A,@Ri (i=0,1) 间接RAM的低半字节与累加器交换算术操作类指令: 1. ADD A,Rn 寄存器内容加到累加器 2 .ADD A,direct 直接地址单元的内容加到累加器 3 A.DD A,@Ri (i=0,1) 间接ROM的内容加到累加器 4 .ADD A,#data 立即数加到累加器 5 .ADDC A,Rn寄存器内容带进位加到累加器 6 .ADDC A,direct 直接地址单元的内容带进位加到累加器 7 .ADDC A,@Ri(i=0,1) 间接ROM的内容带进位加到累加器 8 .ADDC A,#data 立即数带进位加到累加器

51汇编伪指令详解

51汇编伪指令 伪指令是对汇编起某种控制作用的特殊命令,其格式与通常的操作指令一样,并可加在汇编程序的任何地方,但它们并不产生机器指令。许多伪指令要求带参数,这在定义伪指令时由“表达式”域指出,任何数值与表达式匀可以作为参数。不同汇编程序允许的伪指令并不相同,以下所述的伪指令仅适用于MASM51系统,但一些基本的伪指令在大部份汇编程序中都能使用,当使用其它的汇编程序版本时,只要注意一下它们之间的区别就可以了。 MASM51中可用的伪指令有: ORG 设置程序起始地址 END 标志源代码结束 EQU 定义常数 SET 定义整型数 DATA 给字节类型符号定值 BYTE 给字节类型符号定值 WROD 给字类型符号定值 BIT 给位地址取名 ALTNAME 用自定义名取代保留字 DB 给一块连续的存储区装载字节型数据 DW 给一块连续的存储区装载字型数据 DS 预留一个连续的存储区或装入指定字节。 INCLUDE 将一个源文件插入程序中 TITLE 列表文件中加入标题行

NOLIST 汇编时不产生列表文件 NOCODE 条件汇编时,条件为假的不产生清单 一、ORG 伪指令ORG用于为在它之后的程序设置地址值,它有一个参数,其格式为: ORG 表达式 表达式可以是一个具体的数值,也可以包含变量名,如果包含变量名,则必须保证,当第一次遇到这条伪指令时,其中的变量必须已有定义(已有具体的数值),否则,无定义的值将由0替换,这将会造成错误。在列表文件中,由ORG定义的指令地址会被打印出来。 ORG指令有什么用途呢?指令被翻译成机器码后,将被存入系统的ROM中,一般情况下,机器码总是一个接一个地放在存储器中,但有一些代码,其位置有特殊要求,典型的是五个中断入口,它们必须被放在0003H,000BH,0013H,001BH和0023H的位置,否则就会出错,如果我们编程时不作特殊处理,让机器代码一个接一个地生成,不能保证这些代码正好处于这些规定的位置,执行就会出错,这时就要用到ORG伪指令了。看如下例子: 例: INT_0 EQU 1000H TIME_0 EQU 1010H INT_1 EQU 1020H TIME_1 EQU 1030H SERIAL EQU 1040H

51单片机汇编指令集

1)数据传送类指令(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) 出栈; (2)算术运算类指令(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) 除法; (3)逻辑运算类指令(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位交换; (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则转移;

单片机详解

(第六课)上两次我们做过两个实验,都是让P1.0这个管脚使灯亮,我们能设想:既然P1.0能让灯亮,那么其它的管脚可不能呢?看一下,它是8031单片机管脚的说明,在P1.0旁边有P1.1,P1.2….P1.7,它们是否都能让灯亮呢?除了以P1开头的外,还有以P0,P2,P3开头的,数一下,一共是32个管脚,前面我们以学过7个管脚,加上这32个这39个了。它们都以P字开头,只是后面的数字不一样,它们是否有什么联系呢?它们能不能都让灯亮呢?在我们的实验板上,除了P10之外,还有P11 -> P17都与LED相连,下面让我们来做一个实验,程序如下: MAIN: MOV P1,#0FFH LCALL DELAY MOV P1,#00H LCALL DELAY LJMP MAIN DELAY:MOV R7,#250 D1:MOV R6,#250 D2:DJNZ R6,D2 DJNZ R7,D1 RET END 将这段程序转为机器码,用编程器写入单片机中,结果如何?通电以后我们能看到8只LED全部在闪动。因此,P10->P17是全部能点亮灯的。事实上,凡以P开头的这32个管脚都是能点亮灯的,也就是说:这32个管脚都能作为输出使用,如果不用来点亮LED,

能用来控制继电器,能用来控制其它的执行机构。 程序分析:这段程序和前面做过的程序比较,只有两处不一样:第一句:原来是SETB P1.0,现在改为MOV P1,#0FFH,第三句:原来是CLR P1.0,现在改为MOV P1.0,#00H。从中能看出,P1是P1.0->P1.7的全体的代表,一个P1就表示了所有的这八个管脚了。当然用的指令也不一样了,是用MOV指令。为什么用这条指令?看图2,我们把P1作为一个整体,就把它当作是一个存储器的单元,对一个单元送进一个数能用MOV指令。 二、第四个实验 除了能作为输出外,这32个管脚还能做什么呢?下面再来做一个单片机实验,源程序如下: MAIN: MOV P3,#0FFH LOOP: MOV A,P3 MOV P1,A LJMP LOOP 先看一下这个实验的结果:所有灯全部不亮,然后我按下一个按钮,第(1)个灯亮了,再按下另一个按钮,第(2)个灯亮了,松开按钮灯就灭了。从这个实验现象结合电路来分析一下程序。 从硬件电路的连线能看出,有四个按钮被接入到P3口的P32,P33,P34,P35。第一条指令的用途我们能猜到:使P3口全部为高电平。第二条指令是MOV A,P3,其中MOV 已经知道,是送数的意思,这条指令的意思就是将P3口的数送到A中去,我们能把A当成是一个中间单元(看图3),第三句话是将A中的数又送到P1口去,第四句话是循环,就是持续地重复这个过程,这我们已见过。当我们按下第一个按钮时,第(3)只灯亮了,所以P12口应当输出是低电平,为什么P12口会输出低电平呢?我们看一下有什么被送到了P 1口,只有从P3口进来的数送到A,又被送到了P1口,所以,肯定是P3口进来的数使得P12位输出电平的。P3口的P32位的按钮被按下,使得P32位的电平为低,通过程序,又

单片机伪指令和指令详解

ASM-51汇编伪指令 一、伪指令分类 1.符号定义 SEGMENT, EQU, SET, DATA, IDATA, XDATA, BIT, CODE 2.存储器初始化/保留 DS, DB, DW, DBIT 3.程序链接 PUBILC, EXTRN, NAME 4.汇编程序状态控制 ORG, END 5.选择段的伪指令 RSEG, CSEG, DSEG, XSEG, ISEG, BSEG, USING 二、伪指令具体说明 1.符号定义伪指令 1)SEGMENT伪指令 格式:段名SEGMENT 段类型 说明:SEGMENT 伪指令说明一个段。段就是一块程序代码或数据存储器。允许使用的段类型为: ●CODE代码空间 ●DATA 可以直接寻址的内部数据空间 ●XDATA外部数据空间 ●IDATA可以间接寻址的整个内部数据空间 ●BIT位空间 例子:(段符号用于表达式时,代表被连接段的基地址) STACK SEGMENT IDATA RSEG STACK DS 10H ;保留16字节做堆栈 MOV SP , #STACK-1 ;堆栈指针初始化

2)EQU伪指令 格式:符号名 EQU 表达式 符号名 EQU 特殊汇编符号 说明:EQU表示把一个数值或特殊汇编符号赋予规定的名字。 一个表达式赋予一个符号,必须是不带向前访问的表达式。 例子:N27 EQU 27; ACCUM EQU A ;定义ACCUM代替特殊汇编符号A(累加器) HERE EQU $; HERE为当前位置计数器的值 3)SET伪指令 格式:符号名 SET 表达式 符号名 SET 特殊汇编符号 说明:SET类似EQU,区别在于可以用另一个SET伪指令在以后对定义过的符号重新定义。 例子:COUNT SET 0 COUNT SET COUNT+1 4)BIT伪指令 格式:符号名 BIT 位地址 说明: BIT伪指令把一个地址赋予规定的符号名。该符号类型取段类型BIT. 例子: RSEG DATA_SEG; CONTROL: DS 1 ALATM BIT CONTROL.0; OPEN_BOARD BIT ALATM+1 ;下一位 RESET_BOARD BIT 60H ;下一个绝对的位 5)DATA伪指令 格式:符号名 DATA 表达式 说明:DATA伪指令把片内的数据地址赋予所规定的符号名。符号段类型为DATA. 例子:CONIN DATA SBUF;定义CONIN 到串行口缓冲器的地址

单片机汇编指令

单片机汇编指令 单片机汇编指令:为解决某些特定的问题代码中必须嵌入汇编语言以代替C语言完成的单片机的编程,汇编语言对于程序调试是不可或缺的。它包括:数据传送类指令,算术运算类指令,逻辑运算与循环类指令,控制转移类指令,位操作(布尔操作)类指令。 现在单片机的编程大多是C语言完成但有时代码中必须嵌入汇编语言解决某些特定的问题,对于程序调试汇编语言更是不可或缺 一.数据传送类指令: (1)一般传送指令: ①8位传送: 1 MOV A,Rn ;A←(Rn):寄存器内容送入累加器 2 MOV A,direct ;A←(direct):直接地址单元中的数据送入累加器 3 MOV A,@Ri ;A←((Ri)):间接RAM 中的数据送入累加器 4 MOV A,#data ;A←(data):立即数送入累加器 5 MOV Rn,A ;Rn←(A):累加器内容送入寄存器 6 MOV Rn,direct ;Rn←(direct):直接地址单元中的数据送入寄存器 7 MOV Rn,#data ;Rn←(data):立即数送入寄存器 8 MOV direct,A ;direct←(A):累加器内容送入直接地址单元 9 MOV direct,Rn ;direct←(Rn):寄存器内容送入直接地址单元 10 MOV direct,direct;direct←(direct):直接地址单元中的数据送入另一个直接地址单元 11 MOV direct,@Ri ;direct←(@Ri):间接RAM 中的数据送入直接地址单元 12 MOV direct,#data ;direct←(data):立即数送入直接地址单元 13 MOV @Ri,A;Ri←(A):累加器内容送入间接RAM 单元 14 MOV @Ri,direct ;Ri←(direct)直接地址单元数据送入间接RAM 单元 15 MOV @RI,#data ;Ri←(data):立即数送入间接RAM 单元 ②16位传送: 16 MOV DRTR,#data16 ;(DRTR) ←(data16):16 位立即数送入地址寄存器 (2)特殊传送指令: ⑤ ①读取常数表: 17 MOVC A,@A+DPTR ;A←((A)+(DPTR)):以DPTR为基地址变址寻址单元中的数据送入累加器 18 MOVC A,@A+PC;A←((A)+(PC)):以PC 为基地址变址寻址单元中的数据送入累加器 ②读写片外RAM及接口单元数据: 读片外RAM: 19 MOVX A,@Ri ;A←((Ri)):外部RAM(8 位地址)送入累加器 20 MOVX A,@DPTR ;A←((DPTR)):外部RAM(16 位地址)送入累加器

51单片机汇编指令大全

51汇编指令大全 Rn: 表示当前寄存器区的8个工作寄存器R0~R7 Ri: 表示当前寄存器区的R0或R1,可作地址指针即间址寄存器(i=0或1) @: 为间接寄存器或基址寄存器的前缀. Direct: 表示8位内部数据存储单元的地址.它可以是内部RAM的单元地址0~127.特殊功能 寄存器SFR的地址(128~255)或名称, A: 累加器ACC. B: .特殊功能寄存器B,用于MUL和DIV指令中. C: 进位位Cy. #data: 表示包含在指令中的单字节(8位)立即数.如果用16位进制表示,后缀字母为”H”,数据范围00~0FFH,不得一字母开头;如果用16进制表示无须任何后缀,但必须在0~255之间. #data16: 表示包含在指令中的双字节(16位)立即数. Adda16: 表示16位的目的地址.用于LCALL和LJMP指令中,目的地址范围是从0000H~FFFFH的整个64KB存储地址空间. Adda11: 表示11位的目的地址.用于ACALL和AJMP的指令中,目的地址必须和下一条指令第一个字节同处一页. Rel: 表示8位带符号的相对偏移量.用语SJMP和所有的条件转移指令中.偏移量相对于下一条指令的第一个字节计算,在-128~+127范围内取值. DPTR: 为数据指针,可用作16位的地址寄存器. /: 加在位操作的前面,表示对该位进行非运算. bit: 表示内部可寻址位或特殊功能寄存器中的直接寻址位. “(x): 寄存器或地址单元中的内容. ((x)): 有x见解寻址的单元中的内容. <-: 表示将箭头右边的内容传送至箭头的左边. $: 当前指令的地址. 单片机指令系统 (一) 内部数据传送指令 (1) 以累加器A为目的的传送指令: MOV A, #data ;(A)<-data MOV A, direct ;(A)<-(direct) MOV A, Rn ;(A)<-(Rn) MOV A, @Ri ;(A)<- ((Ri)) (2) 以通用寄存器Rn为目的的传送指令: MOV Rn, A ;(Rn)<-(A) MOV Rn, direct ; (Rn)<(direct)- MOV Rn, #data: ; (Rn)<-(data) (3) 以直接地址为目的的传送指令: MOV direct, A ;(direct)<-(A) MOV direct, Rn ; (direct)<-(Rn) MOV direct, direct2 ; (direct)<-(direct2) MOV direct, @Ri ; (direct)<-((Rn)) MOV direct, #data ; (direct)<-data (4) 以寄存器间接地址为目的的传送指令:

相关文档