本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路...

70
本本本本本本 本本本本本本本本本 本本本本本本本本本本本 本本本本本本本本本本本 本本本 本本本本本本本 本本本本本本本本 本本本本本 80C51 本本本本本 本本本本本本本本本本本 本本本本本本本本本本本 本本本本本本本本本本本本本 本 3 本 本本本本本本本本

description

第 3 章 单片机的编程技术. 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用 80C51 常用伪指令 熟悉几种基本的程序结构 能读懂教材中的程序实例,学会编写同等难度的应用程序. 3.1 程序设计的方法和技巧. 3.1.1 程序设计流程. 单片机与一般集成电路的区别在于可编程应用,程序是单片机应用系统的灵魂。. 由于汇编语言是面向机器的语言,因此对单片机系统进行程序设计时必须考虑硬件资源的配置。当硬件系统设计完成后,可从以下几方面进行程序设计:. - PowerPoint PPT Presentation

Transcript of 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路...

Page 1: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

本章学习目标 :了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用80C51 常用伪指令 熟悉几种基本的程序结构 能读懂教材中的程序实例,学会编写同等难度的应用程序

第 3 章 单片机的编程技术

Page 2: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

单片机与一般集成电路的区别在于可编程应用,程序是单片机应用系统的灵魂。

3.1 程序设计的方法和技巧

3.1.1 程序设计流程

由于汇编语言是面向机器的语言,因此对单片机系统进行程序设计时必须考虑硬件资源的配置。当硬件系统设计完成后,可从以下几方面进行程序设计:

Page 3: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

1. 分析问题——针对现有条件,明确在程序设计时应该“做什么”

2. 确定算法——解决“怎样做”的问题

3. 绘制程序流程图——用图形的方法描绘解决问题的思路 (常用的程序流程图符号如图 3-1 所示)

4. 分配内存单元——确定程序和数据区的起始地址

5. 编写源程序——用指令的形式将程序流程图实现出来

6. 汇编——用开发机或仿真器将源程序转换成机器码,便于单片机识别

7. 在线仿真调试——查错、改错,对程序进行优化。

Page 4: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

常用的程序流程图符号如图 3-1 所示。

图 3-1 常用的程序流程图符号

Page 5: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

3.1.2 汇编语言编程技巧

尽量采用模块化程序设计方法 ;

这种设计方法是把一个完整的程序分成若干个功能相对独立的、较小的程序模块,对各个程序模块分别进行设计、编制程序和调试,最后把各个调试好的程序模块装配起来进行联调,最终成为一个有实用价值的程序。 模块化程序设计的优点是:对单个程序模块设计和调试比较方便、容易完成,一个模块可以被多个任务共用。尽量采用循环结构和子程序结构 ; 采用循环结构和子程序结构,可以使程序的总容量减小,提高程序的效率,节省内存。

Page 6: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

尽量少用无条件转移指令 ; 少用无条件转移指令,可以保证程序的条理更加清晰,从而减少错误发生。充分利用累加器; 累加器是主程序和子程序之间信息传递的桥梁,利用累加器传递入口参数或返回参数比较方便。这时,一般不要把累加器内容压入堆栈。对于通用子程序要保护现场; 由于子程序的通用性,除了保护子程序入口参数的寄存器内容外,还要对子程序中用到的其它寄存器内容一并入栈保护。 对于中断处理,还要保护程序状态字 在中断处理程序中,既要保护处理程序中用到的寄存器内容,还要保护程序状态字PSW。否则,当中断服务程序执行结束返回主程序时,整个程序的执行可能会被打乱。

Page 7: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

80C51 单片机汇编语言的语句行由 4 个字段组成,汇编程序能对这种格式正确地进行识别。这 4 个字段的格式为: [ 标号: ] 操作码  [操作数 ]  [ ;注释 ]

括号内的部分可根据实际情况取舍,各字段之间要用分隔符分隔。可用作分隔符的符号有冒号、空格、逗号、分号等。如: MAIN : MOV A , #68H ; A←68H

3.1.3 汇编语言的语句格式

Page 8: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

1.标号

标号是指令的符号地址。有了标号,程序中的其它语句才能很方便地访问该语句。有关标号的规定为:标号要由 1~ 8 个 ASCII 码字符组成,但必须以字母开 头,其余字符可以是字母、数字或其它特定字符。不能使用汇编语言已经定义了的符号作为标号,如指令 助记符 MOV 、伪指令记忆符 END 以及寄存器的符号名 称 R1等。标号后边必须跟冒号。同一标号在一个程序中只能定义一次,不能重复定义。

Page 9: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

2.操作码

操作码用于规定语句执行的操作。它用指令助记符或伪指令助记符表示,是汇编语句中唯一不能空缺的部分。3.操作数 操作数用于给指令的操作提供数据或地址。在一条语句中,可能没有操作数,也可能只有 1 个操作数,还可能同时包含 2~ 3 个操作数。各操作数之间要以逗号分隔。操作数一般以下面几种形式出现:常数工作寄存器名特殊功能寄存器名

Page 10: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

标号名符号“ $” ,表示程序计数器 PC的当前值。如: SJMP $表达式4.注释 注释不属于语句的功能部分,它只是对语句的解释说明,只要用“;”开头,就表明以下为注释内容。使用注释可使程序文件的编制显得更加清楚,便于编程人员的阅读和维护。注释的长度不限,一行不够可以换行接着书写,但换行后仍要以“;”开头。

Page 11: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

用户根据系统要求用汇编语言或高级语言编好的程序,叫源程序。

3.2.1 源程序的编辑和汇编

由于通用微型计算机的普及,现在单片机应用系统的

程序设计都借助于通用微型计算机。全过程可概括为“机器编辑→交叉汇编→串行传送”三个部骤,如图 3-2 所示。

3. 2 源程序的编制

Page 12: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

1. 编辑 将源程序输入计算机并进行修改的过程就是编辑。编辑工作一般在通用微型计算机上利用各种编辑软件完成,故又称其为机器编辑。编辑完成后,生成一个由汇编指令和伪指令共同组成的 ASCII码文件,其扩展名为“.ASM” 。

图 3-2 单片机汇编语言程序的生成过程

Page 13: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

计算机只能识别机器语言,但程序编制人员通常以汇编语言或高级语言编制源程序。这样,要让计算机能听从程序编制人员的指挥,就必须要将汇编语言或高级语言转换成机器语言,供计算机识别,这个过程称为汇编(或编译)。

汇编工作常由汇编软件来完成。汇编软件通常具有指令的错误识别与提示能力,为编程者迅速查找源程序中的错误提供了方便。在汇编过程中,我们只能发现源程序中的语法错误和一般性的逻辑错误,但不能检查程序结构上的错误。如果有错误,汇编软件会报告,指出错误位置及错误类型。程序错误被纠正后,要重新进行编译调试,直至程序汇编无误为止。

现在常用的汇编方法是交叉汇编,即用 PC机中的汇编程序去汇编 80C51 单片机中的源程序。汇编后生成的机器码称为目标程序,扩展名为“. OBJ”。该目标程序可通过 PC机的串行通信接口直接传送到开发系统的 RAM 中。

2. 汇编

Page 14: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

在前面的课题与实训环节中用到的 ORG和 END命令就是典型的伪指令,它们是为下一步的汇编工作提供起始地址和结束地址的。

我们知道,汇编语言程序的机器汇编是由计算机自动完成的,因此在源程序中应该有向汇编程序发出的命令。

这种在源程序中出现,通知汇编程序应该如何完成汇编工作的指令,就是伪指令。

下面介绍 80C51 单片机常用的伪指令。

3.2.2 伪指令

Page 15: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

1. ORG( Origin)汇编起始命令格式为: ORG 16 位地址或标号 该命令总是出现在源程序的开始位置。用来规定目标程序(即此

命令后面的程序或数据块)的起始地址。 ORG 后面通常是 16位地址,也可以是已定义的标号地址或表达式。如 ORG 1000H 。

在程序中如果不用 ORG 规定起始地址,则汇编得到的目标程序将从 0000H 开始存放。在一个源程序中, ORG 指令可以多次使用,但要求地址值要由小到大依序排列,且不能出现空间上的重叠。

2. END 汇编结束命令格式为: END 该命令用于中止源程序的汇编工作。 END 是汇编语言源程序的

结束标志,因此在整个源程序中只能有一条 END 指令,且位于程序的最后。如果 END 命令出现在源程序中间,对其后面的源程序,计算机将不予汇编。

Page 16: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

3. EQU( Equate)等值命令格式为: 标号名 EQU 表达式 该命令用来给标号赋值。赋值以后,其标号值在整个程序中有效。例如: DAT EQU 30H

4. DB (Define Byte) 定义字节命令格式为: [ 标号: ] DB 字节数据表 该命令用于从标号指定的地址开始,连续存放字节数据表,常与查表指令 MOVC 配合使用。其中字节数据表可以是一个或多个字节数据、字符串或表达式。例如: DB “hello”

Page 17: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

5. DW (Define Word)定义字命令格式为: [ 标号: ] DW 字数据表 该命令用于从标号指定的地址开始,连续存放 16位字

数据表。该数据表在程序存储器中存放的格式为:高 8位存放在低地址单元,低 8位存放在高地址单元。例如:

ORG 1000H

TABLE: DW 1234H, 66H

… …

汇编后 ,(1000H)=12H, (1001H)=34H, (1002H)=00H, (1003H)=66H 。

DB 和 DW 定义的数据表,数的个数不能超过 80 个。如遇数目较多时,可以使用多个定义命令。在 80C51 程序设计中,常用 DB 来定义数据, DW 来定义地址。

Page 18: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

6. BIT 定义位命令 格式为:标号名 BIT 位地址 该命令用来将位地址赋值给指定的标号名。例如:KAIGUAN BIT P1.0将 P1.0的位地址赋值给标号 KAIGUAN,在后面编程时就

可以用 KAIGUAN来代替P1.0。7. DS (Define Storage)定义空间命令格式为: [标号: ] DS 表达式 该命令用于从指定单元开始,预留一定数目的字节单元作

存储区,供程序运行使用。

Page 19: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

程序结构通常分为三种形式:顺序结构、分支结构、循环结构。形式如图 3-3 所示。

图 3-3 三种程序结构

3.3 基本程序结构

Page 20: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

顺序程序是最简单的程序结构,它既无分支,又无循环,在执行时单片机是按程序中指令的顺序逐条进行的。编程注意事项: 正确选择程序存放的地址:通常主程序起始地址在 0100H之后,但由于 80C51 单片机上电后从 0000H开始执行,所以必须在 0000H设一条转移指令,转至主程序首址。 要注意检查所用指令是否合法,在没有把握的情况下,最好查一下指令表。如,下面的指令是非法的: MOVX 2002H, 2000H 为使程序运行结束时不至于跑飞,可在程序最后加一条暂停指令,如: SJMP $。

3.3.1顺序程序

Page 21: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

例 1 将地址为 2000H 、 2001H 、 2002H 的片外数据存储单元的内容分别传送到 2002H 、 2003H 和 2004H 单元中去。

ORG 0000H

AJMP 0100H ;转到主程序起始地址 ORG 0100H

MOV DPTR , #2002H ;最后一个数据的起始地址 MOVX A , @DPTR ; 2002H 单元的数据送 A

MOV DPTR , #2004H ;最后一个数据的目的地址 MOVX @DPTR , A ; 2002H 单元的数据送 2004H 单

元 MOV DPTR , #2001H ;中间数据的起始地址

Page 22: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

MOVX A , @DPTR ; 2001H 单元的数据送 A

MOV DPTR , #2003H ;中间数据的目的地址

MOVX @DPTR , A ; 2001H 单元的数据送 2003H 单元

MOV DPTR , #2000H ;第一个数据的起始地址

MOVX A , @DPTR ; 2000H 单元的数据送 A

MOV DPTR , #2002H ;第一个数据的目的地址

MOVX @DPTR , A ; 2000H 单元的数据送 2002H 单元

SJMP $

END

<想一想 > 还可以怎样修改?

Page 23: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

例 2 已知 30H 单元存有 8位二进制数的 BCD 码,请将其转换为共阴显示的字形码,然后从 P1 口输出。

设这些字形码存放在标号为 TABLE 的存储单元。程序如下: ORG 0000H

AJMP MAIN ;转到主程序起始地址 ORG 0100H

MAIN : MOV DPTR , #TABLE ;字形码表首地址送 DPTR

MOV A , 30H ;取数 MOVC A , @A+DPTR ;查表取值送 A

MOV P1 , A ;字形码送 P1

SJMP $

TABLE : DB 3FH , 06H , 5BH , 4FH , 66H ; 0~ 4 共阴字形码 DB 6DH , 7DH , 07H , 7FH , 6FH ; 5~ 9 共阴字形码 END

2.查表程序

Page 24: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

通常情况下,程序是顺序执行的,但我们也可以根据需要,在程序中安排一些控制转移指令,改变程序的执行方向,这就是分支程序。分支程序可以分为单分支和多分支等情况。

单分支程序结构如图 3-3 ( b )所示。当条件满足时顺序执行程序段 A ,否则执行程序段 B 。 多分支结构如图 3-4 所示。先将分支按序号排列,然后按照分支的值来实现多分支选择。

图 3-4 多分支结构

3.3.2 分支程序

Page 25: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

分支程序在单片机系统中应用较多,在编程时有许多技巧,设计要点如下:

(1) 先建立可供条件转移指令测试的条件。 (2) 选用合适的条件转移指令。(3)在转移的目的地址处设定标号。

Page 26: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

3 已知内 RAM30H单元存有一个 ASCII码,试对其进行判断,如果是“ $” ( 24H),将其存入 40H,否则存入 31H单元。程序如下: ORG 0000H

AJMP MAIN

ORG 0100H

MAIN : MOV A , 30H

CJNE A , #24H , DY31 ; 不是“ $” ,转去 ZY31

MOV 40H , A ;是“ $” ,存入 40H 单元 AJMP END0

DY31 : MOV 31H , A ; 不是 $ ,存入 31H 单元END0 : SJMP $

END

1.单分支程序

Page 27: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

( 1 ) 位操作程序例 4 已知某信号灯电路如图 3-5 ,试编程实现如下功能: ⑴ S0 单独按下,红灯亮,其余灯灭; ⑵ S1 单独按下,绿灯亮,其余灯灭; ⑶ S0、 S1均按下,红、绿、黄灯全亮; ⑷都不按下黄灯亮。

图 3-5 某信号灯电路

参考程序如下: ORG 0000H

LJMP START

ORG 0100H

START : ORL P1 , #11000111B ; P1.6 、 P1.7 设为输入,红绿黄灯灭

2.多分支程序

Page 28: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

SS0 : JB P1.7 , SS1 ; S0未按,转判 S1 JB P1.6 , RED ; S0按下, S1未按,转红灯亮 DL : CLR P1.2 ;红灯亮 CLR P1.1 ;绿灯亮 CLR P1.0 ;黄灯亮 SJMP SS0 ;重新检测 SS1 : JB P1.6 , YELLOW ; S0未按, S1未按,转黄灯亮 GREEN : CLR P1.1 ;绿灯亮 SETB P1.2 ;红灯灭 SETB P1.0 ;黄灯灭 SJMP SS0 RED : CLR P1.2 ;红灯亮 SETB P1.1 ;绿灯灭 SETB P1.0 ;黄灯灭 SJMP SS0

Page 29: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

YELLOW : CLR P1.0 ;黄灯亮 SETB P1.2 ;红灯灭 SETB P1.1 ;绿灯灭 SJMP SS0

END

说明:该程序只是说明位操作指令在分支程序中的应用方法,如果真要实现信号灯的点亮,还要在每段灯亮灭指令后加一段延时程序。

Page 30: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

例 5 有一巡回检测报警装置,需对 16路输入信号进行控制,每路设有一个报警上限值(等于或超出此值即报警,置报警标志 F0 ),设 16路输入信号存放在以 50H 为首地址的内 RAM 中, 16 路报警上限值存在以 2000H 为首地址的 ROM 中,试编制该程序。

程序如下: START: MOV DPTR , #2000H ;置 16 路报警上限值首地址 MOV R0 , #50H ;置 16 路输入信号数据区首地址 MOV R7 , #0 ;置 16 路输入信号的序号 0

LOOP : MOV R1 , @R0 ;检测信号存 R1

MOV A , R7 ;读输入信号序号 MOVC A,@A+DPTR; 查找该序号对应的报警上限值 CJNE A , R1 , NEXT ;与对应的输入信号比较 AJMP ALAM ;输入信号等于报警上限值,转报警

( 1 )字节操作程序

Page 31: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

NEXT : JC ALAM ;输入信号超出报警上限值,转报警 INC R0 ;输入信号小于报警上限值,指向下 一路输入信号 INC R7 ;指向下一路输入信号序号 CJNE R7 , #16 , LOOP ;看 16 路是否全查完? 未完继续 CLR F0 ; 16 路全查完,清报警标志 AJMP $ ;暂停 ALAM : SETB F0 ;置报警标志 RET

Page 32: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

3.3.3 循环程序

1.循环结构 在程序设计时,常常遇到需要反复执行的某种操作,这时可编写一个程序段重复执行,这就是循环。循环程序一般包括 4部分,如图 3-6 所示。对这 4部分的含义,我们以例题的形式加以说明。 例 6 编程实现以下数据传送功能:将 BUF为起始地址的50个数取反后,传送到以 DATA为起始地址的内存单元中。

Page 33: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

分析:如果采用顺序结构编写,程序会很麻烦,要执行 50次从源地址中取数的 MOV 指令, 50次数据取反的 CPL 指令, 50次向目的地址送数的 MOV 指令。经过观察,我们发现,可以把顺序结构中重复执行的部分提取出来,编成一个独立的小程序段(即循环体部分),然后对这个小程序段重复执行 50次(循环次数),这就构成了循环。

图 3-6 循环结构

Page 34: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

1.初始化 规定循环体中各控制变量的初始状态。 2. 循环体 这是循环程序需要重复执行的部分。对这部分编程的时候

要注意两个问题:

指令要具有通用性,程序要便于修改。

程序尽可能简化。

Page 35: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

(3)循环修改 循环程序每执行一次,都要对数据的地址指针、循环次

数等作一次修改,这就是循环修改。

(4)循环控制

根据循环结束条件,判断循环是否结束。常用作循环控制的变量是循环次数。

Page 36: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

参考程序如下: START : MOV R0 , #SBUF ;数据的源地址 MOV R1 , #DATA ;数据的目的地址 MOV R7 , #50 ;循环次数 LOOP : MOV A , @R0 ; 源地址中数据送 A

CPL A ;取反 MOV @R1 , A ;取反后的数据送目的地址 INC R0 ;源地址加 1 ,准备取下一个数 INC R1 ;目的地址加 1 ,准备接收下一个数 DJNZ R7 , LOOP ;循环结束?未结束重新取数 RET

循环程序按结构分,有单重循环与多重循环。在多重循环中,只允许外重循环嵌套内重循环;不允许循环相互交叉,也不允许从循环程序的外部跳入循环程序的内部。

Page 37: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

2.循环结构的典型应用——定时

在单片机控制系统中,常有定时的需要,如定时中断、定时检测、定时扫描等。定时功能可以使用定时 /计数器实现,但更多的是使用定时程序完成。

定时程序是典型的循环程序,它通过执行一个具有固定延时时间的循环体来实现时间的推移,因此,又常把定时程序叫做延时程序。定时程序的延时时间不受器件的限制,只要选择好循环初值,就可以实现几秒、几分、乃至几年的时间延迟。

Page 38: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

(1)单循环延时 单循环延时是最简单的定时程序。如: DELAY: MOV R7, #TIME ; TIME是循环程序控制变 ;量,可以取任意值 LOOP: NOP NOP NOP DJNZ R7, LOOP 其中的 NOP是空操作指令,它不做任何操作,只是消磨时间。该程序段的延时时间可以这样计算:NOP指令的机器周期是 1 , DJNZ指令的机器周期是 2 ,因此循环一次共需 5个机器周期。如果单片机的晶振频率采用 12MHz,则一个机器周期是 1μs,因此循环一次的延迟时间是 5μs。

Page 39: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

延时程序中总的延时时间为 5×TIME ( μs ),根据程序的需要, TIME 可以任意取值(不超过 8位二进制的表示范围)。因此该程序的最长延时时间是( TIME=0 时)

5×256=1280 ( μs ) (2)较长时间的延时 单循环延时的延迟时间较短,为了延长定时时间,可以

采用多重循环的方法。 例 7 编写延时 1s 子程序,要求:晶振采用 12MHz ,

用三重循环编写。 分析:用 12MHz 晶振,机器周期是 1μs, 程序如下: DELAY : MOV R7 , #20 ; 1μs D1 : MOV R6 , #200 ; 1μs D2 : MOV R5 , #123 ; 1μs

Page 40: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

NOP ; 1μs DJNZ R5 , $ ; 2μs ,共( 2×123 ) μs DJNZ R6 , D2 ; 2μs ,共〔( 2×123+2+2 ) ×200〕 μs ,即 50ms DJNZ R7 , D1 ; 2μs ,共〔( 2×123+2+2 ) ×200+2+1〕 ×20+2=1000062μs≈1s RET ; 2μs

在该程序中,改变不同的寄存器初值,可以实现不同的定时要求。

(3)以一个基本的延时程序满足不同的定时要求 如果系统中有多个定时需要,我们可以先设计一个基本的延时程序,通过对这个基本延时程序的调用,实现所需的不同定时。如将例 7延时 1秒的 DELAY作为基本的延时程序,则实现 5秒、 10秒的调用情况如下:

Page 41: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

MOV R0 , #5 ; 5s

LOOP1 : ACALL DELAY ; 1s

DJNZ R0 , LOOP1

……

MOV R0 , #10 ; 10s

LOOP2 : ACALL DELAY ; 1s

DJNZ R0 , LOOP2

……

例 8 已知某单片机温控系统每隔 50ms测一次温度,测得的 8位温度值存在特殊功能寄存器 SBUF 中,请编程求其 1

s 的平均值,并存于 60H 中。(设 1s 采样温度总和不超过 25

5 ) 程序如下: AVR1S : MOV R2 , #0 ;温度初值为 0

MOV R4 , #20 ;平均次数为 20

Page 42: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

LOOP : MOV A , SBUF ;读温度值 ADD A , R2 ; 温度求和 MOV R2 , A ;回存 LCALL DELAY50 ;延时 50ms ,延时子程序略 DJNZ R4 , LOOP ; 20次采样完否?未完继续 MOV A , R2 ;和存入 A

MOV B , #20 ;除数存入 B

DIV AB ;求均值 MOV 60H , A

RET

请尝试编写延时 50ms 子程序。

Page 43: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

3.4 程序设计实例

3.4.1 数据极值查找程序

极值查找就是在指定的数据区中挑出最大值或最小值。 例 9 从内部 RAM30H 单元开始存有 8 个无符号 8位二进制数,请编程查找到最大值,并将其存放于 40H 单元。 分析:假定在比较过程中,用 A存放大数,与之逐个比较的另一个数存放在 2AH 单元。流程图见图 3-7。

图 3-7最大值查找程序流程图

Page 44: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

程序如下: MOV R1 , #30H ;数据区首址 MOV R5 , #08H ;数据区长度 MOV A , @R1 ;读第一个数 DEC R5 ;修改数据长度 LOOP : INC R1

MOV 2AH , @R1 ;读下一个数 CJNE A , 2AH , BJ ;数值比较 AJMP LOOP1

BJ : JNC LOOP1 ; A 值大,转移 MOV A , @R1 ;大数送 A

LOOP1 : DJNZ R5 , LOOP ;继续 MOV 40H , A ;最大值送 40H

SJMP $

Page 45: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

3.4.2 数码转换程序 数码转换通常采用子程序调用的方法进行,即由子程序完成具体的转换功能,而由主程序组织数据和安排结果。 例 10 在内部 RAM 的 SHU16 单元存有两位十六进制数,请将其转换成 ASCII 码,并存放于 ASCL(低位的 ASCII 码 ) 和 ASCH( 高位的 ASCII 码 ) 两单元。 主程序如下: MAIN : MOV SP , #5FH ;设堆栈指针 PUSH SHU16 ; 16 进制数进栈 ACALL ASC16 ;调转换子程序 POP ASCL ;第一位转换结果送 ASCL MOV A , SHU16 ;再取原 16 进制数 SWAP A ;高低半字节交换 PUSH ACC ;交换后的 16 进制数进栈 ACALL ASC16 ;转换 POP ASCH ;第二位转换结果送 ASCH SJMP $

Page 46: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

子程序如下: ASC16 : DEC SP ;跳过断点保护内容 PC

DEC SP

POP ACC ;弹出转换数据 ANL A , #0FH ;屏蔽高位 ADD A, #7 ;修改变址寄存器指针 MOVC A, @A+PC ;查表 PUSH ACC ; 2字节,查表结果进栈 INC SP ;2字节,修改断点指针回到断点保护内容 INC SP ; 2字节, RET ; 1字节, ASCTAB : DB '012345678' ; ASCII 码表 DB '9ABCDEF'

END

Page 47: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

这是一个很典型的程序,在阅读时应注意这样两个问题: ( 1)该程序强化了堆栈的使用,这对于大家加深理解堆栈的概念十分有利。在程序中用到了两种使用堆栈的方法:

用堆栈传递数据。使要转换的 16进制数在主程序中进栈( PUSH SHU16 )而在子程序中出栈( POP ACC ),最后再通过堆栈把转换结果返回主程序 ( POP ASCL)。低位转换其堆栈的变化见图 3-8; 系统在调用子程序时自动完成的 PC入栈操作。由于 要转换的 16进制数是在主程序中先于断点值 PC ( ACALL ASC16下一条指令的地址)入栈,这样在 子程序中要取出转换数据,就得修改堆栈指针 SP , 以指向该数据。

Page 48: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

( 2 )在 ASCII 码表中,是以字符串的形式列出的 16 进制数,但在汇编的过程中,写入存储单元的是该字符串的 ASCII码形式。

图 3-8 数码转换程序的堆栈变化图

Page 49: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

3.4.3课题与实训 4 程序设计

一.实训目的 1.熟悉汇编语言的基本格式、伪指令的使用方法。 2.学习单片机应用程序的设计方法。二.课题要求 1.将 60H~69H单元存放的 10个无符号数按照从小到大的顺序重新排列。 2.选择课后思考题与习题的部分程序运行并调试出来。

三.背景知识 可采用冒泡排序法。冒泡排序法把一批数据想象成纵向排列,采用自下而上的方法比较相邻两个数据,如果这两个数据的大小顺序符合要求,则保持原样,否则交换它们的位置。这样比较一轮后,最小的数据就像气泡一样浮到最顶上,故称冒泡排序法。

Page 50: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

实际编程设计时,每一轮操作都从数据区的首地址开始,向末端推进。一般来讲, N 个数据要进行 N- 1轮次比较和交换排序。表 3-1表示了 60H~65H 单元存储数据的冒泡排序的执行过程。

表 3-1 冒泡排序过程说明

Page 51: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

假定 60H~65H 单元存储的原始数据为无序数列,从最上面开始进行相邻两个数据的比较,大的数据放上面,小的数据放下面。第一轮操作, 6 个数据进行 6- 1= 5次比较,最大数据 58“沉淀”到最下面( 65H 单元)。第二轮操作 58

不参加, 5 个数据需比较 6- 2= 4次, 5 个数据中的最大值 36“沉淀”到 64H 单元。对于本例,经过三轮操作就可以完成排序。 采用冒泡排序法,一般应设立一个标志位,在每轮开始时将标志位清 0 ,在操作过程中出现位置交换,标志位置 1 ,每轮结束时若标志位为 0 ,则说明数据已经有序,可以提前结束排序,从而提高了效率。

Page 52: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

图3-9

冒泡排序流程图

四.程序流程图

Page 53: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

3.4.4课题与实训 5 交通灯的设计

一.实训目的 1.进一步熟悉单片机 I/O接口的线路连接。 2.学习顺序控制程序的编程技术。 二.课题要求 用仿真器的 P1 口控制 4只双色 LED灯,来模拟十字路口交通灯的工作方式, 本次实训交通灯变化规律如下:假设一个十字路口是东西南北走向。初始状态为东西南北均红灯。停顿 1秒后转状态 S1 (南北绿灯,东西红灯)。延时 20秒,转 S2 (南北绿灯闪 3次变黄灯 ,东西红灯)。再转 S3 (东西绿灯,南北红灯)。延时 20秒,转 S4 (东西绿灯闪 3次变黄灯 ,

南北红灯)。最后跳转至 S1 循环。

Page 54: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

三.背景知识 双色 LED灯有三只引脚,工作时,中间引脚接地,另外两支引脚单独接高电平时,一种亮红光,一种亮绿光,两只引脚同时接高电平时,亮黄光。在本次实训线路中,P1.0~ P1.3接双色 LED 的绿灯引脚,当 P1.0~ P1.3输出 1 时,相应灯亮绿光, P1.4~ P1.7接双色LED 的红灯引脚,当 P1.4~ P1.7

输出 1 时,相应灯亮红光,如果 P

1.0 和 P1.4同时为 1 ,则 RG南亮黄光,其余道理与此相同。 四.硬件电路 (见图 3-10 )

图 3-10 交通灯电路

Page 55: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

ORG 0000HLJMP STARTORG 0100H

START : MOV SP,#60H MOV A,#0F0H ;初始状态 (红灯 )

MOV P1,AMOV R2,#10 ;延时 1秒 LCALL DELAY

S1 : MOV A,#69H ;南北绿灯 ,东西红灯 MOV P1,A

MOV R2,#200 ;延时 20秒 LCALL DELAY S2 : MOV R3,#03H ;南北绿灯闪 3次变黄灯 ,东西红灯 GLIS : MOV A,#69H

 五.软件设计

Page 56: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

MOV P1,A MOV R2,#03H LCALL DELAY MOV A,#60H MOV P1,A MOV R2,#03H LCALL DELAY DJNZ R3,GLIS MOV A,#0F9H MOV P1,A MOV R2,#10 ;延时 1秒 LCALL DELAY

S3 : MOV A,#96H ;南北红灯 ,东西绿灯 MOV P1,A MOV R2,#200 ;延时 20秒 LCALL DELAY

Page 57: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

S4 : MOV R3,#03H ;东西绿灯闪 3次变黄灯 ,南北红灯GLIS1 : MOV A,#96H

MOV P1,A MOV R2,#03H LCALL DELAY MOV A,#90H MOV P1,A MOV R2,#03H LCALL DELAY DJNZ R3, GLIS1 MOV A,#0F6H MOV P1,A MOV R2,#10 ;延时 1秒 LCALL DELAY LJMP S1

Page 58: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

DELAY : MOV R1,#200 ;延时程序 D1 : MOV R0,#248 ;延时 100毫秒 DJNZ R0,$

DJNZ R1,D1

DJNZ R2,DELAY

RET

END

六.总结与思考 本实训电路只是用单片机模拟交通灯的管理,真正的交通灯还要考虑到灯的驱动等实际问题。 想一想,如果采用建表方式,程序该如何设计?

Page 59: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

3.4.5 课题与实训 6 以循环方式实现流水灯

一.实训目的 1.进一步熟悉单片机 I/O接口的线路连接。 2.学习循环程序的编程技术。 二.课题要求 用单片机的 P1 口控制 8只 LED灯,作 P1.0→P1.1

→P1.2→P1.3→P1.4→P1.5→P1.6→P1.7 的依次单灯点亮,间隔 0.2秒,接下来 8只 LED灯全灭 1次,间隔 0.

2秒;然后作 P1.7→P1.6→P1.5→P1.4→P1.3→P1.2→

P1.1→P1.0 的依次单灯点亮,间隔 0.2秒,接下来 8只LED灯全灭 1次,间隔 0.2秒,再从开始状态循环, 8

只 LED灯即呈现出流水灯的状态。

Page 60: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

三.背景知识 循环程序用于需要多次反复执行的相同操作,因此在编制程序时,首先应该确定的就是有哪些相同的操作可由循环部分实现。在该实训中,我们用数据传送指令向 P1.0→P1.

7 一次送数,所以对送出数据的处理过程就是相同的;延时时间都是 0.2秒,这也是相同的,这两部分都可以用循环来实现。 在编制具体的循环程序时,要设置一个存放循环次数的寄存器,通常选用 R2~ R7 中的任何一个来实现( R0 和R1 常用于寄存器间接寻址。当然,程序中如果不采用间接寻址方式, R0 和 R1也可用来存放循环次数)。程序每循环一次,循环次数寄存器内容要减 1 ,当该寄存器内容减到0 时,表示循环结束,这两个过程可用 DJNZ 指令实现。

Page 61: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

四.硬件电路

图3-11

流水灯电路

Page 62: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

参考程序如下: ORG 0000H START: MOV   A,#0FFH ;设初值 MOV   R0,#8   ;移动八次 CLR   C   ;将 CY 清 0 LOOP1: RLC   A   ;带进位位循环左移 MOV   P1,A   ;送 P1 口 ,P1.0灯亮 ACALL   DELAY ;调延时 DJNZ R0,  LOOP1 ;判断是否左移 8次 MOV  A,#0FFH ;够八次 ,灯全灭 MOV   P1,A ACALL   DELAY MOV   A,#0FFH ;设初值 MOV   R0,#8  ;移动八次 CLR   C   ;将 CY 清 0

五.软件设计

Page 63: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

LOOP2: RRC   A   ;带进位位循环右移 MOV   P1,A ;送 P1 口 ,P1.7灯亮 ACALL   DELAY DJNZ   R0,LOOP2 ;判断是否右移 8次 MOV   A,#0FFH ;够八次 ,灯全灭 MOV   P1,A ACALL   DELAY AJMP   START ;重新开始 DELAY: MOV   R5,#4 ;延时 0.2秒 D1: MOV   R6,#200 D2: MOV   R7,#123 NOP DJNZ   R7,$ DJNZ   R6,D2

Page 64: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

DJNZ   R5,D1 RET END 六.总结与提高 仍采用该实训电路,每次点亮两个灯,其它功能不变,程序如何修改?如果只作 P1.0→P1.1→P1.2→P1.3→P1.4→P1.5→P1.6→P1.7→P1.6→P1.5→P1.4→P1.3→P1.2→P1.1→P1.0 的循环闪烁,间隔 0.2秒,程序又如何修改?

Page 65: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

本 章 小 结

用汇编语言编制的源程序结构紧凑、直观易读,汇编后生成的目标程序更有运行速度快、占用空间小、实时性强、便于优化等特点,所以尽管它的通用性较差,程序难以移植,但在单片机应用系统中仍然得到了广泛的应用。 在程序设计时,通常按照这样几步进行: 分析问题→确定算法→绘制程序流程图→分配内存单元→编写源程序→汇编→在线仿真调试。在平时的训练中,同学们要养成用模块化思想设计程序的习惯,编程时尽量采用循环结构和子程序结构,充分利用累加器 A,并注意在子程序中保护好现场。

Page 66: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

80C51 单片机汇编语言的语句行由 4个字段组成,汇编程序能对这种格式正确识别。伪指令是程序员发给汇编程序的命令。它不参与任何执行操作,只是提供汇编的格式要求,因此,只有在汇编前的源程序中才有伪指令,而经过汇编得到目标程序后,伪指令已无存在的必要,故伪指令没有机器代码。 单片机应用系统设计的一个重要环节就是程序设计,这是实践性要求较强的一种应用技能,需要经过大量的编程训练和实际经验的积累才能实现,因此要求大家在课下要勤动脑、多动手,“只看不练”是学不好单片机的。

Page 67: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

思考题与习题1 .利用 80C51 单片机汇编语言进行程序设计的步骤是什么?2 .汇编语言的语句格式如何?其中哪一部分是不能省略的?3 .源程序为什么要进行编辑和编译?用汇编语言编辑的源程 序的扩展名是什么? 最后生成的目标程序的扩展名又是什 么 ?4 .什么是伪指令?伪指令和指令有什么区别?常用的伪指 令有哪些?5 .基本的程序结构有哪几种?特点如何?6 .试编写程序将内 RAM 以 30H 为起始地址的数据块传送到 以 BUF为起始地址的内 RAM区域,遇 0 中止。7.编一程序将数 00H 存入 20H 单元,存入后通过读出检查是 否确实存入?然后再将数 FFH 存入 21H 单元,再检查是否确 实存入?如两次检查都正确,将 60H 单元置 00H ,否则置 11H 。

Page 68: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

8 .编写一个子程序,将单字节 16 进制数的高、低两个半字 节分别转换成 ASCII码。9.设 60H 单元有一个 8位二进制数,该数的 8位中某 1 位为“ 1”,编一程序检查“ 1”在哪一位。如在第 0 位,则在 30H 单元中写入数 00H ,如在第 1 位,则在 30H 单元中写入数 01H ,…以此类推。10. 编一程序检查 P1 口的 8位中为“ 1”的位有几个?并将统计结果存于 50H 单元。11.已知内 RAM30H 单元存放着一个数据 X,试编程求出下 面的函数值 Y,并存入 FUN 单元。

0 X 1-

0X 0

0X 1

Y

思考题与习题

Page 69: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

12 .若 80C51 的晶振频率为 6MHz,试计算延时子程序的延 时时间。 DELAY: MOV R7, #0F6H LP : MOV R6 , #0FAH DJNZ R6 , $ DJNZ R7, LP RET13 .编一程序将 30H-3FH 单元的数据送到 P1口输出,每送 一个数据延时 10ms 再接着送第 2 个,直至数全部送完为止。14.使用 DJNZ指令实现 20ms的软件延时。设单片机的晶 振为 12MHz。15.已知内 RAM30H 单元存放着 8 的 ASCII码( 38H ),试编 程求其 BCD 码。

思考题与习题

Page 70: 本章学习目标 : 了解汇编语言的特点,明确程序设计的基本思路 熟悉汇编语言的语句结构,能正确书写汇编语言程序 理解伪指令的功能,能正确使用

16 .内 RAM 的 DATA 单元存放着一个小于 20的无符号数,阅 读下面程序,说明其功能。 MOV R1 , #DATA MOV A , @R1 RL A MOV R0 , A RL A RL A ADD A , R0 MOV @R1 , A 17.试编写程序将内 RAM 从 60H 开始存放的 10个数据传送到 外 RAM 以 BUF开始的区域。 18 .试编写程序将内 RAM 以 DAT为起点的 10个单元中的数据 求和(设和不大于 255 ),并将结果送入 SUM 单元。

思考题与习题