1 / 64

3 .1 实 训 概 要 程序是一系列有序指令的集合。单片机通过执行程序完成相应的任务。

第 3 章 汇编语言程序设计. 3 .1 实 训 概 要 程序是一系列有序指令的集合。单片机通过执行程序完成相应的任务。 程序设计的任务就是根据任务的要求,给出解决问题的步骤和算法,编制程序的过程。学习完指令系统后,就具备了程序设计的基础。汇编语言程序设计不但技巧性强,而且还有软硬件结合的特点。设计出的程序质量好坏,直接关系到单片机应用系统的特性和运行效率。为了能够编制出高质量的程序,必须从一个个程序模块的学习开始,通过熟读多练,反复上机训练,才能逐步掌握程序设计的方法和技巧。. 实训内容: 顺序程序设计。 分支程序设计。 循环程序设计。

macy
Download Presentation

3 .1 实 训 概 要 程序是一系列有序指令的集合。单片机通过执行程序完成相应的任务。

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第3章 汇编语言程序设计 3 .1 实 训 概 要 程序是一系列有序指令的集合。单片机通过执行程序完成相应的任务。 程序设计的任务就是根据任务的要求,给出解决问题的步骤和算法,编制程序的过程。学习完指令系统后,就具备了程序设计的基础。汇编语言程序设计不但技巧性强,而且还有软硬件结合的特点。设计出的程序质量好坏,直接关系到单片机应用系统的特性和运行效率。为了能够编制出高质量的程序,必须从一个个程序模块的学习开始,通过熟读多练,反复上机训练,才能逐步掌握程序设计的方法和技巧。

  2. 实训内容: 顺序程序设计。 分支程序设计。 循环程序设计。 子程序设计。

  3. 预备知识: • 汇编语言程序设计的一般步骤: • 分析问题。根据给出的问题,熟悉和明确问题的要求,明确已知条件及对运算和控制的要求,建立数学模型。 • 确定解题算法。根据实际问题的要求和指令系统的特点,选择解决问题的方法。算法是程序设计的依据,它决定了程序的正确性和程序的质量。 • 画出程序流程图。程序流程图就是用各种规定的图形、流程线和简洁的文字表达解题步骤的一种图形。它直观、清晰地体现了程序设计思路,是程序的逻辑设计过程。

  4. 资源分配。算法确定后,要为每一个变量、各种指针、计数器等分配工作单元,定义数据类型和数据结构。资源分配。算法确定后,要为每一个变量、各种指针、计数器等分配工作单元,定义数据类型和数据结构。 • 根据程序流程图及资源分配情况,写出汇编语言源程序。 • 上机调试。 • 汇编语言源程序的一般结构: • 在程序设计中将会遇到各种类型的程序,但不论程序如何复杂,都可以分为如下基本结构: • 顺序结构 • 分支结构 • 循环结构 • 子程序结构

  5. 入口 入口 入口 满足条件? M 满足条件? N M M N P 改变条件? 出口 出口 出口 其中顺序结构、分支结构和循环结构为三中基本结构。其结构流程如图3-1所示。

  6. 3 .2 实训9 顺序程序设计训练 3.2.1 实训目的 通过本节实训,主要学习下面内容: 顺序程序的结构。 顺序程序设计的编程方法。 顺序结构程序的调试方法。

  7. 3.2.2 实训要求 1.双字求和。设有两个四字节二进制数,分别存放在片内RAM30H和40H开始的单元中,先存低字节。求两数之和,并将和存于50H开始的单元中。 2.双字节二进制无符号数乘法。 3.2.3 实训预习 预习内容 (1)掌握顺序程序的结构。 (2)复习片内数据存储器地址范围。 (3)复习数据传送指令和二进制加法指令的功能。 (4)复习乘法指令的功能。

  8. 程序设计基本思路 (1)双字求和 编写程序前要掌握片内RAM的结构。MCS-51单片机片内RAM一个存储单元为一个字节,以字节为单位编址。因此,每个加数和结果各占四个字节。按照加法的相加思路,先做低字节相加,然后做高位字节相加。 例如:

  9. 进行多字节加法运算时,低字节应选择不带进位加法指令ADD。其它字节相加时应选择带进位加法指令ADDC,将低位的进位值加入。进行多字节加法运算时,低字节应选择不带进位加法指令ADD。其它字节相加时应选择带进位加法指令ADDC,将低位的进位值加入。 (2)双字节二进制无符号数乘法 双字节二进制无符号数乘法的运算过程类似于一般十进制运算。首先进行资源分配:设被乘数存放在工作寄存器R2、R3中,乘数存放在R6、R7中。乘积存放在R2、R3、R4和R5中。然后进行运算,先算低字节,并保存中间和,再计算高字节,将中间和累加。

  10. 3.2.4 实训器材 MCS-51单片机开发系统 3.2.5 实训程序 1.多字节加法实训程序如表3-1所示。

  11. 2.双字节乘法实训程序如表3-2所示。

  12. 3.2.6 实训步骤 (1)阅读并理解程序,并画出两个程序的流程图。 (2)将机器码送入单片机系统中,并检查是否正确。 (3)对于多字节加法实训程序,运行程序前,将两个四字节数据分别送入30H和40H开始的单元中。

  13. (4)单步执行程序,并将运行结果记录在表3-3中。(4)单步执行程序,并将运行结果记录在表3-3中。 12 34 56 78H + 23 45 67 89H = ? AB CD EF 01H + 94 39 82 71H = ? 2A 3B 4C 5DH + 3F 4E 5D 6CH = ? (5)对于双字节乘法实训程序,运行程序前,将被乘数和乘数分别送入工作寄存器R2、R3和R6、R7中,执行程序,并记录结果。程序运行结果表格请读者自行设计。

  14. 3.2.7 思考与讨论 1.如何将程序改成十字节加法运算,编写程序并上机验证。 2.编写四字节减法程序,要求被减数和减数分别存放在片内RAM30H和50H开始的单元中,差存放在60H开始的单元。上机验证。 3.使用减法指令时应注意什么问题?

  15. 提示: 多字节加法实训程序可以考虑用循环结构完成,通过固定次数循环实现多字节相加。 双字节乘法程序由于要保护中间和,占用的片内RAM单元较多,可考虑使用堆栈,但不能和工作寄存器组发生冲突。

  16. 3 .3 实训10 分支程序设计训练 3.3.1 实训目的 通过本节实训,主要学习下面内容: 分支程序的结构。 分支程序设计的编程方法。 分支结构程序的调试方法。 通过散转指令实现多分支程序设计方法。

  17. 3.3.2 实训要求 设单片机片内数据存储器20H单元存放00H~03H四个不同的数。根据20H中存放数据的不同,在LED七段显示器上显示循环左移的数字0、1、2、3。即:

  18. 3.3.3 实训预习 JMP @A+DPTR 是一条散转指令。它常用于多分支选择程序中。数据指针DPTR作为基址寄存器,决定多分支程序的首地址,用累加器ACC作为变址寄存器来动态地选择某一分支,来实现多分支转移。该指令采用基址寄存器加变址寄存器间接寻址方式,将DPTR和ACC内容相加作为地址,该地址传送到程序计数器PC中。

  19. 为了在单片机开发系统上显示数字,必须了解所使用的单片机开发系统的显示器控制接口,通常用多功能接口芯片8155控制键盘和显示器。了解其字形口和字位口地址。(本系统字形口地址为0FF22H,字位口地址为0FF21H)。为了在单片机开发系统上显示数字,必须了解所使用的单片机开发系统的显示器控制接口,通常用多功能接口芯片8155控制键盘和显示器。了解其字形口和字位口地址。(本系统字形口地址为0FF22H,字位口地址为0FF21H)。 同时,还应了解所用单片机开发系统的LED显示器是共阴极型还是共阳极型。以便给出其不同的字形码。不同类型LED字形码如表3-4所示。本系统采用共阳极型LED。 表3-4 七段LED字形码

  20. 3.3.4 实训器材MCS-51单片机开发系统3.3.5 程序流程及实训参考程序实训程序流程如图3-2所示。实训参考程序如表3-5所示。

  21. 开始 (A)+散转地址 (A)←(20H) 0字循环 1字循环 2字循环 3字循环

  22. 3.3.6 实训步骤 (1)理解程序,弄清程序执行过程。 (2)将机器码送入单片机系统中,并检查是否正确。 (3)运行程序前,将00H~03H四个数中任意一个数送入20H单元中。 (4)单步执行程序,逐条分析指令,看转移指令的条件是否满足,判断是否转移或不转。 (5)观察数字在LED显示器上的移动方向,说明是程序中哪条指令控制转移的方向。 3.3.7 思考与讨论

  23. 1.第4行指令 RL A 的作用是什么?它和哪一条指令相关联? • 2.设单片机晶振频率为6MHz,试计算延时子程序的延时时间。修改延时时间对数字显示会有什么影响? • 3.第7行指令 AJMP A0的转移范围是多少?将其翻译成机器码。 • 4.将程序修改成十个分支程序,在显示器上分别显示0~9十个数字。 • 5.分析第25行指令 LCALL DELY 的堆栈使用情况。

  24. 6.第35行指令 DJNZ R7,L1的转移条件是什么?将其翻译成机器码。提示: 执行本程序,应仔细分析每一条指令的执行过程。 结合共阴极型和共阳极型LED七段显示器,分析字形码形成过程。

  25. 3 .4 实训11 循环程序设计训练 • 3.4.1 实训目的 • 通过本节实训,主要学习下面内容: • 循环程序的结构。 • 循环程序设计的编程方法。 • 循环结构程序的调试方法。 • 固定次数循环和非固定次数循环程序的实现。

  26. 3.4.2 实训要求1.编制将片内RAM从30H开始的五十个单元置数据88H的程序。2.编制数组排序程序:将片内RAM50H单元开始的十个单元内数据从小到大排序。3.4.3 实训预习进行循环程序设计,要掌握循环程序的结构。其结构一般包括以下四个部分:1.循环的初始化: 这是循环的准备部分。用于循环过程的工作单元,在这一部分设置初始值。2.循环的工作体: 它是完成处理任务的核心部分。随具体问题而定。3.循环的修改部分:

  27. 每进行一次循环,循环的工作体部分都要作相应的修改。为使循环的操作对象按要求改变,应对每次循环的控制变量进行必要修改,以便为下次循环处理做好准备。每进行一次循环,循环的工作体部分都要作相应的修改。为使循环的操作对象按要求改变,应对每次循环的控制变量进行必要修改,以便为下次循环处理做好准备。 4.循环的控制部分: 这一部分判别和控制循环的结束与否。 3.4.4 实训器材 MCS-51单片机开发系统 3.4.5 实训参考程序 1.将片内RAM30H开始的五十个单元置数据88H程序见表3-6所示。

  28. 2.将片内RAM50H单元开始的十个单元内数据从小到大排序。实训程序见表3-7所示。2.将片内RAM50H单元开始的十个单元内数据从小到大排序。实训程序见表3-7所示。

  29. 3.4.6 实训步骤 (1)对于表3-6实训程序 给每条指令加注释,填入实训表中。 根据程序画出程序流程图。 将程序修改成对片内RAM从30H开始的三个单元置数操作,用单步执行命令仔细检查每步运行结果,各寄存器及地址变化情况。 将程序还原,用连续执行命令执行程序,检查结果。 (2)对于表3-7实训程序

  30. 给每条指令加注释,填入实训表中。 根据程序画出程序流程图。 用单步执行命令仔细检查每步运行结果,各寄存器及地址变化情况。填入表3-8中。 用连续执行命令执行程序,检查结果。 在50H~59H中任意给出一组数据,执行程序进行排序,并检查结果。

  31. 3.4.7 思考与讨论 1.编写将片外RAM 5000H开始的200个单元清零程序。 2.将上例数组排序程序改为从大到小排列。 提示: 通过对表3-6实训程序的学习可知,对于固定次数的循环,可以预先设置循环计数初始值,存放在一个工作寄存器中,作为计数器,然后用减1非零转移指令DJNZ实现循环。

  32. 对于表3-7实训程序,属于无固定次数的循环。这是一个双重循环,在内层循环中,虽然知道十个数要循环比较九次,但不知道所给数组的数据排列情况,外层循环预先不知道要循环多少遍。可采用设置标志位的办法。如本程序使用PSW的用户标志位F0,开始清“0”F0,若有数据互相换位,则置位F0,当最后数组顺序已排好后,重新执行一遍程序,则不会出现数据换位现象,F0仍然为0,序已排好,程序结束。对于表3-7实训程序,属于无固定次数的循环。这是一个双重循环,在内层循环中,虽然知道十个数要循环比较九次,但不知道所给数组的数据排列情况,外层循环预先不知道要循环多少遍。可采用设置标志位的办法。如本程序使用PSW的用户标志位F0,开始清“0”F0,若有数据互相换位,则置位F0,当最后数组顺序已排好后,重新执行一遍程序,则不会出现数据换位现象,F0仍然为0,序已排好,程序结束。

  33. 3 .5 实训12 子程序设计训练 3.5.1 实训目的 通过本节实训,主要学习下面内容: 子程序的结构。 子程序设计的编程方法。 子结构程序的调试方法。 主程序调用子程序及子程序返回主程序的过程。

  34. 3.5.2 实训要求 将片内RAM30H存放的压缩BCD码转换成ASCII码,存放到50H起始的内存单元(50H为高位)。试编程实现。 3.5.3 实训预习 子程序是程序设计的重要方法之一。在程序设计中经常遇到重复出现的程序段,如果每次都把这种程序段抄写一遍,不仅会使程序冗长,也不易阅读和调试。这时候可采用子程序的设计方法。

More Related