单片机原理及应用胡乾斌第四章

上传人:鲁** 文档编号:589872191 上传时间:2024-09-11 格式:PPT 页数:65 大小:612KB
返回 下载 相关 举报
单片机原理及应用胡乾斌第四章_第1页
第1页 / 共65页
单片机原理及应用胡乾斌第四章_第2页
第2页 / 共65页
单片机原理及应用胡乾斌第四章_第3页
第3页 / 共65页
单片机原理及应用胡乾斌第四章_第4页
第4页 / 共65页
单片机原理及应用胡乾斌第四章_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《单片机原理及应用胡乾斌第四章》由会员分享,可在线阅读,更多相关《单片机原理及应用胡乾斌第四章(65页珍藏版)》请在金锄头文库上搜索。

1、第四章第四章 汇编语言程序设计汇编语言程序设计 4.1 汇编语言的基本概念汇编语言的基本概念 4.2 顺序程序设计顺序程序设计 4.3 分支程序设计分支程序设计 4.4 循环程序设计循环程序设计 4.5 查表程序查表程序 4.6 子程序子程序4.1 汇编语言的基本概念汇编语言的基本概念4.1.1 计算机语言计算机语言 程序是计算某一算式或完成某一工作的若干指令的有程序是计算某一算式或完成某一工作的若干指令的有序集合。目前,用于程序设计的语言可分为三种;序集合。目前,用于程序设计的语言可分为三种;机器语机器语言、汇编语言和高级语言。言、汇编语言和高级语言。一一一一、机器语言机器语言机器语言机器语

2、言 在计算机中,所有的数符都是用二进制代码来表示的,在计算机中,所有的数符都是用二进制代码来表示的,指令也是用二进制代码来表示。这种指令也是用二进制代码来表示。这种用二进制代码表示的用二进制代码表示的指令系统称为机器语言系统,简称为机器语言指令系统称为机器语言系统,简称为机器语言。直接用机。直接用机器语言编写的程序称为手编程序或机器语言程序。器语言编写的程序称为手编程序或机器语言程序。 1. 指令容易理解、记忆,用汇编语言编写的程序可读性好。指令容易理解、记忆,用汇编语言编写的程序可读性好。 2. 汇编语言指令与机器语言指令一一对应,用它编写的程序能汇编语言指令与机器语言指令一一对应,用它编写

3、的程序能最有效地利用存储空间。最有效地利用存储空间。 3. 指令直接访问指令直接访问CPU的寄存器、存储单元和的寄存器、存储单元和I/O端口,可以充端口,可以充分发挥分发挥CPU的功能,满足实时控制的要求。的功能,满足实时控制的要求。 4. 汇编语言是面向机器的语言,对使用者来说,必须对机器的汇编语言是面向机器的语言,对使用者来说,必须对机器的硬件结构、指令系统都要熟悉,所以掌握起来不太容易。此外,硬件结构、指令系统都要熟悉,所以掌握起来不太容易。此外,汇编语言程序的通用性差,程序不能移值。汇编语言程序的通用性差,程序不能移值。二二、汇编语言汇编语言 汇编语言是一种符号。在汇编语言中,汇编语言

4、是一种符号。在汇编语言中,指令用助记符表示,指令用助记符表示,地址地址、操作数可用标号操作数可用标号、符号地址及字符等形式来描述符号地址及字符等形式来描述。汇编语。汇编语言有以下特点:言有以下特点:几个与汇编语言相关的术语:几个与汇编语言相关的术语: 汇编语言源程序:用汇编语言编写的程序称为汇编语言源程汇编语言源程序:用汇编语言编写的程序称为汇编语言源程序,简称源程序。序,简称源程序。 汇编汇编(过程过程):将汇编语言源程序翻译成机器码目标程序的过:将汇编语言源程序翻译成机器码目标程序的过程,称为汇编过程,或简称汇编。程,称为汇编过程,或简称汇编。 手工汇编与机器汇编:前者是指人工进行汇编手工

5、汇编与机器汇编:前者是指人工进行汇编;后者是指由计后者是指由计算机进行汇编。算机进行汇编。 汇编程序:它是计算机的系统软件之一,用于把汇编语言源汇编程序:它是计算机的系统软件之一,用于把汇编语言源程序翻译成目标程序,它的功能如图所示。程序翻译成目标程序,它的功能如图所示。汇编语言源程序汇编程序目标程序源程序列表三、高级语言三、高级语言 高级语言是以接近于人的常用语言形式编写程序的语言总称,它是一种面向过程而独立于机器的通用语言。不依赖于计算机的结构和指令系统。用高级语言编写的源程序,必须经编译程序或解释程序进行翻译生成目标程序,机器才能执行。 高级语言的特点是简短、易学、易懂,编程快,具有通用

6、性,便于移值到不同机型。但是,高级语言的编译或解释程序使系统开销大,生成的目标程序占存储单元多,执行时间长。同时,目前用高级语言处理接口技术和中断技术还比较困难,所以,它不适合于实时控制。 综上所述,三种语言各有特点,采用何种程序设计语言,这取决于机器的使用场合和条件。在单片机应用中,一般使用汇编语言编写程序。因此,要想很好地掌握和应用单片机,就必须学会和掌握汇编语言。4.1.2 汇编语言的语句结构汇编语言的语句结构 一、汇编语言的指令类型一、汇编语言的指令类型 MCS-51单片机汇编语言,包含两类不同性质的指令。 1.基本指令:即指令系统中的指令。它们都是机器能够执行的指令。 2.伪指令:汇

7、编时用于控制汇编的指令。它们都是机器不能够执行的指令。二、汇编语言的语句格式二、汇编语言的语句格式 汇编语言源程序是由汇编语句(即指令)组成的,汇编语句一般由四部分组成,每一部分称为一段。其典型的汇编语句格式如下: 标号:标号: 操作码操作码 操作数操作数 ;注释;注释以字母开头的1-8个字母或数字串指出指令操作的性质或控制要求指令操作的对象对源程序进行注释,说明程序段或关键指令的作用 例:START: MOV A,#30H ;A 30H 各段之间必须用定界符隔开,即在标号之后要加冒号“:”;在操作码与操作数之间要有空格间隔;在操作数内部要用逗号“,”将源操作数和目的操作数隔开;在注释段之前要

8、加一分号“;”,若注释较长,需要换行时,也必须以分号“;”开始,机器对分号后面的内容不进行汇编。1.标号段 标号是用户给指令语句设定的一个符号,在汇编产生目标程序时,汇编程将把标号所指的指令语句目标码首字节的存储单元地址值赋值给该标号,于是,标号便可作为地址或数据在其他语句的操作数段中引用。 标号是以字母开头的1-8个字母或数字串组成,汇编时,超过的部分被截断而无效。注意,不能使用指令助记符、伪指令或寄存器名来作标号,标号不能重复定义。标号是任选的,并非所有指令语句都要一个标号,只是在程序调用或转移指令所需的地方才设置标号。采用标号便于查找、记忆和修改程序。建议使用能说明程序段功能的标号。2.

9、操作码段 操作码指出指令操作的性质或控制要求,这是不可缺省的部分。该段可以是指令助记符或伪指令助记符。3.操作数段 操作数是指令操作的对象,它是参加操作的数或是操作数所在的地址。操作数有三种类型:立即数(8位或16位)、寄存器和地址。表示这些信息的方法有多种:寄存器名、二进制数(B)、十六进制数(H)、十进制数(D或无字尾)、PC现行值()、ASCII码( )、已赋值的符号名、指令的标号以及表达式。为了区分数字和字符串,规定凡数字必须以0-9开头,所以对十六进制数,在非0-9开头的数字前需要冠以数字0。例如:MOVA,#0A4H。4.注释段 对源程序进行注释,简明扼要地说明程序段或关键指令的作

10、用,一般只在程序关键处加注释。汇编时,对于注释部分不予理会。它不会被翻译成机器码;汇编后的程序清单将注释原样列出。注意:注释前必须加分号“;”,如果注释的内容超过一行,则换行后前面还要加上分号。另外,注释也可以从一行的最前面开始。413 伪指令 伪指令是非执行指令,只是在对源程序进行汇编的过程中起某种控制作用。例如,设置目标程序或数据存储区的起始地址,给程序分配一定的存储单元、定义符号、判断源程序是否结束等。伪指令汇编后不产生目标代码,它不影响程序的执行,所以有伪指令之称。常用的伪指令如下。一、一、ORG (Origin) ORG是起点,用来设定程序或数据存储区的起始地址。它的格式如下: OR

11、G 16位地址位地址 例如: ORG 2000H START:MOV A,#40H 上例说明程序的起始地址是2000H,若ORG指令不带操作数,则汇编后目标程序的起始地址为0000H。二、二、END END是汇编语言源程序结束的伪指令,表示源程序结束。在END以后所写的指令,汇编程序都不予处理。一个源程序只能有一个END指令,放在程序的末尾。三三、EQU(Equate) EQU是赋值(或等值)指令。他的作用是,把操作数段中的地址或数据赋值给标号。经赋值后的标号,其值在整个程序中不改变,且可多次使用。它的格式如下: 标号(字符名称)标号(字符名称) EQU 数或汇编符号数或汇编符号 注意,标号与

12、EQU之间不能用“:”来作分隔符。例如,COUNT EQU 16H ;COUNT=16H ADDR EQU 3000H ;ADDR=3000H MOV A,COUNT ;A (16H)注意,使用EQU指令时,必须先赋值,后使用;而不能先使用,后赋值。四、四、DB (Define Byte) DB是定义字节数据。它的作用是,从指定的地址单元开始,定义(存储)若干个字节的数据或ASCII码字符,常用于定义数据常数表。它的格式如下: 标号:标号: DB 字节常数表字节常数表 其中方括号的内容是任选项。 例如,ORG 2000H TAB:DB 14H,26,A DB 0AFH,BC 汇编结果: (20

13、00H)=14H (2001H)=1AH (2002H)=41H (2003H)=AFH (2004H)=42H (2005H)=43H 五、五、DW (Define Word) DW定义字数据。它的功能是,从指定的地址单元开始,定义(存储)若干个字数据,常用于定义地址表。它的格式如下: 标号:标号: DW 字常数表字常数表 一个字占两个存储单元,其中高字节数存入低位地址,低字节数存入高位地址,即顺序存放。 例如,ORG 2000H TAB:DW 7423H,00ABH,20 汇编结果: (2000H)=74H (2001H)=23H (2002H)=00H (2003H)=ABH (2004

14、H)=00H (2005H)=14H六、六、DS(Define Store) DS是定义存储区。它的功能是,从指定的地址开始,保留一定数量的内存单元,以备程序使用。其区域的大小由指令的操作数确定。它的格式如下:标号:标号: DS 表达式表达式其中,表达式一般是数值,即要保留的内存单元个数。例如, ORG 1000H DS 5 DB 23H 汇编结果:从地址1000H开始,保留5个字节的内存单元,而(1005H)=23H。七、七、BIT BIT是位地址符号指令。它的作用是,把位地址赋予给所规定的字符名称,常用于定义位符号地址。其格式如下: 字符名称字符名称 BIT 位地址位地址 例如, AA B

15、IT P1.0 BB BIT P2.0 汇编后,把位地址P1.0 P2.0分别赋给变量AA和BB,在程序中它们就是位地址了。八、八、DATA DATA是数据地址赋值指令。它的功能是,将数据地址或代码地址赋予给所规定的字符名称。其格式如下: 字符名称字符名称 DATA 表达式表达式 例如, MN DATA 1000H 汇编后,MN的值为1000H。 伪指令DATA与EQU的主要区别在于:用DATA定义的标识符在汇编时作为标号登记在符号表中,所以可以先使用后定义,而EQU定义的标识符在汇编时不登记在符号表中,因此必须先定义后使用。DATA指令在程序中常用来定义数据地址。413 汇编语言源程序编辑与

16、汇编汇编语言源程序编辑与汇编 一、手工编程和汇编二、机器编辑和汇编4.2 顺序程序顺序程序 一、程序设计的一般步骤 1.分析问题:熟悉和明确要求,建立数学模型。 2.确定算法:根据实际问题的要求和指令系统的特点,选择解决问题的方法。 3.设计程序流程图:程序流程图是程序结构的一种图解表示法,体现了程序设计思想,是把算法转化成程序的准备阶段。 4.分配内存单元:确定程序和数据区的起始地址。 5.编写汇编语言源程序:根据流程图和指令系统编写源程序。 6.调试程序:源程序编制好以后,必须上机调试。先将源程序通过汇编生成目标程序,并消除语法错误;然后在实用系统上进行联调修改,直至达到预定的要求。端点框

17、 ;表示程序的起点和终点 处理框 ;表示处理功能判断框 ;表示判断功能,框内标 明检测条件 子程序框 ;表示调用子程序连接符 ;表示程序框的连接点流程线 ;表示程序的走向二、顺序程序二、顺序程序 顺序程序(又称简单程序)是一种最简单、最基本的程序。顺序程序(又称简单程序)是一种最简单、最基本的程序。它的特点是,程序按编写的顺序依次往下执行每一条指令,直到它的特点是,程序按编写的顺序依次往下执行每一条指令,直到最后一条。这种程序虽然简单,但它是构成复杂程序的基础。最后一条。这种程序虽然简单,但它是构成复杂程序的基础。 例:将一个字节内的两位例:将一个字节内的两位BCD码拆开并转换成码拆开并转换成

18、ASCII码,存入码,存入RAM两个单元中。两个单元中。 解:设解:设BCD码在片内码在片内RAM 30H单元中,转换结果分别存入单元中,转换结果分别存入31H和和32H单元中,顺序存放。数字单元中,顺序存放。数字0-9的的ASCII码为码为30H39H。若将两位若将两位BCD码拆开分别放到另两个单元的低码拆开分别放到另两个单元的低4位中,然后再加位中,然后再加30H,即可实现即可实现BCD码到码到ASCII码的转换。程序流程图如图所示。码的转换。程序流程图如图所示。 ORG 2000HMOV R0,#32HMOV R0,#0 ; 32H单元清零MOV A,30H ; 取数XCHD A,R0

19、; 低位数存32HORL 32H,#30H ; 转换低位SWAP AORL A,#30H ; 高位转换MOV 31H,AEND开始(32H) 0A (30H)A (32H)低半字节(32H) (32H)+30H高低半字节交换A A+30(31H) A结束解:程序如下:解:程序如下:ORG 2000HMOV A,50H ;取一数的低位字节取一数的低位字节ADD A,60H ;两数低位字节相加两数低位字节相加DA A ; BCD码修正码修正MOV 40H,A ;存低位结果存低位结果MOV A, 51H ; 取一数的高位字节取一数的高位字节ADDC A,61H ; 两数高位字节相加两数高位字节相加D

20、A A ; BCD码修正码修正MOV 41H,A ; 存高位结果存高位结果例:设有两个例:设有两个4位位BCD码,分别存放在片内码,分别存放在片内RAM的的50H、51H单元单元和和60H、61H单元中。试编写求这两数之和的程序,结果存放到单元中。试编写求这两数之和的程序,结果存放到40H、41H单元中,数据逆序存放。单元中,数据逆序存放。每进行一次加法运算,需要进行一次BCD码调整高位低位 ORG 2000H MOV A,R7 ;取高位字节 JB ACC.7 ,NEG1 SJMP STOPNEG1:MOV A,R6 ;取低位字节 CPL A ;低位字节求补 ADD A ,#01H MOV R

21、6 ,A例:求16位二进制数的补码。设16位二进制数存放在R7、R6中,求补后存入R7、R6中。解:先判断该数的正负,正数补码等于原码,负数,二进制数的补码可用取反加1的方法求得,先低位字节变反加1,然后高位字节变反再加低位变补后的进位。程序如下: MOV A,R7 ;取高位字符 CPL A ;高位字节求补 ADDC A,#0 ORL A,#80H ;恢复负号 MOV R7,ASTOP:SJMP STOP ;暂停 END4.3 分支程序分支程序 利用条件转移指令形成不同的程序分支,这就是分支程序。分支程序有三种基本形式,如图所示。条件值?条件值?S0S1Sn01N图(a) 当条件满足时,执行程

22、序段S,条件不满足时,则跳过程序段。图(b) 是当条件满足时,执行程序段 S1;条件不满足时,则执行程序段S2。图(c) 是一种多向分支情况,根据给定或计算的K值,选择相应的分支。例:判例:判16位无符号数的大小。位无符号数的大小。设设MH、ML、NH、NL分别表示分别表示M、N两个无符号数的高两个无符号数的高8位和低位和低8位。如果位。如果MN,则转则转BIGI处理处理程序;否则,程序;否则,MN,转,转LESI处处理程序。(自学)理程序。(自学)MHNH?MN处理开 始A MHMH=NH?A MHML=NL?MLNL?MN处理结束 ORG 2000H MOV A, #MH CJNE A,#

23、NH, AA MOV A,#ML CJNE A, #NL, BB SJMP BIG1 ;M=N转BIG1AA: JNC BIG1 ; MN转BIG1 SJMP LES1 ; MN转LESIBB: JNC BIG1 ; MN转BIG1LES1: CLR PSW.5 ; MN,使F0=0 SJMP DONEBIG1: SETB PSW.5 ; MN,使F0=1DONE: SJMP DONE例:设数a在30H单元中,数b在31H单元中,试编写计算下式的程序: a+b (当b10时) Y= a-b (当b0时)Y= 0 (当x=0时) -1 (当x0?A -1A 1结束存结果 ORG 1000HVAR

24、 DATA 30HFUNC DATA 31H MOV A,VAR ;取X JZ COMP ;X=0,转COMP JNB ACC.7,POSI ;X0,转POSI MOV A,#0FFH ;X0,则-1 Y SJMP COMPPOSI: MOV A,#1 ;X0,则1 YCOMP:MOV FUNC,A SJMP 实现多向分支的主要方法是采用分支表法。常用的分支表的组成有三种形式:分支地址表转移指令表地址偏移量表例:根据R3的值,控制转向8个分支程序。(参考) R3=0, 转向SUBR0 R3=1, 转向SUBR1 R3=7, 转向SUBR7解法1: 采用分支地址表法。 MOV DPTR,#BRA

25、TAB ;取表首地址 MOV A,R3 ADD A,R3 ;A R3X2 JNC NADD INC DPH ;R3X2进位加到DPH NADD: MOV R4,A ;暂存A MOVC A,A+DPTR ;取分支地址高8位 XCH A,R4 INC A MOVC A,A+DPTR ;取分支地址低取分支地址低8位位 MOV DPL,A MOV DPH,R4 CLR A JMP A+DPTR BRATAB:DW SUBR0 ;分支地址表 DW SUBRl DW SUBR7地址解法2: 采用转移指令表。 MOV DPTR, #JMPTAB MOV A,R3 ADD A,R3 ;A R3X2 JNC N

26、ADD INC DPH ;有进位加到DPHNADD: JMP A+DPTRJMPTAB: AJMP SUBR0 ;转移指令表 AJMP SUBRl AJMP SUBR7解法3: 采用地址偏移量表。(自学) MOV DPTR, #DISTAB ;取表首地址 MOV A,R3 MOVC A,A+DPTR JMP A+DPTR DISTAB: DB SUBR0DISTAB ;地址偏移量表 DB SUBR1DISTAB DB SUBR7DISTABSUBR0:SUBR1:偏移量4.4 循环程序设计循环程序设计一、循环程序的结构置循环初值循环结束?NY循环体修改指针结束部分开始结束置循环初值循环体修改指

27、针开始循环结束?结束部分结束NY 循环程序一般包括如下四个部分:(1)置循环初值(或称初始化):即设置循环开始时的状态,比如设置地址指针,设定工作寄存器,设定循环次数等。(2)循环体:这是要重复执行的程序段,是循环结构的基本部分。(3)循环控制:循环控制包括修改指针,修改控制变量和判断循环是结束还是继续。修改指针和变量是为下一次循环判断作准备,当符合结束条件时,结束循环;否则,继续循环。(4)结束:存放结果或作其他处理。例:设有100个单字节数据,连续存放在内部数据存储器中,起始地址为BLOCK单元;数据和取为单字节数。存放在RESULT单元。试编写程序。 ORG 1020HBLOCK DAT

28、A 11HRESULT DATA 10H MOV A,#0 MOV R0,#BLOCK ;置地 ;址指针 MOV R1,#100 ;置循 ;环次数LOOP: ADD A,R0 ;求和 INC R0 ;修改指针 DJNZ R1, LOOP MOV RESULT, A ;存结果 LP: SJMP LPNA 0 R0 BLOCKR1 100R1=0?Y 求和 R0 R0+1 R1 R1-1 (RESULT) 和开始结束例:设一个无符号数据块,起始地址BUFFER,其长度存于LEN单元。试求出数据块中的最大数,并存入MAX单元。 ORG 1020HMAX DATA 20HLEN DATA 21HBUF

29、FER DATA 22H CLR A MOV R2,LEN MOV R1,#BUFFERLOOP: CLR C SUBB A, R1 ;比较 JNC NEXT ;A(R1)转NEXT MOV A,R1 ;A(R1), A (R1) SJMP NEXT1NEXT: ADD A,R1 ;恢复ANEXT1: INC R1 DJNZ R2,LOOP MOV MAX A;存结果LP: SJMP LPA 0R1 数据块首址R2 数据块长度R1 R1+1开始Cy=0?(MAX) A结束NYCy 0 A A-(R1) A (R1)A A+(R1)R2-1=0?YN例:求算术平均值在数据采集系统中,常采用算术平

30、均滤波的方法对压力、流量等周期脉动的采样值进行平滑加工,即在一个采样周期中把N次采样的值相加,然后除以采样次数N,便得到该采样周期的值,设从P1口读入采样数据,在一个采样周期内连续采样8次,要求计算机它的平均值。 ORG 1000H MOV R0,#0 ;累加值的高8位 MOV R1,#0 ;累加值的低8位 MOV R2,#8;置累加循环8次LP1: MOV P1, #0FFH;置;置P1为输入为输入 MOV A, P1;输入读数输入读数 ADD A, R1;累加 JNC LP2 INC R0 ;累加值的高8位加1LP2: MOV R1,A ; 累加值的低8位的和送R1 DJNZ R2,LP1

31、;未完,继续 MOV R3,#3LP3: MOV A,R0;累加和除以8 CLR C RRC A MOV R0,A MOV A,R1 RRC A MOV R1,A DJNZ R3,LP3LP: SJMP LP例:已知8051单片机系统的晶振频率为12MHz,试设计一个软件延时程序,延时时间为20ms。 ORG 1000H ; 机器周期数(TM) MOV R0,#20 ; 1DELAY2:MOV R1,#DIMS ; 1DELAY1:NOP ; 1 NOP ; 1 DJNZ R1,DELAY1 ; 2 DJNZ R0,DELAY2 ; 2总的延时时间为:td=tMC X TM总 tMC=12/f

32、osc=12/(12MHZ)=1us设内循环1ms 则:1ms=1000us=(1+1+2)DIMS 1us DIMS=1000/4=250TM总= (1+1+2)250 +1+220+1=20061td=tMCTM总=120061=20061us例:试设计一个排序程序,将例:试设计一个排序程序,将5次采样值按从小到大的顺序排序。次采样值按从小到大的顺序排序。例:试设计一个排序程序,将5次采样值按从小到大的顺序排序。 ORG 2000HSAMP DATA 30H MOV R2,#04;置大循环次数置大循环次数SORT:MOV A,R2 MOV R3,A;置小循环次数置小循环次数 MOV R0,

33、#SAMP;置地址指针LOOP:MOV A,R0;取数 INC R0 MOV R1,A CLR C SUBB A,R0;(30H)-(31H) 两数比较 MOV A,R1 JC DONE;(R0)(R0+1), (30H)(31)不交换,转DONE MOV A,R0;否则,交换 DEC R0 XCH A,R0;(R0) (R0+1) INC R0 MOV R0, ADONE:DJNZ R3,LOOP DJNZ R2, SORT MOV R0,#SAMP+2 MOV A,R0;取中值LP: SJMP LPR2 大循环数NR2 R2-1SORT结束R3 小循环数(R0)(R0+1)?Y (R0)

34、(R0+1)指向下一个数R3 R3-1R3=0?R2=0?YYNN4.5 查查 表表 程程 序序 作用:求函数值、完成数据补偿、修正、计算、实现代码转换、按键的识别、查找按键命令处理程序的入口地址、显示译码等各种功能,具有程序简单、执行速度快等优点。 查表指令:执行查表指令时,发出读程序存储器选通脉冲/PSEN。在MCS-51的指令系统中,给用户提供了两条极为有用的查表指令: MOVC A,A+DPTR MOVC A,A+PC 表格的定义方法:使用DB、DW伪指令,存放于代码段中。4.5 查表程序查表程序 一、顺序查表 例:在以DATA为首地址的存储区中,有一长度为100个字节的无序数据表,设

35、要找的关键字放在KEY单元中,试编写程序,若找到关键字,则将它所在的内存单元地址存入R2、R3中;若未找到,则将R2、R3清零。 方法1: MOVC A,A+PC开始(KEY) 关键字R4 100取表中的数=(KEY)?R4=0?地址+1 R2R3 0R2R3 DPTR 结束 ORG 1000H CHECK EQU 20H KEY EQU 21H 1000H 852120 MOV CHECK, KEY ; 取关键字1003H 7C64 MOV R4, #100 ; 置查找次数1005H 7415 MOV A, #15H ; TABLE- L1=15H1007H 901022 MOV DPTR,

36、 #TABLE100AH C0E0 LOOP:PUSH Acc100CH 83 MOVC A, A+PC ; 取数100DH B52006 L1: CJNE A, CHECK, A1 ; 查找,未找到,转A11010H AA83 MOV R2,DPH ; 已找到,地址送R2R31012H AB82 MOV R3, DPL1014H 80FE DONE:SJMP DONE1016H D0E0 A1: POP Acc1018H 04 INC A ; 求下一个数据地址1019H A3 INC DPTR101AH DCEE DJNZ R4,LOOP ; 未完,继续查找101CH 7A00 MOV R2

37、,#0 ; 查完,未找到,0送R2R3101EH 7B00 MOV R3,#01020H 0114 AJMP DONE1022H 4F TABLE:DB O,A,B1023H 41方法1(自学):方法二: MOVC A,A+DPTR ORG 1000H CHECK EQU 20H KEY EQU 21H 1000H 852120 MOV CHECK, KEY ; 取关键字1003H 7C64 MOV R4, #100 ; 置查找次数1005H 90101C MOV DPTR, #TABLE1008H E4 LOOP: CLR A1009H 93 MOVC A, A+ DPTR ; 取数100A

38、H B52006 CJNE A, CHECK, A1 ; 查找,未找到,转A1100DH AA83 MOV R2,DPH ; 已找到,地址送R2R3100FH AB82 MOV R3, DPL1011H 80FE DONE:SJMP DONE1013H A3 A1: INC DPTR ;修改地址指针1014H DCF2 DJNZ R4,LOOP ; 未完,继续查找1016H 7A00 MOV R2,#0 ; 查完,未找到,0送R2R31018H 7B00 MOV R3,#0101AH 80F5 SJMP DONE101CH 4F TABLE:DB O,A,B101DH 41101FH 42二、

39、计算查表法二、计算查表法例:求函数y=X!(X=0,1,2,7 )。y地址=函数表首地址+X*2 ORG 2000H DATAA EQU 30H MOV A,DATAA ;取x ADD A,DATAA ;X*2 MOV R2,A ADD A,#06 ;计算偏移量 TABLE-A1=06 MOVC A, A+PC ;取第一个字节(高位)A1: XCH A,R2 ;高位存R2 ADD A,#03 ;计算偏移量 TABLE-A2+1=03 MOVC A,A+PC ;取第二个字节(低位)A2: MOV R3,A ;低位存R3 RET TABLE: DW 1,1 DW 2,6 DW 24,120 DW

40、720,50404.6 子程序子程序 一、子程序设计原则和应注意的问题一、子程序设计原则和应注意的问题 子程序是一种能完成某一特定任务的程序段。其资源要为子程序是一种能完成某一特定任务的程序段。其资源要为所有调用程序共享。因此,子程序在结构上应具有独立性和通所有调用程序共享。因此,子程序在结构上应具有独立性和通用性,在编写子程序时应注意以下问题:用性,在编写子程序时应注意以下问题:1 1子程序的第一条指令的地址称为子程序的入口地址。该指令子程序的第一条指令的地址称为子程序的入口地址。该指令前必须有标号。前必须有标号。2 2主程序调用子程序主程序调用子程序, ,两条子程序调用指令:两条子程序调用

41、指令: (1 1)绝对调用指令:)绝对调用指令:ACALL addr11 ACALL addr11 (2 2)长调用指令:长调用指令: LCALL addr16LCALL addr163. 3. 子程序最后一条指令必须是子程序最后一条指令必须是RETRET指令指令4 4注意设置堆栈指针和现场保护注意设置堆栈指针和现场保护5 5子程序可以嵌套,即子程序可以调用子程序子程序可以嵌套,即子程序可以调用子程序6 6在子程序调用时,还要注意参数传递的问题在子程序调用时,还要注意参数传递的问题 二、二、 子程序的基本结构子程序的基本结构 MAINMAIN: ;MAINMAIN为为主程序主程序 LCALL

42、SUB LCALL SUB ;调用子程序调用子程序SUBSUB SUB SUB: PUSH PSWPUSH PSW ;现场保护现场保护 PUSH ACCPUSH ACC 子程序处理程序段子程序处理程序段 POP ACCPOP ACC ;现场恢复现场恢复 POP PSWPOP PSW ; RETRET;最后一条指令必须为最后一条指令必须为RETRET4.6 子程序子程序 例:用程序实现c=a2+b2。设a、b均小于10,a、b、c分别存于片内RAM的三个单元DATAA、DATAB、DATAC中。 ORG 2000H DATAA EQU 31H DATAB EQU 32H DATAC EQU 33

43、H MOV A,DATAA ACALL SQR ;求a2 MOV R1,A MOV A,DATAB ACALL SQR ;求b2 ADD A,R1 ;求a2+b2 MOV DATAC,AHERE:SJMP HERE ENDSQR:INC A MOVC A,A+PC RETTAB:DB 0,1,4,9,16 DB 25,36, 49, 64, 81 例:编写1位十六进制数转换为ASCII码子程序 ORG 2000HHASC:CJNE A,#0AH,L1L1: JNC L2; A0AH,转L2 ADD A,#30H; A小于0AH,则A+30H SJMP L3L2: ADD A,#37H; A0A

44、H,则A+37HL3: RET例:将累加器A中的ASCII码转换为1位十六进制数,结果存于A中。试编写程序。(自学)解:根据十六进制数和ASCII码之间的对应关系,可编写子程序如下:ASCHEX:CLR C SUBB A,#30H CJNE A, #0AH, L1L1: JC L2 SUBB A, #07HL2: RET例:编写多字节二进制数求补码的子程序。(自学)设R0为待取补的二进制数低位字节地址指针。R3为字节数,取补后的高位地址指针也为R0,编写程序如下: ORG 2100HMBCOM:SETB CLOOP: MOV A,R0;取数 CPL A ADDC A, #0;求补 MOV R0

45、,A;存结果 INC R0 DJNZ R3, LOOP DEC R0 RET例:编写无符号多字节数的加法运算子程序。(自学)设R0为被加数低位字节地址指针,R1为加数,低位字节地址指针,R2为字节数,结果存放在被加数单元中。程序如下: ORG 1100HADDMB:CLR CLOOP: MOV A,R0;取被加数 ADDC A, R1;相加 MOV R0,A;存结果 INC R0;修改地址指针 INC R1 DJNZ R2,LOOP JNC DONE MOV R0, #1DONE: RET4.7 数制转换(参考) 例:编写将多字节二进制数转换成BCD码的子程序。 R0:低位字节地址指针;R1:

46、BCD码高位字节地址指针;R7为二进制数的字节数。 ORG 2000HBINBCD:MOV A,R0 MOV R5,A MOV A,R1 MOV R6,A MOV A,R7;取二进 ;制数字节数 INC A MOV R3,A;十进制 ; 数字节数 清除结果单元NBINBCDRET二进制位数 计数器二进制数左移一位字节数到?位数到?YNBCD数X2+进位,十进制调整 Y CLR ABD0:MOV R1, A;结果单元清0 INC R1 DJNZ R3,BD0 MOV A,R7 MOV B,#08 MUL AB MOV R3,A;存二进制数位数BD3: MOV A,R5 MOV R0,A;二进制数

47、低位字节地址指针 MOV A,R7 MOV R2,A;二进制数字节数 CLR CBD1: MOV A,R0;二进制数左移一位 RLC A MOV R0,A INC R0 DJNZ R2,BD1 MOV A,R6 MOV R1,A MOV A,R7 MOV R2,A INC R2BD2:MOV A,R1 ADDC A, R1;BCD数x2+Cy DA A MOV R1, A INC R1 DJNZ R2, BD2;字节数未完,转BD2 DJNZ R3,BD3;二进制位数未完,转BD3 RET小小 结结掌握基本伪指令的使用:ORG、END、EQU、DB、DW、BIT掌握基本程序结构的设计方法1. 分支程序:二分支和三分支 散转(重点掌握转移指令表方式)2. 循环程序 :循环变量、循环条件3. 子程序:掌握基本调用方法和参数传递方法4. 查表程序:掌握表格的定义方法和两种查表方法 掌握以下应用程序的设计方法:运算程序:加法(多字节十六进制、BCD码)、减法(多字节十六进制)针对数据块的操作:清零、初始化、移动(复制)、求和、求最大值、求最小值、找寻特殊字符延时程序的设计和分析码制转换:HEX与ASCII之间的转化,HEX与BCD码之间的转化

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号