收藏 分享(赏)

汇编语言程序设计.doc

上传人:dzzj200808 文档编号:2342158 上传时间:2018-09-11 格式:DOC 页数:41 大小:961.50KB
下载 相关 举报
汇编语言程序设计.doc_第1页
第1页 / 共41页
汇编语言程序设计.doc_第2页
第2页 / 共41页
汇编语言程序设计.doc_第3页
第3页 / 共41页
汇编语言程序设计.doc_第4页
第4页 / 共41页
汇编语言程序设计.doc_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、单片机应用技术 第 4 章 汇编语言程设计56第 4 章 汇编语言程序设计程序设计是单片机应用系统设计的重要组成部分,计算机的全部动作都是在程序的控制下进行的。本章用大量的实例来介绍单片机汇编语言程序设计方法。实训 4 信号灯的控制 21.实训目的(1)掌握汇编语言程序的基本结构。(2)了解汇编语言程序设计的基本方法和思路。2. 实训设备与器件(1) 实训设备:单片机开发系统,微机等。(2) 实训器件与电路:与实训 1 相同。3. 实训步骤与要求(1)运行程序 1,观察 8 个发光二极管的亮灭状态。(2)在实训 1 的实训电路上面增加一个拨动开关,如图 4.1 所示。8031+5V4.7K P

2、3.4K0图 4.1 实训中的开关电路将拨动开关 K0 拨到+5V 位置,运行程序 2,观察发光二极管的亮灭状态;将拨动开关 K0 拨到接地位置,运行程序 2,观察发光二极管的亮灭状态。(3)运行程序 3,观察 8 个发光二极管的亮灭状态。程序 1:所有发光二极管不停地闪动。ORG 0000H ;程序从地址 0000H 开始存放START: MOV P1,#00H ;把立即数 00H 送 P1 口,点亮所有发光二极管ACALL DELAY ;调用延时子程序MOV P1,#0FFH ;灭掉所有发光二极管ACALL DELAY ;调用延时子程序AJMP START ;重复闪动DELAY: MOV

3、R3,#7FH ;延时子程序DEL2: MOV R4,#0FFHDEL1: NOPDJNZ R4,DEL1DJNZ R3,DEL2RETEND ;汇编程序结束程序 2:用开关控制发光二极管的显示方式。ORG 0000HMOV P3,#00010000B ;使 P3 口锁存器的 P3.4 置位单片机应用技术 第 4 章 汇编语言程设计57MOV A,P3 ;读 P3 口引脚线信号ANL A,#00010000B ;“逻辑与”操作,屏蔽掉无关位JZ DDPING ;判断 P3.4 是否接地,若是,跳转到 DDPING 执行MOV P1,#00H ;否则,P3.4 接高电平,点亮所有发光二极管SJM

4、P $DDPING: MOV P1,#55H ;P3.4 接地,发光二极管交叉亮灭SJMP $END程序 3:使 8 个发光二极管顺序点亮。ORG 0000HSTART: MOV R2,#08H ;设置循环次数MOV A,#0FEH ;送显示模式字NEXT: MOV P1,A ;点亮连接 P1.0 的发光二极管ACALL DELAYRL A ;左移一位,改变显示模式字DJNZ R2,NEXT ;循环次数减 1,不为零,继续点亮下面一个二极管SJMP STARTDELAY: MOV R3,#0FFH ;延时子程序开始DEL2: MOV R4,#0FFHDEL1: NOPDJNZ R4,DEL1D

5、JNZ R3,DEL2RETEND4. 实训分析与总结(1)程序 1 的运行结果是:8 个发光二极管同时闪动,该程序的运行过程用流程图表示如图 4.2 所示。程序 1 的执行过程是按照指令的排列顺序逐条执行,直到全部指令执行完毕为止。这种按照指令的排列顺序逐条执行的程序结构称为顺序结构程序,如图 4.2 表示该程序结构的图称为程序流程图。关于顺序程序的详细介绍参见 4.2 节。 开 始点 亮 8个 发 光 二 极 管延 时熄 灭 8个 发 光 二 极 管延 时结 束图 4.2 程序 1 流程图(2)程序 2 的运行结果是:若开关 K0 接+5V,8 个发光二极管全部处于点亮状态;若开关 K0

6、拨到接地状态,8 个发光二极管处于“亮灭亮灭亮灭亮灭”状态。程序 2 的流程图如图 4.3 所示。单片机应用技术 第 4 章 汇编语言程设计58读 P3.4的 管 脚 YN结 束P3.4接 地 ?开 始发 光 二 极 管交 叉 亮 灭点 亮 8个 发光 二 极 管图 4.3 程序 2 流程图程序 2 的特点是:程序不按照指令的排列顺序执行,而是根据开关 K0 的状态,分别执行不同的内容,即程序有两个分支,执行时根据给定的条件选择其中分支,这样的程序结构称为分支结构程序。分支结构程序的关键是如何根据条件选择正确的分支。关于分支结构程序的详细介绍参见 4.3 节。(3)程序 3 的运行结果是:顺序

7、点亮 8 个发光二极管。该程序的流程图如图 4.4 所示。YN显 示 模 式 字 左 移 1位次 数 -1=0延 时开 始设 循 环 次 数设 循 环 初 值显 示 模 式 字 送 P1口图 4.4 程序 3 流程图程序 3 的特点是“点亮-延时-移位”这一程序段重复执行了 8 次,这样重复执行某一程序段的程序结构称为循环结构程序。该程序的设计过程见例 4.6。关于循环程序结构的详细介绍参见 4.4 节。(4)在程序 1 和程序 3 中都使用了一段相同的延时子程序 DELAY,这种供其它程序反复使用的程序或程序段称为子程序。关于子程序的详细介绍参见 4.6 节。5. 思考在程序 1 和程序 3

8、 中,如果去掉程序中 ACALL DELAY,程序运行结果是否有变化,为什么?如果想改变 8 个发光二极管的闪动或点亮速度,如何修改程序?4.1 概述实训 4 中,我们使用的程序都是用单片机汇编语言设计的。除了汇编语言外,单片机程序设计语言还有两类:机器语言和高级语言。机器语言(Machine Language)是指直接用机器码编写程序、能够为计算机直接执行单片机应用技术 第 4 章 汇编语言程设计59的机器级语言。机器码是一串由二进制代码“0”和“1”组成的二进制数据,执行速度快,但是可读性极差。机器语言一般只在简单的开发装置中使用,程序的设计、输入、修改和调试都很麻烦,在实训 1 和实训

9、3 中直接固化或输入的程序都是机器语言程序。汇编语言(Assembly Language)是指用指令助记符代替机器码的编程语言。程序结构简单,执行速度快,程序易优化,编译后占用存储空间小,是单片机应用系统开发中最常用的程序设计语言。汇编语言的缺点是可读性比较差,只有熟悉单片机的指令系统,并具有一定的程序设计经验,才能研制出功能复杂的应用程序,实训 4 中的 3 个程序都是用汇编语言设计的。高级语言(High-Level Language)是在汇编语言的基础上用高级语言来编写程序,例如 PL/M-51、Franklin C51、MBASIC 51 等,程序可读性强,通用性好,适用于不熟悉单片机指

10、令系统的的用户。高级语言编写程序的缺点是实时性不高,结构不紧凑,编译后占用存储空间比较大,这一点在存储器有限的单片机应用系统中没有优势。目前,大多数用户仍然使用汇编语言进行单片机应用系统的软件设计,本章介绍 MCS-51 单片机汇编语言的程序设计方法。单片机汇编语言程序设计的基本步骤如下:(1) 题意分析熟悉并了解汇编语言指令的基本格式和主要特点,明确被控对象对软件的要求,设计出算法等。(2) 画出程序流程图编写较复杂的程序,画出程序流程图是十分必要的。程序流程图也称为程序框图,是根据控制流程设计的,它可以使程序清晰,结构合理,按照基本结构编写程序,便于调试,在实训 4 中,我们给出了 3 个

11、实训程序的流程图。(3) 分配内存工作区及有关端口地址分配内存工作区,要根据程序区、数据区、暂存区、堆栈区等预计所占空间大小,对片内外存储区进行合理分配并确定每个区域的首地址,便于编程使用。(4) 编制汇编源程序。(5) 仿真调试程序。(6) 固化程序。4.2 简单程序设计简单程序也就是顺序程序,实训 4 中的程序 1 就是顺序程序结构,它是最简单、最基本的程序结构,其特点是按指令的排列顺序一条条地执行,直到全部指令执行完毕为止。不管多么复杂的程序,总是由若干顺序程序段所组成的。本节通过实例介绍简单程序的设计方法。例 4.1 四字节(双字)加法。将内部 RAM 30H 开始的 4 个单元中存放

12、的四字节 16进制数和内部 RAM 40H 单元开始的 4 个单元中存放的四字节 16 进制数相加,结果存放到40H 开始的单元中。(1) 题意分析题目的要求如图 4.5 所示。单片机应用技术 第 4 章 汇编语言程设计6030H31H33H32H43H42H41H40H4FH23HABHA0H7BH56H80HE8HA 0 A B 2 3 4 F+ E 8 8 0 5 6 7 B1 8 9 2 B 7 9 C A加 数 1存 放 处 加 数 2存 放 处43H42H41H40H CAH79H2BH89H相 加 结 果 存 放 处图 4.5 例 4.1 题意分析示意图(2) 汇编语言源程序按照

13、双字节加法的思路,实现四字节加法的源程序如下:ORG 0000HMOV A,30HADD A,40HMOV 40H,A ;最低字节加法并送结果MOV A,31HADDC A,41HMOV 41H,A ;第二字节加法并送结果MOV A,32HADDC A,42HMOV 42H,A ;第三字节加法并送结果MOV A,33HADDC A,43HMOV 43H,A ;第四字节加法并送结果,进位位在 Cy 中END显然,上面程序中每一步加法的步骤很相似,因此我们可以采用循环的方法来编程,使得源程序更加简洁,结构更加紧凑。用循环方法编制的源程序见习题 4.3 题。例 4.2 数据拼拆程序。将内部 RAM

14、30H 单元中存放的 BCD 码十进制数拆开并变成相应的 ASCII 码,分别存放到 31H 和 32H 单元中。(1) 题意分析题目要求如图 4.6 所示。 4 5十 进 制 数 45的 BCD码3 53 4 32H4的 ASCI码 5的 ASCI码图 4.6 例 4.2 题意分析示意图本题中,首先必须将两个数拆分开,然后再拼装成 2 个 ASCII 码。数字与 ASCII 码之间的关系是:高 4 位为 0011H,低四位即为该数字的 8421 码。(2) 汇编语言源程序单片机应用技术 第 4 章 汇编语言程设计61ORG 0000HMOV R0,#30HMOV A,#30HXCHD A,R

15、0 ;A 的低 4 位与 30H 单元的低 4 位交换MOV 32H,A ;A 中的数值为低位的 ASCII 码MOV A,R0SWAP A ;将高位数据换到低位ORL A,#30H ;与 30H 拼装成 ASCII 码MOV 31H,AEND4.3 分支程序设计通常,单纯的顺序结构程序只能解决一些简单的算术、逻辑运算,或者简单的查表、传送操作等。实际问题一般都是比较复杂的,总是伴随有逻辑判断或条件选择,要求计算机能根据给定的条件进行判断,选择不同的处理路径,从而表现出某种智能。根据程序要求改变程序执行顺序,即程序的流向有两个或两个以上的出口,根据指定的条件选择程序流向的程序结构我们称为分支程

16、序结构,实训 4 中的程序 2 就是这样的程序结构。本节通过实例介绍分支程序设计方法。4.3.1 分支程序实例1两分支程序设计例 4.3 两个无符号数比较(两分支) 。内部 RAM 的 20H 单元和 30H 单元各存放了一个 8位无符号数,请比较这两个数的大小,比较结果显示在实训的实验板上。如下:若(20H)=(30H) ,则 P1.0 管脚连接的 LED 发光;若(20H)= Y;若 Cy=1,有借位,X=Y,灭 灯图 4.7 两数比较流程图(2) 汇编语言源程序X DATA 20H ;数据地址赋值伪指令 DATAY DATA 30H单片机应用技术 第 4 章 汇编语言程设计62ORG 0

17、000HMOV A,X ;(X) ACLR C ;Cy=0SUBB A,Y ;带借位减法,A-(Y)-CyAJC L1 ;Cy=1,转移到 L1CLR P1.0 ;Cy=0, (20H)=(30H) ,点亮 P1.0 连接的 LEDSJMP FINISH ;直接跳转到结束等待L1: CLR P1.1 ;(20H)(30H) ,则 P1.1 管脚连接的 LED 发光;若(20H)=0NYCy=1X=Y点P1.XY点P1.XY点P1.图 4.8 两个有符号数 X、Y 比较流程图(2)汇编语言源程序X DATA 20HY DATA 30HORG 0000HMOV A,XXRL A,Y ;(X)与(Y

18、)进行异或操作JB ACC.7,NEXT1 ;累加器 A 的第 7 位为 1,二数符号不同,转移到;NEXT1MOV A,XCJNE A,Y,NEQUAL ;(X)YOV=1 时 XY采用这种比较方式的汇编语言源程序见习题 4.9。3. 散转程序散转程序是指经过某个条件判断之后,程序有多个流向(三个以上) 。在后面的键盘接口程序设计中经常会用到散转功能根据不同的键码跳转到相应的程序段。例 4.5 在实训 4 程序 2 的基础之上,先设计两个开关,使 CPU 可以察知两个开关组合出的 4 种不同状态。然后对应每种状态,使 8 个 LED 显示出不同的亮暗模式。(1) 硬件设计在实训 1 的电路中

19、,我们使用了单片机的并行口 P1 的输出功能来控制 8 个 LED 的显示,现在我们使用其 P3 口的输入功能设计两个输入开关,硬件原理图如图 4.9 所示。8031+5V4.7K4.7K P3.4P3.5K0K11212图 4.9 在实训 1 原理图基础之上例 4.5 硬件原理图如图 4.9 所示,当开关 K0 接通 2 时,P3.4 管脚接地,P3.4=0;当 K0 接通 1 时,P3.4接+5V,P3.4=1。同样,当开关 K1 接通 2 时,P3.5 管脚接地,P3.5=0;当 K1 接通 1 时,P3.5 接+5V,P3.5=1。假设要求 P3 口的开关状态对应的 P1 口的 8 个

20、 LED 的显示方式如下:P3.5 P3.4 显示方式0 0 全亮0 1 交叉亮1 0 低四位连接的灯亮,高四位灭1 1 低四位连接的灯灭,高四位亮(2) 软件设计 程序设计思想散转程序的特点是利用散转指令实现向各分支程序的转移,程序流程图如图 4.10 所示。单片机应用技术 第 4 章 汇编语言程设计65开 始读 P3口 的 引 脚状 态 A屏 蔽 掉 A中 无 关 位 , 并将 相 应 位 移 到 最 低 位修 正 A的 值 ,A*2 A转 移 指 令 表 基 地 址 DPTR结 束散 转 指 令显 示 方 式 1显 示 方 式 2显 示 方 式 3显 示 方 式 4结 束 结 束 结 束

21、图 4.10 散转程序流程图 汇编语言源程序ORG 0000HMOV P3,#00110000B ;使 P3 口锁存器相应位置位MOV A,P3 ;读 P3 口相应引脚线信号ANL A,#00110000B ;“逻辑与”操作,屏蔽掉无关位SWAP A ;将相应位移位到低位RL A ;循环左移一位,A*2AMOV DPTR,#TABLE ;转移指令表的基地址送数据指针 DPTRJMP A+DPTR ;散转指令ONE: MOV P1,#00H ;第一种显示方式,K0 通,K1 通SJMP $TWO: MOV P1,#55H ;第二种显示方式,K0 断,K1 通SJMP $THREE: MOV P1

22、,#0FH ;第三种显示方式,K0 通,K1 断SJMP $FOUR: MOV P1,#0F0H ;第四种显示方式,K0 断,K1 通SJMP $TABLE: AJMP ONE ;转移指令表AJMP TWOAJMP THREEAJMP FOUREND(3)程序说明 读 P3 口的管脚状态MCS-51 的四个 I/O 端口共有三种操作方式:输出数据方式,读端口数据方式和读端口引脚方式。输出数据方式举例:单片机应用技术 第 4 章 汇编语言程设计66MOV P1,#00H ;输出数据 00HP1 端口锁存器P1 引脚读端口数据方式举例:MOV A,P3 ;AP3 端口锁存器读端口引脚方式举例:MO

23、V P3,#0FFH ;P3 口端口锁存器各位置 1MOV A,P3 ;AP3 端口引脚状态注意:读引脚方式必须连续使用两条指令,首先必须使欲读的端口引脚所对应的锁存器置位,然后再读引脚状态。 DPTR TABLETWOONEAJMPTABLE+1TABLE+2TABLE+3TABLE+4TABLE+5TABLE+6TABLE+7AJMPAJMPAJMPTHREFOURA=0A=2A=4A=6图 4.11 指令转移表的存储格式 散转指令 JMP A+DPTR散转指令是单片机指令系统中专为散转操作提供的无条件转移指令,指令格式如下:JMP A+DPTR ;PCDPTR+A一般情况下,数据指针 D

24、PTR 固定,根据累加器 A 的内容,程序转入相应的分支程序中去,本例采用最常用的转移指令表法,就是先用无条件转移指令按一定的顺序组成一个转移表,再将转移表首地址装入数据指针 DPTR 中,然后将控制转移方向的数值装入累加器 A中作变址,最后执行散转指令实现散转。指令转移表的存储格式如图 4.11 所示。由于无条件转移指令 AJMP 是两字节指令,因此控制转移方向的 A 中的数值为:A=0 转向 AJMP ONEA=2 转向 AJMP TWOA=4 转向 AJMP THREEA=6 转向 AJMP FOUR程序中从 P3 口读入的数据分别为 0、1、2、3,因此必须乘以 2 用来修正 A 的值

25、。如果A=2,散转过程如下:JMP A+DPTR PC=TABLE+2 AJMP TWO 三种无条件转移指令 LJMP、AJMP 和 SJMP 的比较三种无条件转移指令在应用上的区别有以下三点:一是转移距离不同,LJMP 可在 64Kbytes 范围内转移,AJMP 指令可以在本指令取出后的 2Kbytes 范围内转移,SJMP 的转移范围是以本指令为核心的-126+129bytes 范围内转移;二是汇编后机器码的字节数不同,LJMP 是三字节指令,AJMP 和 SJMP 都是两字节指令。三是 LJMP 和 AJMP 都是绝对转移指令,可以计算得到转移目的地址,而 SJMP 是相对转移指令,只

26、能通过转移偏移量来进行计算。单片机应用技术 第 4 章 汇编语言程设计67选择无条件转移指令的原则是根据跳转的远近,尽可能选择占用字节数少的指令。例如动态暂停指令一般都选用 SJMP $,而不用 LJMP $。4.3.2 分支程序结构分支程序比顺序程序的结构复杂得多,其主要特点是程序的流向有两个或两个以上的出口,根据指定的条件进行选择确定。编程的关键是如何确定供判断或选择的条件以及选择合理的分支指令。通常根据分支程序中出口的个数分为单分支结构程序(两个出口)和多分支结构程序(三个或三个以上出口) 。1. 单分支结构程序的形式单分支结构在程序设计中应用最广,拥有的指令也最多。单分支结构一般为:一

27、个入口,两个出口。如图 4.12 所示,单分支程序结构有以下两种典型形式:程 序 段 1YN结 束条 件 满 足开 始程 序 段 1YN结 束条 件 满 足开 始分 支 程 序 1分 支 程 序 2程 序 段 1 程 序 段 3程 序 段 2(a) (b)图 4.12 单分支程序结构的典型形式图(a)当条件满足时执行分支程序 1,否则执行分支程序 2,例 4.3 就是这样一种结构;图(b)当条件满足时跳过程序段 2,从程序段 3 往下执行,否则顺序执行程序段 2 和3。另外,分支结构程序允许嵌套,即一个分支接一个分支,形成树形多级分支程序结构,例 4.4 就是这样的结构。2. 散转程序在实际应

28、用中,常常需要从两个以上的出口中选一,称为多分支程序或散转程序。MCS-51 单片机指令系统中专门提供了散转指令,使得散转程序的编制更加简洁。例 4.5 中采用转移地址表法实现散转程序,转移表是由双字节短转移指令“AJMP”组成,各转移指令地址依次相差两个字节,所以累加器 A 中变址值必须作乘 2 修正。若转移表是由三字节长转移指令“LJMP”组成,则累加器 A 中变址值必须乘 3。当修正值有进位时,则应将进位先加在数据指针高位字节 DPH 上。此外,转移表中使用“AJMP”指令,这就限制了转移的入口地址ONE、TWO、THREE、FOUR 必须和散转表首地址 TABLE 位于同一个 2K 字

29、节范围内。为了克服上述局限性,除了可以使用“LJMP”指令组成跳转表外,还可采用双字节的寄存器存放散转值,并利用对 DPTR 进行加法运算的方法,直接修改 DPTR,然后再用散转指令实现散转。单片机应用技术 第 4 章 汇编语言程设计68散转程序除了转移指令表法之外,还可以采用地址偏移量表法、转向地址表法及利用“RET”指令(子程序返回指令)实现散转程序等,具体实现参见习题 4.11 题。3. 转移条件的形成分支程序中的转移条件一般都是程序状态字(PSW)中的标志位的状态,因此,保证分支程序正确流向的关键如下:(1) 在判断之前,应执行对有关标志位影响的指令,使该标志位能够适应问题的要求,这就

30、要求编程员要十分了解指令对标志位的影响情况。(2) 当某一标志位处于某一状态时,在未执行下一条影响此标志位的指令前,它一直保持原状态不变。(3) 正确理解 PSW 中各标志位的含义及变化情况,才能正确地判断转移。4.4 循环程序设计循环结构程序是把需要多次重复使用的程序段,利用转移指令反复转向该程序段,从而大大缩短程序代码,减少占用程序空间,程序结构也大大优化。实训 4 中的程序 3 就是循环结构程序。本节用实例介绍循环程序设计方法。4.4.1 循环程序实例1. 单重循环程序设计例 4.6 实训 4 的程序 3 设计。用 P1 口连接的 8 个 LED 模拟霓虹灯的显示方式。编程实现 P1 口

31、连接的 8 个 LED 显示方式如下:一个发光二极管顺序从 P1.0 亮到 P1.7 所连接的 LED(1) 题意分析这种显示方式是一种动态显示方式,逐一点亮一个灯,使人们感觉到点亮灯的位置在移动。根据点亮灯的位置,我们要向 P1 口依次送入如下的立即数:FEH点亮 P1.0 连接的 LED MOV P1,#0FEHFDH点亮 P1.1 连接的 LED MOV P1,#0FDHFBH点亮 P1.2 连接的 LED MOV P1,#0FBH 7FH点亮 P1.7 连接的 LED MOV P1,#7FH以上完全重复的往 P1 口传送立即数的操作,会使程序结构松散。我们看到,控制 LED点亮的显示模

32、式字立即数 0FEH、0FDH、0FBH7FH 之间存在着每次左移一位的规律,因此我们可以试用循环程序来实现。初步设想的程序流程图如图 4.13 所示。单片机应用技术 第 4 章 汇编语言程设计69设 循 环 次 数YN开 始显 示 模 式 字 左 移 1位次 数 -1=0显 示 模 式 字 送 P1口设 循 环 初 值图 4.13 例 4.6 初步设想的程序流程图用汇编语言实现的程序如下:ORG 0000HSTART: MOV R2,#08H ;设置循环次数MOV A,#0FEH ;从 P1.0P1.7 逐个 LED 亮过去NEXT: MOV P1,A ;点亮 LEDRL A ;左移一位DJ

33、NZ R2,NEXT ;次数减 1,不为零,继续点亮下面一个 LEDSJMP START ;反复点亮END执行上面程序后,结果是 8 个灯全部被点亮,跟预想的结果不符,为什么呢?这是因为程序执行得很快,逐一点亮 LED 的间隔太短,在我们看来就是同时点亮了,因此必须在点亮一个 LED 后加一段延时程序,使该显示状态稍事停顿,人眼才能区别开来。正确的程序流程图参见实训 4 中的图 4.4。(2) 汇编语言源程序本例完整的汇编语言源程序见实训 4 程序 3。由于程序设计中经常会出现如图 4.14 所示的次数控制循环程序结构,为了编程方便,单片机指令系统中专门提供了循环指令 DJNZ,完全适用于上述

34、结构编程。 次 数 -1=0YN继 续 循 环 结 束 循 环图 4.14 常见循环程序结构DJNZ R2,NEXT ;R2 中存放控制次数,R2-1R2,R20,转移到 NEXT 继续;循环,否则执行下面指令2双重循环程序设计延时程序设计在上例中使用了延时程序段之后,我们才能看到正确的显示结果。延时程序在单片机汇编语言程序设计中使用非常广泛,例如:键盘接口程序设计中的软件消除抖动、动态单片机应用技术 第 4 章 汇编语言程设计70LED 显示程序设计、LCD 接口程序设计、串行通信接口程序设计等。所谓延时就是让 CPU 做一些与主程序功能无关的操作(例如将一个数字逐次减 1 直到为 0)来空

35、耗掉 CPU 的时间。由于我们知道 CPU 执行每条指令的准确时间,因此执行整个延时程序的时间也可以精确计算出来。也就是说,我们可以写出延时长度任意而且精度相当高的延时程序。例 4.7 设计一个延时 1 秒的程序,设单片机时钟晶振频率为 fosc=6MHz。(1) 题意分析延时程序的关键是计算延时时间。延时程序一般采用循环程序结构编程,通过确定循环程序中的循环次数和循环程序段两个因素来确定延时时间。对于循环程序段来讲,必须知道每一条指令的执行时间,这里涉及到几个非常重要的概念时钟周期、机器周期和指令周期。时钟周期 T 时钟 是计算机基本时间单位,同单片机使用的晶振频率有关,题目给定fosc=6

36、MHz,那么 T 时钟 =1/fosc=1/6M=166.7ns。机器周期 T 机器 是指 CPU 完成一个基本操作所需要的时间,如取指操作、读数据操作等,机器周期的计算方法:T 机器 =12T 时钟 =166.7ns X 12=2s。指令周期是指执行一条指令所需要的时间,由于指令汇编后有单字节指令、双字节指令和三字节指令,因此指令周期没有确定值,一般为 14 个 T 机器 。在附录 3 的指令表中给出了每条指令所需的机器周期数,可以计算每一条指令的指令周期。现在,我们可以来计算一下例 4.6 中延时程序段的延时时间。延时程序段如下:DELAY1: MOV R3,#0FFH DEL2: MOV

37、 R4,#0FFHDEL1: NOPDJNZ R4,DEL1DJNZ R3,DEL2经查指令表得到:指令 MOV R4,#0FFH、NOP、DJNZ 的执行时间为 1 个机器周期:2s、2s 和 4sNOP 为空操作指令,其功能是取指、译码,然后不进行任何操作进入下一条指令,经常用于产生一个机器周期的延迟。延时程序段为双重循环,下面分别计算内循环和外循环的延时时间。内循环:内循环的循环次数为 255(0FFH) ,循环一次内容为以下两条指令:NOP ;2sDJNZ R4,DEL1 ;4s内循环延时时间为:255 X (2+4)=1530s 外循环:外循环的循环次数为 255(0FFH),循环一

38、次内容如下: MOV R4,#0FFH ;2s 1530us 内循环 ;1530s DJNZ R3,DEL2 ;4s外循环一次时间为 1530s+2s+4s=1536s,循环 255 次,另外加上第一条指令MOV R3,#0FFH ;2s因此总的循环时间为:2s + (1530s+2s+4s) X 255=391682s 392ms以上是比较精确的计算方法,一般情况下,在外循环的计算中,经常忽略比较小的时间段,例如上面的外循环计算公式简化为:1530s X 255 = 390150s 390ms与精确计算值相比,误差为 2ms,在要求不是十分精确的情况下,这个误差是完全可单片机应用技术 第 4

39、 章 汇编语言程设计71以接受的。了解了延时时间的计算方法,本例我们使用三重循环结构。程序流程图如图 4.15 所示。内循环选择为 1ms,第二层循环达到延时 1 0ms(循环次数为 10) ,第三层循环延时到1s(循环次数为 100) 。第 二 层 循 环 R1 10YN结 束开 始R2-1=0?空 操 作内 循 环 R2 7DHNNR1-=0?R0-1=0?YY外 循 环 次 数 R0 10图 4.15 延时 1s 程序流程图(2) 汇编语言源程序段一般情况下,延时程序作为一个子程序段使用,不会独立运行它,否则单纯的延时没有实际意义。DELAY: MOV R0,#100 ;延时 1s 的循

40、环次数DEL2: MOV R1,#10 ;延时 10ms 的循环次数DEL1: MOV R2,#7DH ;延时 1ms 的循环次数DEL0: NOPNOPDJNZ R2,DEL0DJNZ R1,DEL1DJNZ R0,DEL2(3) 程序说明本例中第二层循环和外循环都采用了简化计算方法,编程关键是延时 1ms 的内循环程序如何编制。首先确定循环程序段的内容如下:NOP ;2sNOP ;2sDJNZ R2,DEL0 ;4s内循环次数设为 count,计算方法如下式:(一次循环时间) X count = 1ms从而得到 count = 1ms/(2s+2s+4s) = 125 = 7DH单片机应用

41、技术 第 4 章 汇编语言程设计72本例提供了一种延时程序的基本编制方法,若需要延时更长或更短时间,只要用同样的方法采用更多重或更少重的循环即可。值得注意的是,延时程序的目的是白白占用 CPU 一段时间,此时不能做任何其它工作,就像机器在不停地空转一样,这是程序延时的缺点。若在延时过程中需要 CPU 做指定的其它工作,就要采用单片机内部的硬件定时器或片外的定时芯片(如 8253 等) 。3. 数据传送程序例 4.8 不同存储区域之间的数据传输。将内部 RAM 30H 单元开始的内容依次传送到外部 RAM 0100H 单元开始的区域,直到遇到传送的内容是 0 为止。(1) 题意分析本例要解决的关

42、键问题是:数据块的传送和不同存储区域之间的数据传送。前者采用循环程序结构,以条件控制结束;后者采用间接寻址方式,以累加器 A 作为中间变量实现数据传输。程序流程图如图 4.16 所示。 R01NYDPTR(R0)AA(DPTR)A=0?开 始图 4.16 例 4.8 程序流程图(2) 汇编语言源程序ORG 0000HMOV R0,#30H ;R0 指向内部 RAM 数据区首地址MOV DPTR,#0100H ;DPTR 指向外部 RAM 数据区首地址TRANS: MOV A,R0 ;A(R0)MOVX DPTR,A ;(DPTR)ACJNE A,#00H,NEXTSJMP FINISH ;A=

43、0,传送完成NEXT: INC R0 ;修改地址指针INC DPTRAJMP TRANS ;继续传送FINISH: SJMP $END(3) 程序说明 间接寻址指令单片机应用技术 第 4 章 汇编语言程设计73在单片机指令系统中,对内部 RAM 读写数据有两种方式:直接寻址方式和间接寻址方式。例如:直接方式:MOV A,30H ; 内部 RAM (30H)累加器 A间接方式:MOV R0,#30H ; 30HR0MOV A,R0 ; 内部 RAM (R0)累加器 A对外部 RAM 的读写数据只有间接寻址方式,间接寻址寄存器有 R0、R1(寻址范围是00HFFH)和 DPTR(寻址范围 0000

44、HFFFFH,整个外部 RAM 区) 。 不同存储空间之间的数据传输MCS-51 系列单片机存储器结构的特点之一是存在着四种物理存储空间,即片内 RAM、片外 RAM、片内 ROM 和片外 ROM。不同的物理存储空间之间的数据传送一般以累加器 A 作为数据传输的中心,如图 4.17 所示。不同的存储空间是独立编址的,在传送指令中的区别在于不同的指令助记符,例如:MOV R0,#30HMOV A,R0 ;内部 RAM(30H)AMOVX A,R0 ;外部 RAM(30H)AARAM128RAMI/OSFR ROMMOVMOVMOVXMOVCMOV图 4.17 以累加器 A 为中心的不同存储空间的

45、数据传送示意图4.4.2 循环程序结构1. 循环程序组成从以上循环程序实例中,我们看到循环程序的特点是程序中含有可以重复执行的程序段。循环程序由以下四部分组成:(1)初始化部分。程序在进入循环处理之前必须先设立初值,例如循环次数计数器、工作寄存器以及其它变量的初始值等,为进入循环做准备。(2)循环体。循环体也称为循环处理部分,是循环程序的核心。循环体用于处理实际的数据,是重复执行部分。(3)循环控制。在重复执行循环体的过程中,不断修改和判别循环变量,直到符合循环结束条件。一般情况下,循环控制有以下几种方式: 计数循环如果循环次数已知,用计数器计数来控制循环次数,这种控制方式用得比较多。循环次数

46、要在初始化部分予置,在控制部分修改,每循环一次计数器内容减1。例 4.6、例 4.7 都属于计数循环控制方式。 条件控制循环在循环次数未知的情况下,一般通过设立结束条件来控制循环的结束,例 4.8 就是用条件 A=0 来控制循环结束。 开关量与逻辑尺控制循环这种方法经常用在过程控制程序设计中,这里不再单片机应用技术 第 4 章 汇编语言程设计74详述。(4)循环结束处理。这部分程序用于存放执行循环程序所得结果以及恢复各工作单元的初值等。2. 循环程序的基本结构循环程序通常有两种编制方法:一种是先处理再判断,另一种是先判断后处理。如图4.18 所示。初 始 化YN结 束开 始初 始 化YN结 束

47、开 始循 环 控 制循 环 结 束循 环 结 束循 环 控 制循 环 完 成循 环 处 理循 环 完 成循 环 处 理(a)先执行后判断 (b)先判断后执行图 4.18 循环程序的两种基本结构3. 多重循环结构程序有些复杂问题,必须采用多重循环的程序结构,即循环程序中包含循环程序或一个大循环中包含多个小循环程序,称为多重循环程序结构,又称循环嵌套。多重循环程序必须注意的是各重循环不能交叉,不能从外循环跳入内循环。例 4.7 的延时程序就是一个典型的三重循环结构。4. 循环程序与分支程序的比较循环程序本质上是分支程序的一种特殊形式,凡是分支程序可以使用的转移指令,循环程序一般都可以使用。并且由于

48、循环程序在程序设计中的重要性,单片机指令系统还专门提供了循环控制指令,如 DJNZ 等。4.5 查表程序在单片机汇编语言程序设计中,查表程序的应用非常广泛,在 LED 显示程序和键盘接口程序设计中都用到了查表程序段。例 4.9 在程序中定义一个 09 的平方表,利用查表指令找出累加器 A=05H 的平方值。(1) 题意分析所谓表格是指在程序中定义的一串有序的常数,如平方表、字型码、键码表等。因为程序一般都是固化在程序存储器(通常是只读存储器 ROM 类型)中,因此可以说表格是预先定义在程序的数据区中,然后和程序一起固化在 ROM 中的一串常数。查表程序的关键是表格的定义和如何实现查表。(2) 汇编语言源程序ORG 0000H单片机应用技术 第 4 章 汇编语言程设计75MOV DPTR,#TABLE ;表首地址DPTR(数据指针)MOV A,#05 ;05AMOVC A,A+DPTR ;查表指令,25A,A=19HSJMP $ ;程序暂停TABLE: DB 0,1,4,9,16,25,36,49,64,81 ;定义 09 平方表END(3) 程序说明从程序存储器中读数据时,只能先读到累加器 A 中,然后再送到题目要求的地方。单片机提供了两条专门用于查表操作的查表指令:MOVC A,A+DPTR ;(A+DPTR)AMOVC A,A+PC ;PC+1

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报