第3章 89C51单片机汇编语言简介汇编

第3章 89C51单片机汇编语言简介汇编
第3章 89C51单片机汇编语言简介汇编

第3章89C51单片机汇编语言简介

教学目标

本章主要介绍89C51单片机的寻址方式、指令系统、基本程序结构及汇编语言程序的编写,并给出了两个简单的应用实例。通过本章节的学习,读者应初步掌握89C51单片机汇编语言的基本指令,并能够完成一些简单程序的编写和调试。

任务导入:

基于汇编语言的静态LED显示系统的实现:

利用89C51单片机的I/O端口驱动一个共阳极数码管,在数码管上循环显示0-9数字,时间间隔0.5秒。

任务分析

要实现用一个数码管循环显示数字0~9的功能,我们可把数码管的段选线连接到单片的I/O口上,再通过程序让单片机的I/O口分时输出0~9对应的段码就可以了。单片机的程序又如何编写呢?通过本章的学习,就可以用单片机的汇编语言让数码管按照要求进行显示。

任务必备知识

3.1 89C51单片机指令系统

3.1.1 89C51单片机指令分类

89C51单片机指令系统共有111条指令。这些指令可按不同方法进行分类:

1.按字节数分

单字节指令(49条)、双字节指令(45条)、三字节指令(17条)。

2.按指令的执行时间分

单机器周期指令(64条)、双机器周期指令(45条)、四机器周期指令(2条)。

3.按指令的功能分

数据传送指令(28条)、算术运算指令(24条)、逻辑运算指令(25条)、控制转移指令(17条)、位操作指令(17条)。

指令一般由两部分组成,即操作码和操作数。在介绍指令系统前,我们先了解一些特殊符号的意义,这对今后程序的编写是相当有用的。

Rn——当前选中的寄存器区的8个工作寄存器R0—R7(n=0-7)。

Ri——当前选中的寄存器区中可作为地址寄存器的两个寄存器R0和R1(i=0,1)

direct—内部数据存储单元的8位地址。包含0—127(255)内部存储单元地址和特殊功能寄存地址。

#data—指令中的8位常数。

#data16—指令中的16位常数。

addr16—用于LCALL和LJMP指令中的16目的地地址,目的地址的空间为64kB程序存储器地址。

#addr11—用于ACALL和AJMP指令中的11目的地地址,目的地址必须放在与下条指令第一个字节同一个2kB程序存储器空间之中。

rel—8位带符号的偏移字节,用于所有的条件转移和SJMP等指令中,偏移字节对于下条指令的第一个字节开始的-128——+127范围内。

@—间接寄存器寻址或基址寄存器的前缀。

/—为操作的前缀,声明对该位操作数取反。

DPTR—数据指针。

bit—内部RAM和特殊功能寄存器的直接寻址位。

A—累加器。

B—累加器B,用于乘法和除法指令中。

C—进位标志位。

(x)—某地址单元中的内容。

((x))—由X寻址单元中的内容。

3.1.2 汇编指令格式

各种汇编语言的语句格式是基本相同的,表示如下:

[标号:] 操作码助记符[第一操作数] [,第二操作数] [,第三操作数] [;注释]

即一条汇编语句是由标号、操作码、操作数和注释四个都分所组成。其中方括号括起来的是可选择部分,可有可无,视需要而定。

1.标号

标号是表示指令位置的符号地址,它是以英文字母开始的字母或数字组成的字符串,并以“:”结尾。通常在子程序入口或转移指令的目标地址处才赋予标号。有了标号,程序中的其它语句才能访问该语句。89C51汇编语言有关标号的规定如下:

1)标号是由ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字

或其它特定字符。

2)不能使用本汇编语言已经定义了的符号作为标号,如指令助记符,伪指令助记符以及寄存器的符号名称等。

3)标号后边必须跟以冒号。

4)同一标号在一个程序中只能定义一次,不能重复定义。

5)一条语句可以有标号,也可以没有标号,标号的有无决定着本程序中的其它语句是否需要访问这条语句。

下面例举一些例子,以加深了解。

错误的标号正确的标号

2BT:(以数字开头)LOOP4:

BEGIN(无冒号)STABL:

TB+5T:(“+”号不能在标号中出现)TABLE:

ADD:(用了指令助记符)Q¥:

2.操作码

操作码助记符是表示指令操作功能的英文缩写。每条指令都有操作码,它是指令的核心部分。操作码用于规定本语句执行的操作,操作码可为指令的助记符或伪指令的助记符,操作码是汇编指令中唯一不能空缺的部分。

3.操作数

操作数用于给指令的操作提供数据或地址。在一条指令中,可能没有操作数,也可能只包括一项,也可能包括二项、三项。各操作数之间以逗号分隔,操作码与操作数之间以空格分隔。操作数可以是立即数,如果立即数是二进制数,则最低位之后加“B”;如果立即数是十六进制数,则最低位之后加“H”;如果立即数是十进制数,则数字后面不加任何标记。

操作数可以是本程序中已经定义过的标号或标号表达式,例如MOON是一个已经定义的标号,则表达式MOON+1或MOON-1都可以作为地址来使用。操作数也可以是寄存器名。此外,操作数还可以是位符号或表示偏移量的操作数。相对转移指令中的操作数还可使用一个特殊的符号“$”,它表示本相对转移指令所在的地址,例如:JNB TF0,$ 表示当TF0位不为0时,就转移到该指令本身,以达到程序在“原地踏步”等待的目的。

4.注释

注释不属于语句的功能部分,它只是对每条语句的解释说明,它可使程序的文件编制显得更加清楚,是为了方便阅读程序的一种标注。只要用“;”开头,即表明后面为注释内容,注释的长度不限,一行不够时,可以换行接着写,但换行时应注意在开头使用“;”号。

5.分界符(分隔符)

分界符可以是空格、冒号、分号和逗号等。这些分界符的使用情况如下:

1)冒号(:)用于标号之后。

2)空格()用于操作码和操作数之间。

3)逗号(,)用于操作数之间。

4)分号(;)用于注释之前。

例如MOV A,#0AH表示取一个立即数0AH(十六进制,如转换成二进制为00001010B)传送到A累加器。

3.1.3 寻址方式

寻址的“地址”即为操作数所在单元的地址,绝大部分指令执行时都需要用到操作数,那么到哪里去取得操作数呢?最易想到的就是告诉CPU操作数所在的地址单元,从那里可取得响应的操作数,这便是“寻址”之意。89C51的寻址方式很多,使用起来也相当方便,功能也很强大,灵活性强。下面我们分别讨论几种寻址方式的原理。

1.直接寻址方式

指令中操作数直接以单元地址形式出现,例如:

MOV A,35H

这条指令的意义是把内部RAM中的35H单元中的数据内容传送到累加器A中。值得注意的是直接寻址方式只能使用8位二进制地址,因此这种寻址方式仅限于内部RAM进行寻址。低128位单元在指令中直接以单元地址的形式给出。对于特殊功能寄存器可以使用其直接地址(MOV A,80H)进行访问,还可以以它们的符号形式(MOV A,P0)给出,但是特殊功能寄存器只能用直接寻址方式访问,而无其它方法。

2.寄存器寻址方式

寄存器寻址对选定的8个工作寄存器R0-R7进行操作,即操作数在寄存器中,因此指定了寄存器就得到了操作数,寄存器寻址的指令中以寄存器的符号来表示寄存器,例如:MOV A,R3

这条指令的意义是把所用的工作寄存器组中的R3的内容送到累加器A中。

需要注意的是工作状态寄存器的选择是通过程序状态字寄存器来控制的,在这条指令前,应通过PSW设定当前工作寄存器组。

3.寄存器间接寻址

寄存器寻址方式在寄存器中存放的是操作数,而寄存器间接寻址方式在寄存器中存放的则为操作数的地址,也即操作数是通过寄存器所指向的地址单元得到的,这便是寄存器间接寻址名称的由来。例如:

MOV A,@R1

这条指令的意义是R0寄存器指向地址单元中的内容送到累加器A中。假如R1=#67H,那么是将67H单元中的数据送到累加器A中。

寄存器间接寻址方式可用于访问内部RAM或外部数据存储器。访问内部RAM或外部数据存储器的低256字节时,只通过R0和R1作为间接寄存器。然而内部RAM的高128字节地址与专用寄存器的地址是重叠的,所以这种寻址方式不能用于访问特殊功能寄存器。

外部数据存储器的存储空间为64KB,可采用DPTR作为间址寄存器进行访问,例如:MOVX A,@DPTR

这条指令的意义是与上述类似,不再赘述。

4.立即寻址

立即寻址就是把操作数直接在指令中给出,即操作数包含在指令中,指令操作码的后面紧跟着操作数,一般把指令中的操作数称为立即数。为了与直接寻址方式相区别,在立即数前加上“#”符号,例如:

MOV A,#0CH

这条指令的意义是将0CH这个操作数送到累加器A中。立即数存放在程序存储器中。

5.变址寻址

变址寻址是以DPTR或PC作为基址寄存器,以累加器A作为变址寄存器,将两寄存器的内容相加形成16位地址作为操作数的实际地址。例如:

MOV A,@A+DPTR

MOVX A,@A+PC

JMP@A+DPTR

在这三条指令中,A作为偏移量寄存器,DPTR或PC作为变址寄存器,A作为无符号数与DPTR或PC的内容相加,得到访问的实际地址。其中前两条是程序存储器读指令,后一条是无条件转移指令。

6.位寻址

在89C51单片机中,RAM中的20H—2FH字节单元对应的位地址为00H—7FH,特殊功能寄存器中的某些位也可进行位寻址,这些单元既可以采用字节方式访问它们,也可采用位寻址的方式访问它们。

7.相对寻址

相对寻址方式是为了程序的相对转移而设计的,以PC的内容为基址,加上给出的偏移量作为转移地址,从而实现程序的转移。转移的目的地址可参见如下表达式:目的地址=转移指令所在地址+转移指令字接数+偏移量

值得注意的是,偏移量是有正负号之分的,偏移量的取值范围是当前PC值的-128—+127之间。偏移量是以补码形式给出的。

3.1.4 数据传送类指令

数据传送指令共有28条,数据传送指令一般的操作是把源操作数传送到目的操作数,指令执行完成后,源操作数不变,目的操作数等于源操作数。如果要求在进行数据传送时,目的操作数不丢失,则不能用直接传送指令,而采用交换型的数据传送指令,数据传送指令不影响标志CY,AC和OV,但可能会对奇偶标志P有影响。

1.以累加器A为目的操作数类指令(4条)

这4条指令的作用是把源操作数指向的内容送到累加器A。有直接、立即数、寄存器和寄存器间接寻址方式:

MOV A, data ;(data)→(A) 直接单元地址中的内容送到累加器A。

MOV A, #data ; #data→(A) 立即数送到累加器A。

MOV A, Rn ;(Rn)→(A) Rn中的内容送到累加器A。

MOV A, @Ri ;((Ri))→(A) Ri内容指向的地址单元中的内容送到累加器A。

2.以寄存器Rn为目的操作数的指令(3条)

这3条指令的功能是把源操作数指定的内容送到所选定的工作寄存器Rn中。有直接、立即和寄存器寻址方式:

MOV Rn, data ;(data)→(Rn) 直接寻址单元中的内容送到寄存器Rn。

MOV Rn, #data ;#data→(Rn) 立即数直接送到寄存器Rn。

MOV Rn, A ;(A)→(Rn) 累加器A中的内容送到寄存器Rn。

3.以直接地址为目的操作数的指令(5条)

这组指令的功能是把源操作数指定的内容送到由直接地址data所选定的片内RAM中。有直接、立即、寄存器和寄存器间接4种寻址方式:

MOV data, data ;(data)→(data) 直接地址单元中的内容送到直接地址单元。

MOV data, #data ;#data→(data) 立即数送到直接地址单元。

MOV data, A ;(A)→(data) 累加器A中的内容送到直接地址单元。

MOV data, Rn ;(Rn)→(data) 寄存器Rn中的内容送到直接地址单元。

MOV data, @Ri ;((Ri))→(data) 寄存器Ri中的内容指定的地址单元中数据送到直接地址单元。

4.以间接地址为目的操作数的指令(3条)

这组指令的功能是把源操作数指定的内容送到以Ri中的内容为地址的片内RAM中。有直接、立即和寄存器3种寻址方式:

MOV @Ri, data ;(data)→((Ri))

直接地址单元中的内容送到以Ri中的内容为地址的RAM单元。

MOV @Ri,#data ;#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, @Ri ;((Ri))→(A)

寄存器Ri指向片外RAM地址中的内容送到累加器A。

MOVX @Ri,A ;(A)→((Ri))

累加器中的内容送到寄存器Ri指向的片外RAM地址中。

7.堆栈操作类指令(2条)

这类指令只有两条,下面的第一条常称为入栈操作指令,第二条称为出栈操作指令。需要指出的是,单片机开机复位后,(SP)默认为07H,但一般都需要重新赋值,设置新的SP首址。入栈的第一个数据必须存放于SP+1所指存储单元,故实际的堆栈底为SP+1所指的存储单元。

PUSH data ;(SP)+1→(SP),(data)→(SP)

堆栈指针首先加1,直接寻址;单元中的数据送到堆栈指针SP所指的单元。

POP data ;(SP)→(data),(SP)-1→(SP)

堆栈指针SP所指的单元数据送到直接寻址单元中,堆栈指针SP再进行减1操作。

8.交换指令(4条)

这4条指令的功能是把累加器A中的内容与源操作数所指的数据相互交换。

XCH A, Rn ;(A)←→(Rn) 累加器与工作寄存器Rn中的内容互换。

XCH A, @Ri ;(A)←→((Ri)) 累加器与Ri所指的存储单元中的内容互换。

XCH A, data ;(A)←→(data) 累加器与直接地址单元中的内容互换。

XCHD A, @Ri ;(A3-0)←→((Ri)3-0) 累加器与工作寄存器Ri所指的存储单元中的低半字节内容互换。

9.16位数据传送指令(1条)

这条指令的功能是把16位常数送入数据指针寄存器。

MOV DPTR,#data16 ;#dataH→(DPH),#dataL→(DPL)

16位常数的高8位送到DPH,低8位送到DPL。

3.1.5 算数运算类指令

算术运算指令共有24条,算术运算主要是执行加、减、乘、除法四则运算。另外89C51指令系统中有一部分是进行加、减1操作,BCD码的运算和调整,我们都归类为运算指令。虽然89C51单片机的算术逻辑单元ALU仅能对8位无符号整数进行运算,但利用进位标志C,则可进行多字节无符号整数的运算。同时利用溢出标志,还可以对带符号数进行补码运算。需要注意的是,除加、减1指令外,这类指令大多数都会对PSW(程序状态字)有影响。

这4条指令的作用是把立即数,直接地址、工作寄存器及间接地址内容与累加器A的内容相加,运算结果存在A中。

ADD A, #data ;(A)+#data→(A)

累加器A中的内容与立即数#data相加,结果存放在A。

ADD A, data ;(A)+(data)→(A)

累加器A中的内容与直接地址单元中的内容相加,结果存放在A。

ADD A,Rn ;(A)+(Rn)→(A)

累加器A中的内容与工作寄存器Rn中的内容相加,结果存放在A。

ADD A,@Ri ;(A)+((Ri))→(A)

累加器A中的内容与工作寄存器Ri所指向的地址单元中的内容相加,结果存放在A。

2.带进位加法指令(4条)

这4条指令除与[1]功能相同外,在进行加法运算时还需考虑进位问题。

ADDC A, data ;(A)+(data)+(C)→(A)

累加器A中的内容与直接地址单元的内容连同进位位相加,结果存放在A。

ADDC A, #data ;(A)+#data +(C)→(A)

累加器A中的内容与立即数连同进位位相加,结果存放在A。

ADDC A, Rn ;(A)+Rn+(C)→(A)

累加器A中的内容与工作寄存器Rn中的内容、连同进位位相加,结果存放在A。

ADDC A, @Ri ;(A)+((Ri))+(C)→(A)

累加器A中的内容与工作寄存器Ri指向地址单元中的内容、连同进位位相加,结果存放在A。

3.带借位减法指令(4条)

这组指令包含立即数、直接地址、间接地址及工作寄存器与累加器A连同借位位CY 内容相减,结果送回累加器A中。

这里我们对借位位CY的状态作出说明,在进行减法运算中,CY=1表示有借位,CY=0则无借位。在进行减法运算前,如果不知道借位标志位C的状态,则应先对CY进行清零操作。

SUBB A,data ;(A)-(data)-(C)→(A)

累加器A中的内容与直接地址单元中的内容、连同借位位相减,结果存放在A。

SUBB A,#data ;(A)-#data-(C)→(A)

累加器A中的内容与立即数、连同借位位相减,结果存放在A。

SUBB A,Rn ;(A)-(Rn)-(C)→(A)

累加器A中的内容与工作寄存器中的内容、连同借位位相减,结果存放在A。

SUBB A,@Ri ;(A)-((Ri))-(C)→(A)

累加器A中的内容与工作寄存器Ri指向的地址单元中的内容、连同借位位相减,结果存放在A。

这条指令的作用是把累加器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 ;(data)+1→(data) 直接地址单元的内容加1,结果送回原单元中。

INC @Ri ;((Ri))+1→((Ri)) 寄存器内容指向的地址单元中的内容加1,结果送回原地址单元中。

INC Rn ;(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 ; (data)-1→(data) 直接地址单元中的内容减1,结果送回原单元中。

DEC @Ri ; ((Ri))-1→((Ri)) 寄存器内容指向的地址单元中的内容减1,结果送回原地址单元中。

DEC Rn ; (Rn)-1→(Rn) 寄存器Rn中的内容减1,结果送回寄存器Rn。

8.十进制调整指令(1条)

在进行BCD码运算时,这条指令总是跟在ADD或ADDC指令之后,其功能是将执行加法运算后存于累加器A中的结果进行调整和修正。

DA A

3.1.6 逻辑运算类指令

逻辑运算和移位指令共有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, data;累加器A中的内容和直接地址单元中的内容执行与逻辑操作。结果存在寄存器A。

ANL data, #data;直接地址单元中的内容和立即数执行与逻辑操作。结果存在直接地址单元中。

ANL A, #data;累加器A的内容和立即数执行与逻辑操作。结果存在累加器A。

ANL A, Rn;累加器A的内容和寄存器Rn中的内容执行与逻辑操作。结果存在累加器A。

ANL data, A;直接地址单元中的内容和累加器A的内容执行与逻辑操作。结果存在直接地址单元中。

ANL A, @Ri;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执

行与逻辑操作。结果存在累加器A。

6.逻辑或操作指令(6条)

这组指令的作用是将两个单元中的内容执行逻辑或操作。如果直接地址是I/O地址,则为“读—修改—写”操作。

ORL A, data;累加器A中的内容和直接地址单元中的内容执行逻辑或操作。结果存在寄存器A。

ORL data, #data;直接地址单元中的内容和立即数执行逻辑或操作。结果存在直接地址单元。

ORL A, #data;累加器A的内容和立即数执行逻辑或操作。结果存在累加器A。

ORL A, Rn;累加器A的内容和寄存器Rn中的内容执行逻辑或操作。结果存在累加器A。

ORL data, A;直接地址单元中的内容和累加器A的内容执行逻辑或操作。结果存直接地址单元。

ORL A, @Ri;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑或操作。结果存在累加器A。

7.逻辑异或操作指令(6条)

这组指令的作用是将两个单元中的内容执行逻辑异或操作。如果直接地址是I/O地址,则为“读—修改—写”操作。

XRL A, data;累加器A中的内容和直接地址单元中的内容执行逻辑异或操作。结果存在寄存器A。

XRL data, #data;直接地址单元中的内容和立即数执行逻辑异或操作。结果存在直接地址单元中。

XRL A, #data;累加器A的内容和立即数执行逻辑异或操作。结果存在累加器A。

XRL A, Rn;累加器A的内容和寄存器Rn中的内容执行逻辑异或操作。结果存在累加器A。

XRL data, A;直接地址单元中的内容和累加器A的内容执行逻辑异或操作。结果存在直接地址单元中。

XRL A, @Ri;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑异或操作。结果存在累加器A中。

3.1.7 控制转移类指令

控制转移指令用于控制程序的流向,所控制的范围即为程序存储器区间,89C51系列单片机的控制转移指令相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2KB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令,这些指令的执行一般都不会对标志位有影响。

1.无条件转移指令(4条)

这组指令执行后,程序会无条件转移到指令所指向的地址。长转移指令访问的程序存储器空间为16位地址64KB空间,绝对转移指令访问的程序存储器空间为11位地址2KB 空间。

LJMP addr16 ;addr16→(PC),给程序计数器赋予新值(16位地址) 。

AJMP addr11 ;(PC)+2→(PC),addr11→(PC10-0)程序计数器赋予新值(11位地址),(PC15-11)不改变。

SJMP rel ;(PC)+2+rel→(PC),当前程序计数器先加上2再加上偏移量给程序计数器赋予新值。

JMP @A+DPTR ;(A)+(DPTR)→(PC),累加器所指向地址单元的值加上数据指针的值给程序计数器赋予新值。

2.条件转移指令(8条)

程序可利用这组丰富的指令根据当前的条件进行判断,看是否满足某种特定的条件,从而控制程序的转向。

JZ rel ; A=0,(PC)+2+rel→(PC),累加器中的内容为0,则转移到偏移量所指向的地址,否则程序往下执行。

JNZ rel ; A≠0,(PC)+2+rel→(PC),累加器中的内容不为0,则转移到偏移量所指向的地址,否则程序往下执行。

CJNE A, data, rel ; A≠(data),(PC)+3+ rel→(PC),累加器中的内容不等于直接地址单元的内容,则转移到偏移量所指向的地址,否则程序往下执行。

CJNE A, #data, rel ; A≠#data,(PC)+3+ rel→(PC),累加器中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行。

CJNE Rn, #data, rel ; (Rn)≠#data,(PC)+3+ rel→(PC),工作寄存器Rn中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行。

CJNE @Ri, #data, rel ;((Ri))≠#data,(PC)+3+ rel→(PC),工作寄存器Ri指向地址单元中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行。

DJNZ Rn, rel;(Rn)-1→(Rn),(Rn)≠0,(PC)+2+rel→(PC)工作寄存器Rn减1不等于0,则转移到偏移量所指向的地址,否则程序往下执行。

DJNZ data, rel; (data)-1→(data),(data)≠0,(PC)+2+rel→(PC)直接地址单元中的内容减1不等于0,则转移到偏移量所指向的地址,否则程序往下执行。

3.子程序调用指令(1条)

子程序是为了便于程序编写,减少那些需反复执行的程序占用多余的地址空间而引入的程序分支,从而有了主程序和子程序的概念,需要反复执行的一些程序,我们在编程时一般都把它们编写成子程序,当需要用它们时,就用一个调用命令使程序按调用的地址去执行,这就需要子程序的调用指令和返回指令。

LCALL addr16;长调用指令,可在64kB空间调用子程序。

此时(PC)+3→(PC),(SP)+1→(SP),(PC7-0)→(SP),(SP)+ 1→(SP),(PC15-8)→(SP),addr16→(PC),程序的PC为addr16对应的地址。

ACALL addr11;绝对调用指令,可在2kB空间调用子程序。

此时(PC)+2→(PC),(SP)+1→(SP),(PC7-0)→(SP),(SP)+1→(SP),(PC15-8)→(SP),addr11→(PC10-0)。

RET ; 子程序返回指令

此时(SP)→(PC15-8),(SP)-1→(SP),(SP)→(PC7-0),(SP)-1→(SP)。

RETI ; 中断返回指令

此指令除具有RET功能外,还具有恢复中断逻辑的功能,需注意的是,RETI指令不能用RET代替。

4.空操作指令(1条)

这条指令将累加器中的内容清0。可用于短时间的延时。

NOP ; 这条指令除了使PC加1,消耗一个机器周期外,不执行任何操作

3.1.8 位操作指令

布尔处理功能是89C51系列单片机的一个重要特征,这是出于实际应用需要而设置的。布尔变量也即开关变量,它是以位(bit)为单位进行操作的。

在物理结构上,89C51系列单片机有一个布尔处理机,它以进位标志做为累加位,以内部RAM可寻址的128个为存储位。

1.位传送指令(2条)

位传送指令就是可寻址位与累加位CY之间的传送,指令有两条。

MOV C,bit ;bit→CY,某位数据送CY。

MOV bit,C ;CY→bit,CY数据送某位。

2.位置位复位指令(4条)

这些指令对CY及可寻址位进行置位或复位操作,共有四条指令。

CLR C ; 0→CY,清CY。

CLR bit ; 0→bit,清某一位。

SETB C ; 1→CY,置位CY。

SETB bit ; 1→bit,置位某一位。

3.位运算指令(6条)

位运算都是逻辑运算,有与、或、非三种指令,共六条。

ANL C,bit;(CY)与(bit)→CY。

ANL C,/bit ;(CY)与(bit)→CY。

ORL C,bit;(CY)或(bit)→CY。

ORL C,/bit ;(CY)或(bit)→CY。

CPL C;(CY)→CY。

CPL bit;(bit)→bit。

4.位控制转移指令(5)

位控制转移指令是以位的状态作为实现程序转移的判断条件。

JC rel; (CY)=1转移,(PC)+2+rel→PC,否则程序往下执行,(PC)+2→PC。

JNC rel; (CY)=0转移,(PC)+2+rel→PC,否则程序往下执行,(PC)+2→PC。

JB bit, rel ;位状态为1转移。

JNB bit, rel ;位状态为0转移。

JBC bit, rel ;位状态为1转移,并使该位清“0”。

后三条指令都是三字节指令,如果条件满足,(PC)+3+rel→PC,否则程序往下执行,(PC)+3→PC。

3.1.9 伪指令

汇编语言除了定义了汇编指令外,还定义了一些汇编伪指令,以支持汇编的运行。伪指令是汇编时不产生机器语言代码的指令,是CPU不能执行的指令,仅提供汇编用的某些控制信息。A T89C51汇编语言常用的伪指令有以下几条。

1.ORG定位伪指令

格式:ORG m

m一般是16位二进制数,m指出在该指令后的(伪)指令的汇编地址,即生成的机器指令的起始存储器地址。它必须放在每段源程序或数据段的开始行,在一个汇编语言的源程序中允许存在多条定位伪指令,但其中每一个m值都应和前面生成的机器指令存放地址不重叠。

例如下面的代码:

ORG1000H

`START:MOV A,#10H

……

ORG2000H

SECOND:CLR A

第1条定位伪指令指定了标号START的地址为1000H,“MOV A,#10H”指令及其后面的指令汇编成的机器码放在从1000H开始的存储单元中。

第2条定位伪指令指定了标号SECOND的地址为2000H。从START开始的程序段所占用的存储地址最多为1FFFH,否则与从SECOND开始的程序段地址重叠,程序在编译时不会发生错误,但在运行时就会发生错误。

2.DB定义字节伪指令

格式:标号:DB X1,X2,…,Xn

标号可有可无,Xi是单字节数据,它可为十进制数或十六进制数,可以为一个表达式,也可以是在括在引号‘’中的字符串,表示ASCII码的字符,两个数据之间用逗号“,”分开。它通知汇编程序从当前ROM地址开始,保留存储单元,并存入DB后面的数据。

例如下面的代码。

ORG1000H

DB0AAH

SDATA:DB25,25H

经汇编后,从地址1000H处的存储器的内容如下:

(1000H)=AAH

(1001H)=19H

(1002H)=25H

3.DW定义字伪指令

格式:标号:DW Y1,Y2,…,Yn

标号可有可无,Yi是双字节数据,它可为十进制数或十六进制数,可以为一个表达式,两个数据之间用逗号“,”分开。

它通知汇编程序从当前ROM地址开始,保留存储单元,并存入DW后面的数据。存放时高8位存放在低地址,低8位存放在高地址,如下所示。

ORG1000H

DW1234H

DW2000

经汇编后,从地址1000H处的存储器的内容如下:

(1000H)=12H

(1001H)=34H

(1002H)=07H

(1003H)=D0H

4.EQU赋值伪指令

格式:字符名称EQU项(数或汇编符号)

EQU伪指令是把“项”赋给“字符名称”,需要注意的是,这里的字符名称不同于标号(其后面没有冒号),但它是必需的,其中的项可以是数也可以是汇编符号。

用EQU赋过值的符号名称必须先定义后使用,这些被定义的字符名称可以用做数据地址、代码地址、位地址或一个立即数。因此它可以是8位的,也可以是16位的。

例如下面的代码。

AA EQU R1

MOV A, AA

这里AA就代表了工作寄存器R1。

5.DATA数据地址赋值命令

格式:字符名称DA TA数据或表达式

此命令把数据地址或代码地址赋予标号段规定的字符名称。被定义的字符名称也可以先使用后定义。

例如下面的代码。

第7讲51单片机汇编语言程序设计.

标题:第四部分汇编语言程序设计 教学目标与要求: 1、理解源程序、目标代码、编辑、汇编等含义 2、了解汇编过程 3、掌握伪指令的使用 4、掌握顺序结构、分支结构及循环结构程序的编写方法授课时数: 8学时 教学重点:伪指令的使用 教学内容及过程: 一、程序设计概念 1、汇编程序设计步骤: 分析题意; 资源分配; 程序流程图 编写程序 调试程序 2、程序编写规则: 结构清晰,易读、易于移植 占用存储空间少; 运行时间短; 程序的编制、调试及排错所需时间短; 3、汇编程序功能 汇编指令与机器码指令有一一对应的关系。 汇编程序是一种翻译程序,将源程序翻译成目标程序。 4、汇编程序的汇编过程 汇编有两种方法:手工汇编、机器汇编。 1、手工汇编:

第一次汇编:确定地址,翻译成各条机器码,字符标号原样写出; 第二次汇编:标号代真,将字符标号用所计算出的具体地址值或偏移量代换。 源程序地址 目标程序 第一次汇编第二次汇编 ORG 1000H START: MOV R0,BUFFER-1 1000 A82F A82F MOV R2,#00H 1002 7A00 7A00 MOV A,@R0 1004 E6 E6 MOV R3,A 1005 FB FB INC R3 1006 0B 0B SJMP NEXT 1007 80NEXT 8005 LOOP; INC R0 1009 08 08 CJNE @R0,#44H,NEXT 100A B644NEXT B64401 INC R2 100D 0A 0A NEXT: DJNZ R3,LOOP 100E DBLOOP DBF9 MOV RESULT,R2 1010 8A2A 8A2A SJMP $ 1012 80FE 80FE BUFFER DATA 30H RESULT DATA 2AH END 2、机器汇编 两次扫描过程。 第一次扫描:检查语法错误,确定符号名字; 建立使用的全部符号名字表; 每一符号名字后跟一对应值(地址或数)。 第二次扫描:是在第一次扫描基础上,将符号地址转换成真地址(代真);利用操作码表将助记符转换成相应的目标码。 二、伪指令 伪指令是告诉汇编程序,如何汇编源程序的指令。 伪指令既不控制机器的操作,也不能被汇编成机器代码,故称为伪指令。 1、起始地址伪指令ORG ORG addr16 用于规定目标程序段或数据块的起始地址,设置在程序开始处。 2、汇编结束伪指令END 告诉汇编程序,对源程序的汇编到此结束。一个程序中只出现一次,在末尾。

51单片机汇编程序范例

16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。 程序可见: http: 32.html中的HEX2BCD子程序。 .说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。 但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。 上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。 为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!)执行时间仅仅是经典程序的!.近来,在网上发现了一个链接: ,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。这篇文章提到的程序,一直也没有找到,也难辩真假。 这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。比如说文中提到的:

“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。 .下面说说做而论道的编程思路。;----------------------------------------------------------------------- ;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。 ;那么可以写成: ; n = [b15 ~ b0] ;把16位数分解成高8位、低8位来写,也是常见的形式: ; n = [b15~b8] * 256 + [b7~b0] ;那么,写成下列形式,也就可以理解了: ; n = [b15~b12] * 4096 + [b11~b0] ;式中高4位[b15~b12]取值范围为0~15,代表了4096的个数; ;上式可以变形为: ; n = [b15~b12] * 4000 + {[b15~b12] * (100 - 4) + [b11~b0]} ;用x代表[b15~b12],有: ; n =x * 4000 + {x * (100 - 4) + [b11~b0]} ;即: ; n =4*x (千位) + x (百位) + [b11~b0] - 4*x ;写到这里,就可以看出一点BCD码变换的意思来了。 ;;上式中后面的位:

(最新版)基于51单片机汇编语言的数字钟课程设计报告含有闹钟万毕业论文

单片微型计算机课程设计报告 多功能电子数字钟 姓 名 学

教师 许伟敏 电气二班 林卫

目录 一:概述 (1) 二:设计基本原理简介 (2) 三:设计要求及说明 (3) 四:整体设计方案 (4) 系统硬件电路设计 4 系统软件总流程设计模块划分及分析5 6 五:单模块流程设计 (8) 各模块设计概述、流程图模块源程序集合及注释8 13 六:单模块软件测试 (23) 七:系统检测调试 (24) 硬件电路调试 软件部分烧写调试 八:系统优化及拓展 (26) 九:心得体会 (28)

单片微型计算机课程设计 一、概述 基于汇编语言的电子数字钟概述 课程设计题目:电子数字钟 应用知识简介: ● 51 单片机 单片机又称单片微控制器,它不是完成某一个逻辑功能 的芯片,而是把一个计算机系统集成到一个芯片上。作为嵌 入式系统控制核心的单片机具有其体积小、功能全、性价比高等诸多优点。51 系列单片机是国内目前应用最广泛的单片机之一,随着嵌入式系统、片上系统等概念的提出和普遍接受及应用,51 系列单片机的发展又进入了一个新的阶段。在今后很长一段时间内51 系列单片机仍将占据嵌入式系统产品的中低端市场。 ●汇编语言 汇编语言是一种面向机器的计算机低级编程语言,通常是为特定的计算机或系列计算机专门设计的。汇编语言保持了机器语言的优点,具有直接和简捷的特点,其代码具有效率高实时性强等优点。但是对于复杂的运算或大型程序,用汇编语言编写将非常耗时。汇编语言可以与高级语言配合使用,应用十分广泛。 ● ISP ISP(In-System Programming)在系统可编程, 是当今流行的单片机编程模式,指电路板上的空白元器 件可以编程写入最终用户代码,而不需要从电路板上取 下元器件。已经编程的器件也可以用ISP方式擦除或再 编程。本次课程设计便使用ISP方式,直接将编写好的 程序下载到连接好的单片机中进行调试。 选题 系统功能分析 硬件电路设计 整体流程设计 及模块划分 模块流程设计 模块编 码测试 系统合成调 试编译 下载调试(含硬件电路调试及软件烧写调试) 验收 完成总结报告课程设计流程图↑ 选题目的及设计思想简介: 课程设计是一次难得的对所学的知识进行实践的机会,我希望通过课程设计独立设计一个简单的系统从而达到强化课本知识并灵活运用的目的。电子数字钟是日常生活钟随处可见的简单系统。对电子数字钟的设计比较容易联系实际并进行拓展,在设计中我将力求尽可能跳出课本的样板,从现实生活中寻找设计原型和设计思路,争取有所突破。 如图所示便是我本次课程设计流程图,设计的整个过程运用自顶向下分析、自底向上实现的

51单片机实用汇编程序库(word)

51 单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0 口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH DJNZ R1,$ RET

五、定时器功能实例 5.1 定时1 秒报警 程序介绍:定时器1 每隔1 秒钟将p1.o 的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0 入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50 个 0.2 秒,即50*0.2=1 秒 MOV TMOD,#00000001B;定时器0 工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 11 SETB EA ;开总中断 SETB ET0 ;开定时器0 中断允许 SETB TR0 ;开定时0 运行 SETB P1.0 LOOP: AJMP LOOP DIN0: ;是否到一秒//////////////////////////////////////// INCC: INC TFLAG MOV A,TFLAG CJNE A,#20,RE MOV TFLAG,#00H CPL P1.0 ;////////////////////////////////////////////////// RE: MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 RETI END 5.2 频率输出公式 介绍:f=1/t s51 使用12M 晶振,一个周期是1 微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 的频率为例: 200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电

51单片机中的汇编语言与C语言.

51单片机中的汇编语言与 C 语言 C 语言, 更多的是为了掌握单片机的应用, C 语言是高效的应用程序开发工具, 与汇编语言比却不是开发高效应用程序的工具。就目前而言, 更多的是为了应用单片机, 开发应用程序, 更多的是强调开发效率, 而不是程序的运行效率 (相对而言。再就是应用程序对单片机内部资源的使用效率, 这在过去, 单片机内部资源紧缺的年代, 特别的强调, 现在已经不是特别重要了。所以, 大多数人都认为,只用 C 语言,就可以应对大多数单片机的应用开发了。 其实,汇编语言跟 C 语言在本质上一样的,只是语言形式不同而已,一个接近底层逻辑, 一个接近人类语言, 本质上都是对寄存器或存储器的读写操作而已。 汇编语言中,用 MOV 来回传送数据, C 语言里,用等号表示数据传送。汇编语言中,用 call 转去执行子过程程序, C 语言里,用个函数名调用子程序。汇编语言中,用 JMP 完成分支转移, C 语言里用 if 、 switch 、 while 、 for 来判断跳转。汇编语言跟 C 一样可以给寄存器指定命名,然后对定义的名称进行操作。汇编语言提供了对很多标志位的操作, C51根据需要也进行了改进, C 语言可以通过 #include给存储器命名来简化操作。 我觉得, C 语言是最接近汇编语言的一种高级语言, 要说不同, 也许具有大量函数的函数库,是 C 语言与汇编语言的最大区别,也是 C 语言比汇编语言有更大开发效率的原因。 在应用汇编语言进行应用程序开发时, 如果精心规划好程序结构, 设计好各种数据结构、子程序、中断程序,积累大量的算法程序(相当于函数库,也可以高效率的用汇编语言进行单片机开发。倒是兼容性、可移植性是汇编语言的最大限制,因为不同单片机有不同的指令系统,而 C 语言把这个问题,交给了机器也就是编译器去解决了。其实, 计算机的发展, 就是把尽可能多的事情交个机器去解决。

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 长转移类指令

单片机控制系统汇编程序

; step motor control ; ASM for MCS51 mode equ 082h contrl equ 08003h ctl equ 08000h ;8255接口芯片PA口的地址值 Astep equ 01h ;对A相通电,PA口的赋值 Bstep equ 02h ;对B相通电,PA口的赋值 Cstep equ 04h ;对C相通电,PA口的赋值 Dstep equ 08h ;对D相通电,PA口的赋值 dly_c equ 10h ;启动初值(加速度)寄存器 sd1 equ 80 ;0--255 加速度初值:值越小,加速越快 sd2 equ 40 ;

51单片机经典编辑流水灯汇编程序

单片机流水灯汇编程序设计 流水灯汇编程序 8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。 ;用最直接的方式实现流水灯 ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY ;延时1秒 MOV P1,#10111111B ;最下面第二个的LED点亮 LCALL DELAY ;延时1秒 MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#11101111B LCALL DELAY MOV P1,#11110111B LCALL DELAY MOV P1,#11111011B LCALL DELAY MOV P1,#11111101B LCALL DELAY MOV P1,#11111110B LCALL DELAY MOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒 AJMP START ;反复循环 ;延时子程序,12M晶振延时约250毫秒 DELAY: ;大约值:2us*256*256*2=260ms,也可以认为为250ms PUSH PSW ;现场保护指令(有时可以不加) MOV R4,#2 L3: MOV R2 ,#00H L1: MOV R3 ,#00H L2: DJNZ R3 ,L2 ;最内层循环:(256次)2个周期指令(R3减一,如果比1大,则转向L2) DJNZ R2 ,L1 ; 中层循环:256次 DJNZ R4 ,L3 ;外层循环:2次 POP PSW RET END

51单片机汇编程序集(二) 2008年12月12日星期五 10:27 辛普生积分程序 内部RAM数据排序程序(升序) 外部RAM数据排序程序(升序) 外部RAM浮点数排序程序(升序) BCD小数转换为二进制小数(2位) BCD小数转换为二进制小数(N位) BCD整数转换为二进制整数(1位) BCD整数转换为二进制整数(2位) BCD整数转换为二进制整数(3位) BCD整数转换为二进制整数(N位) 二进制小数(2位)转换为十进制小数(分离BCD码) 二进制小数(M位)转换为十进制小数(分离BCD码) 二进制整数(2位)转换为十进制整数(分离BCD码) 二进制整数(2位)转换为十进制整数(组合BCD码) 二进制整数(3位)转换为十进制整数(分离BCD码) 二进制整数(3位)转换为十进制整数(组合BCD码) 二进制整数(M位)转换为十进制整数(组合BCD码) 三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7 ;二进制整数(2位)转换为十进制整数(分离BCD码) ;入口: R3,R4 ;占用资源: ACC,R2,NDIV31 ;堆栈需求: 5字节 ;出口: R0,NCNT IBTD21 : MOV NCNT,#00H MOV R2,#00H IBD211 : MOV R7,#0AH LCALL NDIV31 MOV A,R7 MOV @R0,A INC R0 INC NCNT MOV A,R3 ORL A,R4 JNZ IBD211 MOV A,R0 CLR C SUBB A,NCNT MOV R0,A RET ;二进制整数(2位)转换为十进制整数(组合BCD码) ;入口: R3,R4 ;占用资源: ACC,B,R7 ;堆栈需求: 3字节

51单片机汇编语言教程:28课音乐程序设计

51单片机汇编语言教程:第28课-音乐程序设计

下面给出程序序清单,可直接在TD-III型学习机上演奏,对其它不一样型号的学习机,只需对应地改变一下地址即可。本程序演奏的是民歌“八月桂花遍地开”,C调,节奏为94拍/分。读者也能自行找出一首歌,按表1和表2给定的常数,将乐曲翻译成码表输入机器,而程序不变。本实验办法简便,即使不懂音乐的人,将一首陌生的曲子翻译成代码也是易事,和着机器的演奏学唱一首歌曲,其趣味无穷。 程序清单(略,请参看源程序的说明)。 程序框图如图2所示。 <单片机音乐程序的设计图> 本课由单片机教程网提供,有问题指出. 硬件连接说明: 随便找一个仿真机或者什么单片机实验板,只要能工作的就行,将程序输入,运行,然后找个音箱(你计算机旁边应当就有一对吧)拨出插头,插头的前端接在P1。0上,后面部分找根线接单片机的地,就应当有声了,然后怎么改进硬件连接就是你的事了。。。。 音乐程序汇编代码代码1-------------Voice.asm--------------------------ORG0000H

LJMP START ORG000BH INC20H;中断服务,中断计数器加1 MOV TH0,#0D8H MOV TL0,#0EFH;12M晶振,形成10毫秒中断 RETI START: MOV SP,#50H MOV TH0,#0D8H MOV TL0,#0EFH MOV TMOD,#01H MOV IE,#82H MUSIC0: NOP MOV DPTR,#DAT;表头地址送DPTR MOV20H,#00H;中断计数器清0 MOV B,#00H;表序号清0 MUSIC1: NOP CLR A MOVC A,@A+DPTR;查表取代码 JZ END0;是00H,则结束 CJNE A,#0FFH,MUSIC5 LJMP MUSIC3 MUSIC5: NOP MOV R6,A INC DPTR MOV A,B MOVC A,@A+DPTR;取节拍代码送R7

最经典的51单片机经典流水灯汇编程序

单片机流水灯汇编程序设计 开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。 程序A: ;用最直接的方式实现流水灯 ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY;延时1秒 MOV P1,#10111111B ;最下面第二个的LED点亮 LCALL DELAY;延时1秒 MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#11101111B LCALL DELAY MOV P1,#11110111B LCALL DELAY MOV P1,#11111011B LCALL DELAY MOV P1,#11111101B LCALL DELAY MOV P1,#11111110B LCALL DELAY MOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒 AJMP START ;反复循环 ;延时子程序,12M晶振延时约250毫秒 DELAY: MOV R4,#2 L3: MOV R2 ,#250 L1: MOV R3 ,#250 L2: DJNZ R3 ,L2 DJNZ R2 ,L1 DJNZ R4 ,L3 RET END 程序B: ;用移位方式实现流水灯

ajmp main ;跳转到主程序 org 0030h ;主程序起始地址 main: mov a,#0feh ;给A赋值成11111110 loop: mov p1,a ;将A送到P1口,发光二极管低电平点亮 lcall delay ;调用延时子程序 rl a ;累加器A循环左移一位 ajmp loop ;重新送P1显示 delay: mov r3,#20 ;最外层循环二十次 d1: mov r4,#80 ;次外层循环八十次 d2: mov r5,#250 ;最内层循环250次 djnz r5,$ ;总共延时2us*250*80*20=0.8S djnz r4,d2 djnz r3,d1 ret end 51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。 ORG 0 ;程序从0地址开始 START: MOV A,#0FEH ;让ACC的内容为11111110 LOOP: MOV P2,A ;让P2口输出ACC的内容 RR A ;让ACC的内容左移 CALL DELAY ;调用延时子程序 LJMP LOOP ;跳到LOOP处执行 ;0.1秒延时子程序(12MHz晶振)=================== DELAY: MOV R7,#200 ;R7寄存器加载200次数 D1: MOV R6,#250 ;R6寄存器加载250次数 DJNZ R6,$ ;本行执行R6次 DJNZ R7,D1 ;D1循环执行R7次 RET ;返回主程序

#第3章-MCS-51系列单片机的指令系统和汇编语言程序

第3章MCS一51系列单片机的指令系统 和汇编语言程序 3·1汇编指令 3·1·1请阐明机器语言、汇编语言、高级语言三者的主要区别,进一步说明为什么这三种语言缺一不可。 3·1·2请总结: (1)汇编语言程序的优缺点和适用场合。 (2)学习微机原理课程时,为什么一定要学汇编语言程序? 3·1·3MCS一51系列单片机的寻址方式有哪儿种?请列表分析各种寻址方式的访问对象和寻址范围。 3·1·4要访问片内RAM,可有哪几种寻址方式? 3·1·5要访问片外RAM,有哪几种寻址方式? 3·1·6要访问ROM,又有哪几种寻址方式? 3·1·7试按寻址方式对MCS一51系列单片机的各指令重新进行归类(一般根据源操作数寻址方式归类,程序转移类指令例外)。 3·1·8试分别针对51子系列和52子系列,说明MOV A,direct指令和MOV A,@Rj 指令的访问范围。 3·1·9传送类指令中哪几个小类是访问RAM的?哪几个小类是访问ROM的?为什么访问ROM的指令那么少?CPU访问ROM多不多?什么时候需要访问ROM? 3·1·10试绘图示明MCS一51系列单片机数据传送类指令可满足的各种传送关系。3·1·11请选用指令,分别达到下列操作: (1)将累加器内容送工作寄存器R6. (2)将累加器内容送片内RAM的7BH单元。 (3)将累加器内容送片外RAM的7BH单元。 (4)将累加器内容送片外RAM的007BH单元。 (5)将ROM007BH单元内容送累加器。 3·1·12 区分下列指令的不同功能: (l)MOV A,#24H 和MOV A.24H (2)MOV A,R0和MOV A,@R0 (3)MOV A,@R0和MOVX A,@R0 3·1·13设片内RAM 30H单元的内容为40H; 片内RAM 40H单元的内容为l0H; 片内RAM l0H单元的内容为00H; (Pl)=0CAH。 请写出下列各指令的机器码和执行下列指令后的结果(指各有关寄存器、RAM单元和端口的内容)。 MOV R0,#30H MOV A,@R0 MOV RI,A MOV B,@Rl MOV @R0,Pl MOV P3,Pl MOV l0H,#20H MOV 30H,l0H

单片机汇编语言经典一百例

51单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY:

MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH

DJNZ R1,$ RET END 五、定时器功能实例 5.1 定时1秒报警 程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50个 0.2秒,即50*0.2=1秒 MOV TMOD,#00000001B;定时器0工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05秒,定时 20次则一秒 11 SETB EA ;开总中断

快速入门单片机大全语言

快速入门单片机汇编语言 简要: 单片机有通用型和专用型之分。专用型是厂家为固定程序的执行专门开发研制的一种单片机,其程序不可更改。通用型单片机是常用的一种供学习或自主编制程序的单片机,其程序需要自己写入,可更改。单片机根据其基本操作处理位数不同可以分为:1位、4位、8位、16、32位单片机。 正文: 在此我们主要讲解美国ATMEL公司的89C51单片机。 一、89C51单片机PDIP(双列直插式)封装引脚图: 其引脚功能如下: P0口(—):为双向三态口,可以作为输入/输出口。但在实际应用中通常作为地址/数据总线口,即为低8位地址/数据总线分时复用。低8位地址在ALE信号的负跳变锁存到外部地址锁存器中,而高8位地址由P2口输出。 P1口(—):其每一位都能作为可编程的输入或输出线。 P2口(—):每一位也都可作为输入或输出线用,当扩展系统外设时,可作为扩展系统的地址总线高8位,与P0口一起组成16位地址总线。对89c51单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连。 P3口(—):其为双功能口,作为第一功能使用时,其功能与P1口相同。当作为第二功能使用时,每一位功能如下表所示。 XTAL1(xtal2):外接晶振一脚,分别接晶振的一端。 Gnd:电源地。 Vcc:电源正级,接+5V。 PROG\ALE:地址锁存控制端 PSEN:片外程序存储器读选通信号输出端,低电平有效。 EA\vpp:访问外部程序储存器控制信号,低电平有效。当EA为高电平时访问片内存储器,若超出范围则自动访问外部程序存储器。当EA为低电平时只访问外部程序存储器。 二、常用指令及其格式介绍: 1、指令格式:

51单片机汇编语言教程

51单片机汇编语言教程:1课:单片机简叙 1、什么是单片机一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如A/D,D/A等。 单片机是一种控制芯片,一个微型的计算机,而加上晶振,存储器,地址锁存器,逻辑门,七段译码器(显示器),按钮(类似键盘),扩展芯片,接口等那是单片机系统。 天!PC中的CPU一块就要卖几千块钱,这么多东西做在一起,还不得买个天价!再说这块芯片也得非常大了。 不,价格并不高,从几元人民币到几十元人民币,体积也不大,一般用40脚封装,当然功能多一些单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,有的甚至只8只引脚。 为什么会这样呢? 功能有强弱,打个比方,市场上面有的组合音响一套才卖几百块钱,可是有的一台功放机就要卖好几千。另外这种芯片的生产量很大,技术也很成熟,51系列的单片机已经做了十几年,所以价格就低了。 既然如此,单片机的功能肯定不强,干吗要学它呢? 话不能这样说,实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用PIII?应用的关键是看是否够用,是否有很好的性能价格比。所以8051出来十多年,依然没有被淘汰,还在不断的发展中。 2、MCS51单片机和8051、8031、89C51等的关系 更多单片机学习资料请来https://www.360docs.net/doc/5815226814.html, 我们平常老是讲8051,又有什么8031,现在又有89C51,89s51它们之间究竟是什么关系? MCS51是指由美国INTEL公司(对了,就是大名鼎鼎的INTEL)生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS51系列单片机,而8031是前些年在我国最流行的单片机,所以很多场合会看到8031的名称。INTEL公司将MCS51的核心技术授权给了很多其它公司,所以有很多公

LCD1602-51单片机汇编程序.

1602汇编程序, 51单片机汇编程序,仅需修改引脚定义即可。晶振大小 12M ,程序测试完全正确。内部包含写数据、写命令(包括读忙和不读忙、初始化等子函数。调用时先给 LCD_DAT赋值,给出需要写入的数据或命令,然后调用。 ; 端口引脚定义区 LCD_RS BIT P2.4 ;1602数据命令选择端口 LCD_RW BIT P2.5 ;1602读写选择端口 LCD_EN BIT P2.6 ;1602使能端口 LCD_DATA EQU P0 ;1602数据端口 ; 变量声明区 ALL_FLAG EQU 20H ; 标志位 LCD_FLAG EQU ALL_FLAG.7 ;1602读忙标志位 LCD_DAT EQU 30H ;1602数据命令字 DELAYED EQU 31H ; 延时字 /***************************************** 1602读命令函数,高位存至 LCD_LAG中 *****************************************/ LCD_R_DATA: MOV LCD_DATA,#0FFH LCD_BUSY: CLR LCD_RS

SETB L CD_RW NOP SETB L CD_EN NOP MOV Acc,LCD_DATA MOV C,Acc.7 MOV LCD_FLAG,C CLR LCD_EN NOP JB LCD_FLAG,LCD_BUSY RET /***************************************** 1602写数据函数,数据存在 LCD_DAT *****************************************/ LCD_W_DATA: LCALL LCD_R_DATA SETB L CD_RS CLR LCD_RW NOP

51单片机串行口汇编语言教程

51单片机汇编语言教程:22课:单片机串行口通信程序设计 1.串行口方式0应用编程8051单片机串行口方式0为移位寄存器方式,外接一个串入并出的移位寄存器,就能扩展一个并行口。 <单片机串行口通信程序设计硬件连接图> 例:用8051单片机串行口外接CD4094扩展8位并行输出口,如图所示,8位并行口的各位都接一个发光二极管,要求发光管呈流水灯状态。串行口方式0的数据传送可采用中断方式,也可采用查询方式,无论哪种方式,都要借助于TI或RI标志。串行发送时,能靠TI置位(发完一帧数据后)引起中断申请,在中断服务程序中发送下一帧数据,或者通过查询TI的状态,只要TI为0就继续查询,TI为1就结束查询,发送下一帧数据。在串行接收时,则由RI引起中断或对RI查询来确定何时接收下一帧数据。无论采用什么方式,在开始通信之前,都要先对控制寄存器SCON进行初始化。在方式0中将,将00H送SCON 就能了。 -----------------单片机串行口通信程序设计列子-------------------------- ORG 2000H START: MOV SCON,#00H ;置串行口工作方式0 MOV A,#80H ;最高位灯先亮 CLR P1.0 ;关闭并行输出(避象传输过程中,各LED的"暗红"现象) OUT0: MOV SBUF,A ;开始串行输出 OUT1: JNB TI,OUT1 ;输出完否 CLR TI ;完了,清TI标志,以备下次发送 SETB P1.0 ;打开并行口输出 ACALL DELAY ;延时一段时间 RR A ;循环右移 CLR P1.0 ;关闭并行输出 JMP OUT0 ;循环 说明:DELAY延时子程序能用前面我们讲P1口流水灯时用的延时子程序,这里就不给出

51单片机汇编语言教程:4课第一个单片机小程序

51单片机汇编语言教程:第4课-第一个单片机小程序 (基于HJ-1G、HJ-3G实验板) 上一次我们的程序实在是没什么用,要灯亮还要重写一下片子,下面我们要让灯持续地闪烁,这就有一定的实用价值了,比如能把它当成汽车上的一个信号灯用了。怎样才能让灯持续地闪烁呢?实际上就是要灯亮一段时间,再灭一段时间,也就是说要P10持续地输出高和低电平。怎样实现这个要求呢?请考虑用下面的指令是否可行: SETB P10 CLR P10…… 这是不行的,有两个问题,第一,计算机执行指令的时间很快,执行完SETB P10后,灯是灭了,但在极短时间(微秒级)后,计算机又执行了CLR P10指令,灯又亮了,所以根本分辨不出灯曾灭过。第二,在执行完CLR P10后,不会再去执行SETB P10指令,所以以后再也没有机会让灭了。 为了解决这两个问题,我们能做如下设想,第一,在执行完SETB P10后,延时一段时间(几秒或零点几秒)再执行第二条指令,就能分辨出灯曾灭过了。第二在执行完第二条指令后,让计算机再去执行第一条指令,持续地在原地兜圈,我们称之为循环,这样就能完成任务了。 以下先给出程序(后面括号中的数字是为了便于讲解而写的,实际不用输入): ;主程序: LOOP:SETB P10;(1) LCALL DELAY;(2) CLR P10;(3) LCALL DELAY;(4) AJMP LOOP;(5) ;以下子程序 DELAY:MOV R7,#250;(6) D1:MOV R6,#250;(7) D2:DJNZ R6,D2;(8) DJNZ R7,D1;(9) RET;(10) END;(11) 按上面的设想分析一下前面的五条指令。 第一条是让灯灭,第二条应当是延时,第三条是让灯亮,第四条和第二条一模一样,也是延时,第五条应当是转去执行第一条指令。第二和第四条实现的原理稍后谈,先看第五条,LJMP是一条指令,意思是转移,往什么地方转移呢?后面跟的是LOOP,看一下,什么地方还有LOOP,对了,在第一条指令的前面有一个LOOP,所以很直观地,我们能认识到,它要转到第一条指令处。这个第一条指令前面的LOOP被称之为标号,它的用途就是给这一行起一个名字,便于使用。是否一定要给它起名叫LOOP呢?当然不是,起什么名字,完全由编程序的人决定,能称它为A,X等等,当然,这个时候,第五条指令LJMP后面的名字也得跟着改了。 第二条和第四条指令的用途是延时,它是怎样实现的呢?指令的形式是LCALL,这条指令称为调用子程序指令,看一下指令后面跟的是什么,DELAY,找一下DELAY,在第六条指令的前面,显然,这也是一个标号。这条指令的作用是这样的:当执行LCALL指令时,程序就转到LCALL后面的标号所标定的程序处执行,如果在执行指令的过程中遇到RET指令,则

用51单片机控制交通灯汇编语言编写

基于51单片机的交通灯控制系统设计 摘要:在日常生活中,交通信号灯的使用,市交通得以有效管理,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。交通灯控制系统由80C51单片机、键盘、LED 显示、交通灯延时组成。系统除具有基本交通灯功能外,还具有时间设置、LED信息显示功能,市交通实现有效控制。 关键词:交通灯,单片机,自动控制 一引言 当今,红绿灯安装在个个道口上,已经成为疏导交通车辆最常见和最有效的手段。但这个技术在19世纪就已经出现了。 1858年,在英国伦敦主要街头安装了以燃煤气为光源的红、蓝两色的机械般手势信号灯,用以指挥马车通行。这是世界上最早的交通信号灯。1868年,英国机械工程师纳伊特在伦敦威斯敏斯特区的会议大厦前的广场上,安装了世界上最早的煤气红绿灯。它由红绿两以旋转方式玻璃提灯组成,红色表示“停止”,绿色表示“注意”。1869年1月2日,煤气灯爆炸,是警察受伤,遂被取消! 电气启动的红绿灯出现在美国,这种红绿灯由红黄绿三色圆形的投光器组成,1914年始装于纽约市5号大街的一座高塔上。红灯亮表示“停止”,绿灯亮表示“通行”。 信号灯的出现,使得交通得以有效的管理,对于疏导交通流量、提高道路通行能力、减少交通事故有明显效果。1968年,联合国《道路交通和道路标志信号协定》对各种信号灯的含义作了规定。绿灯时通行信号灯,面对绿灯的车辆可以直行,左转弯和右转弯,除非两一种标志禁止某一种转向。左右转弯车辆必需让合法的正在路口内行驶的车辆和过人行横线的行人优先通行。红灯是禁行信号灯,面对红灯的车辆必需在交叉路口的停车线后停车。黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已经十分接近停车线而不能安全停车的可以进入交叉路口! 二概要设计 2.1 设计思路 利用单片机实现交通灯的控制,该任务分以下几个方面: a 实现红、绿、黄灯的循环控制。要实现此功能需要表示三种不同颜色的LED灯分别接在P1个管脚,用软件实现。 b 用数码管显示倒计时。可以利用动态显示或静态显示,串行并出或者并行并出实现。 C 实现急通车。这需要人工实现,编程时利用到中断才能带到目的,只要有按钮按下,那么四个方向全部显示红灯,禁止以诶车辆通行。当情况解除,让时间回到只能隔断处继续进行。 2.2总体设计框图 见图一:

相关文档
最新文档