《单片机技术及应用项目化教程》课件第2章_第1页
《单片机技术及应用项目化教程》课件第2章_第2页
《单片机技术及应用项目化教程》课件第2章_第3页
《单片机技术及应用项目化教程》课件第2章_第4页
《单片机技术及应用项目化教程》课件第2章_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目二单片机并行I/O口的应用

任务1点亮发光二极管任务2发光二极管闪烁任务3流水灯的设计任务4多模式流水灯的设计

任务1点亮发光二极管

1.任务要求

用AT89C51单片机控制点亮一个发光二极管。

2.硬件电路的设计与制作

1)单片机输入/输出(I/O)口

AT89C51的输入/输出接口包括4个8位并行口(P0~P3)共32根口线。其具体结构及功能见项目二任务1知识链接部分。每个端口都包括:锁存器、输出驱动器、两个三态缓冲器以及控制电路。

P0口:既可作为通用I/O口使用,此时是一个准双向口,也可作为地址/数据总线接口使用,此时是一个真正双向口;P0口既可按字节寻址,又可按位寻址;P0口作通用I/O口输出时,是开漏输出,应外接上拉电阻。

P1口:只能作I/O口,没有地址/数据复用功能,而且作输入口使用时,要先向锁存器写“1”;P1口可按字节寻址,也可按位寻址;P1口是一准双向口,输出驱动接有上拉电阻,无需外接,不是开漏输出。

P2口:当P2口作为通用I/O时,是一准双向口;从P2口输入数据时,先向锁存器写“1”;P2口可按位寻址,也可按字节寻址;在访问外部存储器时,P2口是高8位地址输出口。

P3口:当P3口作为通用I/O接口时,第二功能输出线为高电平,使输出取决于锁存器的状态。在这种情况下,P3口仍是一个准双向口,它的工作方式、负载能力均与P1、P2口相同;当P3口作为第二功能使用时,其锁存器同相输出端必须为高电平,使P3口的状态取决于第二功能输出线的状态。

2)发光二极管的接口电路

发光二极管是一种电光转换半导体器件,使用时要注意其单向导电性。其实物如图2-1所示,符号如图2-2所示。发光二极管具有阳极和阴极两个引极,使用时阳极接电源正极,阴极接电源负极。图2-1发光二极管实物图图2-2发光二极管符号发光二极管的工作原理如下:当发光二极管中有电流流过时,发光二极管就会发光,在保证流经发光二极管的工作电流不超过其最大允许电流的情况下,流经发光二极管的工作电流越大,发光二极管越亮。随制作材料的不同,各发光二极管的最大允许电流也不同,而发光二极管的工作电流一般为2~25mA。在实际应用中,发光二极管导通还存在门槛电压,随制作材料的不同,各发光二极管的门槛电压也不同,一般为1.5~2.5V。

发光二极管的实际工作电路如图2-3所示。图中R为限流电阻,其阻值的计算公式如下:式中:VCC是电源电压,VD是发光二极管的门槛电压,ID是发光二极管的工作电流。

单片机控制的发光二极管接口电路主要有高电平有效控制和低电平有效控制两种形式,如图2-4所示。其中,图2-4(a)为发光二极管高电平有效控制接口电路,发光二极管的阳极接单片机的某个I/O口(控制端),阴极接地,控制端为高电平时发光二极管亮,否则发光二极管灭。图2-4(b)为发光二极管低电平有效控制接口电路,发光二极管的阴极接单片机的某个I/O口(控制端),阳极接电源,控制端为低电平时发光二极管亮,否则发光二极管灭。实际应用中,注意编程时要先使单片机某I/O口控制的发光二极管灭。图2-3发光二极管的实际工作电路图2-4单片机控制的发光二极管接口电路

3)点亮一个发光二极管的硬件电路

应用Proteus软件设计的点亮一个发光二极管的电路原理图如图2-5所示。用AT89C51单片机的P0.0口控制发光二极管,构成发光二极管低电平有效控制接口电路。图2-5单片机控制的发光二极管电路原理图

3.应用程序设计

1)程序流程图的设计

要使单片机按照要求正常工作,必须进行应用程序的设计。首先要设计程序流程图,如图2-6所示。其主要流程是根据图2-5所设计的硬件电路图,P0口设为输出口,控制发光二极管的亮和灭,发光二极管控制电路采用低电平有效控制,首先初始化P0口,让其输出高电平,使发光二极管处于灭的状态,之后,使P0.0输出低电平,让发光二极管亮,实现点亮一个发光二极管的任务要求。图2-6程序流程图

2)程序清单

ORG 0000H ;程序从0000H开始执行

AJMP MAIN ;无条件转移到主程序MAIN处

ORG 0030H ;主程序的起始地址0030H

MAIN: MOV P0,#0FFH;P0口初始化

LOOP: MOV P0,#0FEH;P0.0输出低电平使发光二极管亮

SJMP LOOP ;无条件转移到LOOP处,继续使光二极管亮

END ;主程序结束

4.系统调试

在单片机编译环境下进行程序的编写,经过编译生成目标代码,下载到单片机芯片中,检测程序和硬件电路的协调工作情况。

1)程序编写及编译

在KeiluVision3软件环境下,按照项目一其项目的创建过程,把上述单灯闪烁的汇编语言程序输入,输入完成后进行编译,如有错误,把错误修正,直到无错误为止。

2)系统软、硬件联调

把硬件电路连接好,应用ISP下载软件,把程序编译后得到的 .HEX文件下载到单片机芯片中,观察硬件电路的运行情况,从而检测系统设计的正确性,并进行改进直至成功实现任务要求。

5.知识链接

1)指令基本格式

指令是指挥计算机执行某种操作的命令。MCS-51单片机指令有汇编语言和机器语言两种表现形式。汇编语言表现形式是为了记忆和程序编写的方便,用英文助记符来表示每一条指令,如MOVA,R0,经汇编后变为机器语言的表现形式,即采用二进制代码来表示每一条指令,供计算机直接识别和执行,如上条指令汇编后的二进制代码为11101000。汇编语言的基本格式为:

【标号:】操作码助记符 【操作数1,操作数2,操作数3】【;注释】

其中,方括号括住的内容为可选项。各部分含义如下:

第一部分为标号:标号加在指令之前,表示该指令所在的地址。标号必须以字母开始,后跟1~8个字母或数字,以“:”结尾。标号不允许使用汇编语言中已经定义过的符号名,如指令助记符、寄存器名、伪指令等,且在一个程序中不允许重复定义相同的标号。不是每条指令都要有标号,标号通常用在转移指令、子程序开始指令等所需要的地方。第二部分为操作码:是指令的核心部分,不可缺省。表示该语句要执行的操作内容,是每条指令必有的部分。操作码用指令助记符表示。操作码后面至少留一个空格,使其与后面的操作数分隔。

第三部分为操作数:表示操作码的操作对象,根据指令不同,操作数的个数可以是0、1、2或3,各操作数之间用逗号“,”隔开。

第四部分为注释:注释放在指令之后,或单独占一行。以“;”开始,是为用户阅读程序方便而加的说明部分,不影响程序的执行。

2) MCS-51指令系统概况

指令系统是指所有指令的集合。MCS-51系列单片机具有丰富的指令系统,共111条指令,用42种操作码助记符来描述33种操作功能。其具体分类如下:

按功能分类:数据传送类指令29条,算术运算类指令24条,逻辑运算类指令24条,控制转移类指令17条,位操作类指令17条。

按指令字长分类:单字节指令49条,双字节指令46条,三字节指令16条。按执行时间分类:单机器周期指令64条,双机器周期指令45条,四机器周期指令2条,只有乘除指令。

为了便于指令的学习,对MCS-51系列单片机指令助记符中的一些常用符号说明如下:

Rn(n = 0~7):当前选中的寄存器区的8个工作寄存器R0~R7;

Ri(n = 0、1):当前选中的寄存器区中可作间接寻址的2个工作寄存器R0、R1;

direct:8位内部RAM单元的地址及SFR的地址;

#data:8位立即数,立即数前面必须加“#”;

#data16:16位立即数;

addrl6:16位目的地址,用于LCALL和LJMP指令中,范围是64KB程序存储器空间;

addr11:11位目的地址,用于ACALL和AJMP指令中,目的地址必须与下一条指令的第一字节在同一个2KB程序存储器地址空间之内;

rel:8位带符号偏移量,用于SJMP和所有条件转移指令中范围为-128~+127;

@:间接寄存器或基址寄存器的前缀,如@Ri;

bit:内部RAM或SFR中的直接寻址位;/:位操作数的前缀标志,在位操作指令中表示对该位操作数先求反再参与操作,但不影响该位操作数原值,如/bit;

(×):寄存器或存储单元×中的内容;

((×)):以寄存器或存储单元×中内容作为地址单元中的内容;

←:箭头左边的内容被箭头右边的内容所代替;

↔:数据交换;

$:当前指令的起始地址。

3)程序分析

1 ORG 0000H ;程序从0000H开始执行

2 AJMP MAIN ;无条件转移到主程序MAIN处

3 ORG 0030H ;主程序的起始地址0030H

4MAIN: MOV P0,#0FFH ;P0口初始化

5LOOP: MOV P0,#0FEH ;P0.0输出低电平使发光二极管亮

6 SJMP LOOP ;无条件转移到LOOP处,继续使光二极管亮

7 END 此点亮一个发光二极管的应用程序共有7条语句,其中第1、3、7行是伪指令语句,其余为指令语句。

伪指令不是真正的指令,为汇编程序提供相关的信息,汇编时不产生目标代码,不影响程序的执行。常用的伪指令如表2-1所示。表2-1常用的伪指令第1行“ORG0000H”表示程序指令在程序存储器中从0000H处开始存放,即第2行指令的首字节地址为0000H,所以单片机上电后就从0000H处开始执行第2行指令。第3行“ORG0030H”表示“MAIN”标号处指令的地址为0030H。ORG伪指令在使用时,在一段程序中可多次出现,但“16位地址”不能重复。第7行“END”伪指令在一段程序中只能出现一次。

第2、6行指令是两条无条件转移指令,其中“MAIN”和“LOOP”是转移目标处的标号。无条件转移指令是指当程序执行到该指令时,无条件转移到指令提供的地址执行。这类指令分为长转移指令、绝对转移指令、短转移指令和变址转移指令。

①长转移指令。

格式:LJMP addr16

功能:该指令直接将指令中的操作数,即16位地址装入PC中,使程序无条件转移到指定的地址处执行。这条指令是一条可以在64KB范围内转移的指令。该指令不影响标志位。该指令是3字节指令。

②绝对转移指令。

格式:AJMP addr11

功能:该指令执行时首先将本条指令的PC + 2,构成当前PC值,使其指向下一个存储单元,然后用指令中的11位地址替换当前PC的低11位地址,PC高5位不变,这样可在该指令后2KBROM地址空间的任何单元无条件转移。该指令是2字节指令。③短转移指令。

格式:SJMPrel

功能:该指令执行时将本条指令的PC + 2 + rel(相当偏移量)。rel称为相当偏移量,是一个用补码表示的8位有符号数,范围为 −128~+127。rel为正数表示正向跳转,rel为负数表示负向跳转。该指令是2字节指令。

④变址转移指令。

格式:JMP @A+DPTR

功能:该指令执行时是把A中8位无符号数和DPTR中的16位数相加,得到转移的目标地址送给PC,但A和DPTR中的内容不变,也不影响标志位。该指令是单字节指令。例如:说明执行如下指令后PC的值。

1000H LJMP 1234H ;PC值变为1234H

2000H AJMP 2300H ;PC值变为2300H

0050H SJMP 45H ;PC值变为0097H

第4、5行都是数据传送类指令,是将指令中的立即数传送到P0中,从而控制P0.0口所连接的发光二极管的亮灭。数据传送类指令是指令系统中应用最多的一种指令,一般是将原操作数传送到目的操作数。数据传送类指令有片内数据传送类指令、片外数据传送类指令、查表指令、数据交换指令和堆栈操作指令,本项目只介绍片内数据传送类指令,如表2-2所示。表2-2片内数据传送类指令

注:片内数据传送类指令只有以累加器A为目的操作数的指令会影响PSW中的P位,其余传送类指令对标志位均无影响;在片内数据传送类指令中立即数只能作原操作数,不能作目的操作数,且因MCS-51汇编语言规定,数据必须以数字(0~9)开头,符号以字母开头,所以指令中书写的数据高位以字母开头时,必须在其前面冠以数字“0”,否则编译会出错;寄存器和间址寄存器之间不能直接进行数据传送。例:设(20H)=10H,(10H)=30H,(P1)=0AAH。执行如下程序:

MOV R0,#20H

MOV A,@R0

MOV R1,A

MOV B,@R1

MOV @R1,P1

MOV 40H,#0FAH

MOV 20H,40H

则程序执行后结果为

(A)=(R1)=10H,(B)=30H,(R0)=20H,(40H)=(20H)=0FAH任务2发光二极管闪烁

知识目标:掌握单片机I/O口作用及其特征,掌握调用指令、条件转移指令的用法,掌握循环程序的设计方法和延时子程序的编写方法。

能力目标:掌握单片机I/O口的应用,能熟练使用开发环境进行程序的编译和调试,并会编写发光二极管亮灭的控制程序。

1.任务要求

以任务1的硬件电路为基础,用AT89S51单片机控制一个发光二极管闪烁,即让发光二极管亮一会儿、再灭一会儿、再亮一会儿,再灭一会儿,依次循环下去。

2.软件程序的设计

1)程序流程图的设计

根据图2-5所设计的硬件电路,P0口设为输出口,控制发光二极管的亮和灭,发光二极管控制电路采用低电平有效控制,主程序流程图和延时子程序流程图分别如图2-7和图2-8所示。首先初始化P0口,让其输出高电平,之后,使发光二极管亮,然后调用延时子程序控制发光二极管亮的时间,再让P0.0口输出高电平,使发光二极管灭,再调用延时子程序控制发光二极管灭的时间,如此不断循环,实现单灯闪烁的任务要求。图2-7单灯闪烁程序流程图图2-8延时1s子程序流程图

2)程序清单

1 ORG 0000H ;程序从0000H开始执行

2 AJMP MAIN ;无条件转移到主程序MAIN处

3 ORG 0030H ;主程序的起始地址0030H

4

MAIN:MOV P0,#0FFH ;P0口初始化

5

LOOP:MOV P0,#0FEH ;P0.0口输出低电平使发光二极管亮

6 LCALL DELAY ;调用延时子程序

7 MOV P0,#0FFH ;P0.0口输出高电平使发光二极管灭

8 LCALL DELAY ;调用延时子程序

9

DELAY: MOV R1,#14H ;延时1s子程序

10

D0: MOV R2,#0C8H

11

D1: MOV R3,#7BH

12 NOP ;空操作,只起延时的作用

13 DJNZ R3,$ ;R3的内容减1不为0,则继续执行本条指令,为0,

;则顺序执行程序

14 DJNZ R2,D1 ;R2的内容减1不为0,则跳转到D1处,为0,

;则顺序执行程序

15 DJNZ R1,D0

16 RET ;延时子程序结束

17 END

3.系统调试

应用KeilμVision3软件环境编写和调试程序,编译无误后下载到单片机中,检测运行效果。

4.知识链接

通过单灯闪烁的程序分析学习掌握本项目的相关知识。依据程序清单所示,此单灯闪烁应用程序共有17条语句。其中,第6、8行语句是调用子程序指令,第16行是子程序返回指令。在单片机程序设计中,为了编写和调试程序的方便,引入了主程序和子程序的概念。主程序是可以调用子程序的程序,而子程序是指经常被使用的具有一定功能的独立程序段。在程序执行过程中,当主程序用到这一子程序时,应用调用指令对子程序进行调用,同时在子程序结尾处安排一条返回指令,使子程序执行完后能返回到主程序,所以调用指令和返回指令是成对出现的。调用与返回指令如下:

①长调用指令。

格式:LCALL addr16

功能:该指令在执行时先把PC+3获得下条指令的首地址,并把它压入堆栈,使SP+2,之后把指令中的16位地址的低8位送PCL中,高8位送PCH中,然后开始执行子程序。该指令是3字节指令,可以调用64KB范围内程序存储器中的任何一个子程序,该指令执行后不影响任何标志。②绝对调用指令。

格式:ACALL addr11

功能:该指令在执行时先把PC+2获得下条指令的首地址,并把它压入堆栈,使SP+2,之后把PC当前值的高5位和指令中给出的11位地址组合成16位子程序的起始地址送入PC中,然后开始执行子程序。该指令是2字节指令,所调用的子程序的起始地址必须和该调用指令的下一条指令的首地址在同一个2KB区域中。

③子程序返回指令。

格式:RET功能:该指令是把经调用指令压入堆栈的PC值弹出,同时把堆栈指针SP-2。该指令必须和调用指令成对出现,用在子程序结尾处,执行后不影响任何标志位。

程序清单中的第9行到第16行为延时1s子程序,编写的时候要注意在子程序的第一条指令前面加上标号,作为子程序的入口地址,而子程序的结尾处必须是子程序返回指令RET。

延时子程序的编写方法有两种:软件延时和定时器延时。这里采用的是软件延时的方法,即让CPU执行一段程序,该程序执行的时间就是软件延时的时间。该程序设计采用多重循环的程序结构,主要应用循环转移指令DJNZ来实现。条件转移指令如下:

①判零转移指令。

格式:JZ rel

功能:若累加器A的内容为0,则转移,否则程序顺序执行。

格式:JNZ rel

功能:若累加器A的内容不为0,则转移,否则程序顺序执行。

②比较转移指令。

格式:CJNEA,#data,rel

CJNEA,direct,rel

CJNERn,#data,rel

CJNE@Ri,#data,rel功能:该指令有3个操作数,若第一个操作数=第二个操作数,则程序顺序执行,进位标志位CY清0;若第一个操作数>第二个操作数,则程序转移,进位标志CY清0;若第一个操作数<第二个操作数,则程序转移,进位标志CY置1。

例如:分析如下程序片段。

MAIN:MOVA,#05H

MOV30H,#1AH

MOVR0,#30H

CJNEA,#05H,L1;若A的内容与立即数05H相等,则程序顺序执行

CJNE@R0,#20H,L2;若((R0))的内容与立即数20H不相等,则程序跳转到L2处执行

L1: …

L2: …

③循环转移指令。

格式:DJNZ Rn,rel

功能:该指令执行时先将Rn的内容减1,再判断Rn的内容是否为0,若为0,则程序顺序执行,不为0则转移。该指令为2字节指令。

格式:DJNZ direct,rel功能:该指令执行时先将直接地址单元的内容减1,再判断直接地址单元的内容是否为0,若为0,则程序顺序执行,不为0则转移。该指令为3字节指令。

延时子程序的延时时间由指令的执行时间决定,其计算方法如下:由于单片机最小系统的晶振频率为12MHz,则机器周期为1μs,“MOVRn,#data”指令的执行时间为1μs,“NOP”指令的执行时间为1μs,“DJNZRn,rel”指令的执行时间为2μs,则该程序中第三层循环的执行时间为

(1 + 1 + 2 × 123) × 1μs = 248μs第二层循环的执行时间为

[1 + (2 + 248) × 200] × 1μs = 50001μs

第一层循环的执行时间为

[1 + (2 + 50001) × 20] × 1μs = 1000060μs ≈ 1s

延时子程序的延时时间即为第一层循环的执行时间。通过修改程序中寄存器的初值便可获得不同的延时时间。任务3流水灯的设计

知识目标:掌握循环移位指令的用法,掌握分支程序的设计方法和简单分支程序的编写方法。

能力目标:会编写简单分支程序。

1.任务要求

用单片机的P0口作为输出端口,控制8个发光二极管流水灯的显示方式,先点亮一个灯右移,然后再左移,循环不止。

2.硬件电路设计

根据任务要求,应用Proteus软件在图2-5的基础上设计如图2-9所示的流水灯硬件电路图。用AT89C51单片机的P0口控制8个发光二极管的亮灭,构成发光二极管低电平有效控制接口电路。

3.应用程序设计

1)程序流程图的设计

根据图2-9所设计的硬件电路和任务要求,设计本任务的程序流程图,如图2-10所示。应用带进位的循环移位指令和判位转移指令实现任务要求。图2-9流水灯硬件电路图图2-10流水灯程序流程图

2)程序清单

1 ORG 0000H ;程序从0000H开始执行

2 AJMP MAIN ;无条件转移到主程序MAIN处

3 ORG 0030H ;主程序的起始地址0030H

4MAIN:MOV R0,#07H ;R0赋初值07H

5 MOV A,#7FH ;A赋初值7FH

6L1: MOV P0,A ;A值送P0口点亮最左边的发光二极管

7 LCALL DELAY ;调用延时子程序

8 RR A ;A值右移一位

9 DJNZ R0,L1 ;判断R0的值是否为0

10 MOV R0,#07H ;R0赋初值07H

11L2:MOV P0,A ;A值送P0口点亮最右边的发光二极管

12 LCALL DELAY ;调用延时子程序

13 RL A ;A值右移一位

14 DJNZ R0,L1 ;判断R0的值是否为0

15DELAY: MOV R1,#14H ;延时0.5s子程序

16D0: MOV R2,#32H

17D1: MOV R3,#0FAH

18 DJNZ R3,$

19 DJNZ R2,D1

20 DJNZ R1,D0

21 RET ;延时子程序结束

22 END

4.知识链接

根据点亮单灯流水灯的程序分析,本任务的程序共有22条指令,程序的编写方法采用了分支程序结构,主要利用条件转移指令和位判断指令来实现。本程序中新的指令是循环移位指令。

1)循环左移指令

格式:RLA

功能:该指令将累加器A中的每一位向左循环移一位,第7位移入第0位,第0位移入第1位,以此类推。该指令不影响标志位。

例如:设(A)=6DH,执行指令“RLA”后,(A)=0DAH。

2)循环右移指令

格式:RRA

功能:该指令将累加器A中的每一位向右循环移一位,第0位移入第7位,第7位移入第6位,以此类推。该指令不影响标志位。

例如:设(A)=6DH,执行指令“RRA”后,(A)=0B6H。

3)带进位循环左移指令

格式:RLCA

功能:该指令将累加器A中的内容和进位标志一起向左循环移一位,A的第7位移入进位位CY,CY中的内容移入A的第0位,第0位移入第1位,以此类推。该指令影响标志位P和CY。

例如:设(A) = 6DH,(PSW) = 00H,即(CY) = 0,执行指令“RLCA”后,(A) = 0DAH,(PSW) = 01H,其中(CY) = 0,(P) = 1。

4)带进位循环右移指令

格式:RRCA

功能:该指令将累加器A中的内容和进位标志一起向右循环移一位,A的第0位移入CY,进位位CY中的内容移入A的第7位,第7位移入第6位,以此类推。该指令影响标志位P和CY。

例如:设(A) = 6DH,(PSW) = 00H,即(CY) = 0,执行指令“RRCA”后,(A) = 36H,(PSW) = 80H,其中(CY) = 1,(P) = 0。任务4多模式流水灯的设计

知识目标:掌握算术运算指令、查表指令和判位转移指令的用法,掌握查表程序的编写方法。

能力目标:会编写查表程序。

1.任务要求

在任务3硬件电路的基础上,实现如表2-3所示的多模式流水灯的功能。表2-3多模式流水灯显示控制表

2.应用程序设计

1)程序流程图的设计

根据图2-9所设计的硬件电路和多模式流水灯显示的任务要求,设计本任务的程序流程图如图2-11所示。应用查表指令来实现不同显示模式的控制,再应用加法指令通过判断进位标志位来判断所有显示模式是否显示完成。图2-11多模式流水灯程序流程图

2)程序清单

1 ORG 0000H ;程序从0000H开始执行

2 AJMP START ;无条件转移到主程序MAIN处

3 ORG 0050H ;主程序的起始地址0050H

4START: MOV R0,#0 ;R0赋初值0

5MAIN: MOV A,R0 ;R0内容送A

6 MOV DPTR,#TAB ;控制数据表首地址送DPTR

7 MOVC A,@A+DPTR ;从数据表中获取控制数据送A

8 MOV P0,A ;A值送P0口点亮最左边的发光二极管

9 LCALL DELAY ;调用延时子程序

10 INC R0 ;显示序号计数器值加1

11 MOV A,R0

12 ADD A,#240 ;计数器值加240

13JNC MAIN ;相加最高位无进位返回MAIN执行程序,否则顺序执行

14 SJMP START ;16种模式显示完成,从第一种模式继续显示

15DELAY:MOV R5,#14H ;延时0.5s子程序

16D0: MOV R6,#32H

17D1: MOV R7,#0FAH

18DJNZ R7,$

19DJNZ R6,D1

20 DJNZ R5,D0

21 RET ;延时子程序结束

22 END

3.知识链接

本任务所涉及到的知识主要是程序的设计方法和查表指令、算术运算指令、判位转移指令的应用。

1)查表指令

查表指令即读程序存储器中的表格或常数,专用于这一操作的指令有两条,分别为

①以DPTR为基址的查表指令。

格式:MOVCA,@A+DPTR 功能:该指令执行前将所查数据在表中的序号装入A,使DPTR指向表格首地址,指令执行时,就会将A中的内容和DPTR中的内容相加作为要传送的数据地址,把该地址指向的程序存储器单元中的内容送到累加器A中。由于DPTR是16位的数据指针,因此该指令适用范围较为广泛,表格位置和大小可以设置在64KBROM中的任何位置。

例如:分析执行下列程序后,累加器A的内容是多少?

MOV A,#01H

MOV DPTR,#M2 ;将表格首地址M2送DPTR

MOVC A,@A+DPTR ;执行完该指令,A=(M2+1)=22H

M1: RET

M2: DB 11H,22H,33H,44H ;定义一组数据表程序中的“DB”为定义字节伪指令,在此定义了一组数据表。MOVC指令执行时,将M2地址与累加器A中的内容相加得到新的地址为M2+1,查找该地址中的内容为22H,将其送入累加器A中,因此该程序运行后累加器A中的内容为22H。

②以PC为基址的查表指令。

格式:MOVC A,@A+PC

功能:该指令执行时将A中的内容作为无符号数和PC的当前值(即本条指令的下一条指令的起始地址)相加后得到一个16位的地址,把该地址指出的程序存储器单元中的内容送到累加器A中。本指令中的当前PC值是由该指令所在地址确定的,而A的内容为0~255,所以该查表指令所查的表格起始地址和大小只能在该指令以下的256个单元内。例如:分析执行下列程序后,累加器A的内容是多少?

MOV A,#01H

MOVC A,@A+PC ;执行完该指令,A=(M1+1)=11H

M1: RET

M2: DB 11H,22H,33H,44H ;定义一组数据表

由于上段程序在执行MOVC指令时,(PC)=M1,所得新地址为M1+1,由于RET指令为单字节指令,所以表的首地址M2=M1+1,查找该地址中的内容为11H,将其送入累加器A中,因此该程序运行后累加器A中的内容为11H。

2)算术运算指令

算术运算指令有加法指令、减法指令及乘除指令。

(1)加法指令有不带进位加法指令、带进位加法指令、加1指令和十进制调整指令,各指令描述如下:

①不带进位加法指令。

格式: ADD A,Rn

ADD A,#data

ADD A,direct

ADD A,@Ri功能:这组指令是把源操作数和累加器A的内容相加,其结果放入累加器A中。指令的执行会对进位标志CY、辅助进位标志AC、溢出标志OV及奇偶校验标志P产生影响。

若结果中D7位产生进位,则CY = 1,否则CY = 0;若结果中的D3位产生进位,则AC = 1,否则A运算结果C=0;若运算结果D7位和D6位进位情况相同,则OV = 0,否则OV = 1;奇偶标志位P将随指令执行后A中1的个数的奇偶性变化,若A中1的个数为奇数,则P = 1,否则P = 0。例如:设(A) = 0C3H,(R0) = 0AAH,(PSW) = 80H,分析指令执行后的结果。

ADD A,30H

分析:将A中的内容与R0中的内容相加,即

则运算结果为:(A) = 6DH;(PSW) = 084H,其中(CY) = 1,(AC) = 0,(OV) = 1,(P) = 0。②带进位的加法指令。

格式: ADDC A,Rn

ADDC A,direct

ADDC A,@Ri

ADDC A,#data

功能:这组指令是把源操作数和累加器A的内容及进位标志CY相加,将结果存放在累加器A中。运算结果对PSW各位的影响与ADD加法指令相同。

这组指令多用于多字节加法运算中,因为在进行高字节加法时,要考虑低位字节向高位字节的进位情况。例如:设(A) = 42H,(R3) = 68H,(PSW) = 80H,分析指令执行后的结果。

ADDCA,R3

分析:将A中的内容与R3中的内容和当前的进位值相加,即

则运算结果为:(A) = 0ABH;(PSW) = 05H,其中(CY) = 0,(AC) = 0,(OV) = 1,(P) = 1。③加1指令。

格式: INCA

INCdirect

INCRn

INC@Ri

INCDPTR

功能:这组指令的功能是把操作数加1,结果放回到操作数中。若原来操作数为0FFH,加1后则溢出为00H。除“INCA”影响标志P外,其余指令不影响任何标志位。例如:设(A) = 86H,(R1) = 10H,(10H) = 0FH,(R0) = 0FFH,(20H) = 09H,(DPTR) = 10CEH,分析指令执行后的结果。

INCA ;(A)=87H

INCR0 ;(R0)=00H

INC@R1 ;(10H)=10H

INC20H ;(20H)=0AH

INCDPTR ;(DPTR)=10CFH④十进制调整指令。

格式:DAA

功能:该指令是对累加器中由上一条加法指令(加数与被加数均为压缩的BCD码形式)所获得的8位运算结果进行十进制调整,使它变为压缩B

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论