640 likes | 832 Views
第 3 章 汇编语言程序设计. 3 .1 实 训 概 要 程序是一系列有序指令的集合。单片机通过执行程序完成相应的任务。 程序设计的任务就是根据任务的要求,给出解决问题的步骤和算法,编制程序的过程。学习完指令系统后,就具备了程序设计的基础。汇编语言程序设计不但技巧性强,而且还有软硬件结合的特点。设计出的程序质量好坏,直接关系到单片机应用系统的特性和运行效率。为了能够编制出高质量的程序,必须从一个个程序模块的学习开始,通过熟读多练,反复上机训练,才能逐步掌握程序设计的方法和技巧。. 实训内容: 顺序程序设计。 分支程序设计。 循环程序设计。
E N D
第3章 汇编语言程序设计 3 .1 实 训 概 要 程序是一系列有序指令的集合。单片机通过执行程序完成相应的任务。 程序设计的任务就是根据任务的要求,给出解决问题的步骤和算法,编制程序的过程。学习完指令系统后,就具备了程序设计的基础。汇编语言程序设计不但技巧性强,而且还有软硬件结合的特点。设计出的程序质量好坏,直接关系到单片机应用系统的特性和运行效率。为了能够编制出高质量的程序,必须从一个个程序模块的学习开始,通过熟读多练,反复上机训练,才能逐步掌握程序设计的方法和技巧。
实训内容: 顺序程序设计。 分支程序设计。 循环程序设计。 子程序设计。
预备知识: • 汇编语言程序设计的一般步骤: • 分析问题。根据给出的问题,熟悉和明确问题的要求,明确已知条件及对运算和控制的要求,建立数学模型。 • 确定解题算法。根据实际问题的要求和指令系统的特点,选择解决问题的方法。算法是程序设计的依据,它决定了程序的正确性和程序的质量。 • 画出程序流程图。程序流程图就是用各种规定的图形、流程线和简洁的文字表达解题步骤的一种图形。它直观、清晰地体现了程序设计思路,是程序的逻辑设计过程。
资源分配。算法确定后,要为每一个变量、各种指针、计数器等分配工作单元,定义数据类型和数据结构。资源分配。算法确定后,要为每一个变量、各种指针、计数器等分配工作单元,定义数据类型和数据结构。 • 根据程序流程图及资源分配情况,写出汇编语言源程序。 • 上机调试。 • 汇编语言源程序的一般结构: • 在程序设计中将会遇到各种类型的程序,但不论程序如何复杂,都可以分为如下基本结构: • 顺序结构 • 分支结构 • 循环结构 • 子程序结构
入口 入口 入口 满足条件? M 满足条件? N M M N P 改变条件? 出口 出口 出口 其中顺序结构、分支结构和循环结构为三中基本结构。其结构流程如图3-1所示。
3 .2 实训9 顺序程序设计训练 3.2.1 实训目的 通过本节实训,主要学习下面内容: 顺序程序的结构。 顺序程序设计的编程方法。 顺序结构程序的调试方法。
3.2.2 实训要求 1.双字求和。设有两个四字节二进制数,分别存放在片内RAM30H和40H开始的单元中,先存低字节。求两数之和,并将和存于50H开始的单元中。 2.双字节二进制无符号数乘法。 3.2.3 实训预习 预习内容 (1)掌握顺序程序的结构。 (2)复习片内数据存储器地址范围。 (3)复习数据传送指令和二进制加法指令的功能。 (4)复习乘法指令的功能。
程序设计基本思路 (1)双字求和 编写程序前要掌握片内RAM的结构。MCS-51单片机片内RAM一个存储单元为一个字节,以字节为单位编址。因此,每个加数和结果各占四个字节。按照加法的相加思路,先做低字节相加,然后做高位字节相加。 例如:
进行多字节加法运算时,低字节应选择不带进位加法指令ADD。其它字节相加时应选择带进位加法指令ADDC,将低位的进位值加入。进行多字节加法运算时,低字节应选择不带进位加法指令ADD。其它字节相加时应选择带进位加法指令ADDC,将低位的进位值加入。 (2)双字节二进制无符号数乘法 双字节二进制无符号数乘法的运算过程类似于一般十进制运算。首先进行资源分配:设被乘数存放在工作寄存器R2、R3中,乘数存放在R6、R7中。乘积存放在R2、R3、R4和R5中。然后进行运算,先算低字节,并保存中间和,再计算高字节,将中间和累加。
3.2.4 实训器材 MCS-51单片机开发系统 3.2.5 实训程序 1.多字节加法实训程序如表3-1所示。
3.2.6 实训步骤 (1)阅读并理解程序,并画出两个程序的流程图。 (2)将机器码送入单片机系统中,并检查是否正确。 (3)对于多字节加法实训程序,运行程序前,将两个四字节数据分别送入30H和40H开始的单元中。
(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中,执行程序,并记录结果。程序运行结果表格请读者自行设计。
3.2.7 思考与讨论 1.如何将程序改成十字节加法运算,编写程序并上机验证。 2.编写四字节减法程序,要求被减数和减数分别存放在片内RAM30H和50H开始的单元中,差存放在60H开始的单元。上机验证。 3.使用减法指令时应注意什么问题?
提示: 多字节加法实训程序可以考虑用循环结构完成,通过固定次数循环实现多字节相加。 双字节乘法程序由于要保护中间和,占用的片内RAM单元较多,可考虑使用堆栈,但不能和工作寄存器组发生冲突。
3 .3 实训10 分支程序设计训练 3.3.1 实训目的 通过本节实训,主要学习下面内容: 分支程序的结构。 分支程序设计的编程方法。 分支结构程序的调试方法。 通过散转指令实现多分支程序设计方法。
3.3.2 实训要求 设单片机片内数据存储器20H单元存放00H~03H四个不同的数。根据20H中存放数据的不同,在LED七段显示器上显示循环左移的数字0、1、2、3。即:
3.3.3 实训预习 JMP @A+DPTR 是一条散转指令。它常用于多分支选择程序中。数据指针DPTR作为基址寄存器,决定多分支程序的首地址,用累加器ACC作为变址寄存器来动态地选择某一分支,来实现多分支转移。该指令采用基址寄存器加变址寄存器间接寻址方式,将DPTR和ACC内容相加作为地址,该地址传送到程序计数器PC中。
为了在单片机开发系统上显示数字,必须了解所使用的单片机开发系统的显示器控制接口,通常用多功能接口芯片8155控制键盘和显示器。了解其字形口和字位口地址。(本系统字形口地址为0FF22H,字位口地址为0FF21H)。为了在单片机开发系统上显示数字,必须了解所使用的单片机开发系统的显示器控制接口,通常用多功能接口芯片8155控制键盘和显示器。了解其字形口和字位口地址。(本系统字形口地址为0FF22H,字位口地址为0FF21H)。 同时,还应了解所用单片机开发系统的LED显示器是共阴极型还是共阳极型。以便给出其不同的字形码。不同类型LED字形码如表3-4所示。本系统采用共阳极型LED。 表3-4 七段LED字形码
3.3.4 实训器材MCS-51单片机开发系统3.3.5 程序流程及实训参考程序实训程序流程如图3-2所示。实训参考程序如表3-5所示。
开始 (A)+散转地址 (A)←(20H) 0字循环 1字循环 2字循环 3字循环
3.3.6 实训步骤 (1)理解程序,弄清程序执行过程。 (2)将机器码送入单片机系统中,并检查是否正确。 (3)运行程序前,将00H~03H四个数中任意一个数送入20H单元中。 (4)单步执行程序,逐条分析指令,看转移指令的条件是否满足,判断是否转移或不转。 (5)观察数字在LED显示器上的移动方向,说明是程序中哪条指令控制转移的方向。 3.3.7 思考与讨论
1.第4行指令 RL A 的作用是什么?它和哪一条指令相关联? • 2.设单片机晶振频率为6MHz,试计算延时子程序的延时时间。修改延时时间对数字显示会有什么影响? • 3.第7行指令 AJMP A0的转移范围是多少?将其翻译成机器码。 • 4.将程序修改成十个分支程序,在显示器上分别显示0~9十个数字。 • 5.分析第25行指令 LCALL DELY 的堆栈使用情况。
6.第35行指令 DJNZ R7,L1的转移条件是什么?将其翻译成机器码。提示: 执行本程序,应仔细分析每一条指令的执行过程。 结合共阴极型和共阳极型LED七段显示器,分析字形码形成过程。
3 .4 实训11 循环程序设计训练 • 3.4.1 实训目的 • 通过本节实训,主要学习下面内容: • 循环程序的结构。 • 循环程序设计的编程方法。 • 循环结构程序的调试方法。 • 固定次数循环和非固定次数循环程序的实现。
3.4.2 实训要求1.编制将片内RAM从30H开始的五十个单元置数据88H的程序。2.编制数组排序程序:将片内RAM50H单元开始的十个单元内数据从小到大排序。3.4.3 实训预习进行循环程序设计,要掌握循环程序的结构。其结构一般包括以下四个部分:1.循环的初始化: 这是循环的准备部分。用于循环过程的工作单元,在这一部分设置初始值。2.循环的工作体: 它是完成处理任务的核心部分。随具体问题而定。3.循环的修改部分:
每进行一次循环,循环的工作体部分都要作相应的修改。为使循环的操作对象按要求改变,应对每次循环的控制变量进行必要修改,以便为下次循环处理做好准备。每进行一次循环,循环的工作体部分都要作相应的修改。为使循环的操作对象按要求改变,应对每次循环的控制变量进行必要修改,以便为下次循环处理做好准备。 4.循环的控制部分: 这一部分判别和控制循环的结束与否。 3.4.4 实训器材 MCS-51单片机开发系统 3.4.5 实训参考程序 1.将片内RAM30H开始的五十个单元置数据88H程序见表3-6所示。
2.将片内RAM50H单元开始的十个单元内数据从小到大排序。实训程序见表3-7所示。2.将片内RAM50H单元开始的十个单元内数据从小到大排序。实训程序见表3-7所示。
3.4.6 实训步骤 (1)对于表3-6实训程序 给每条指令加注释,填入实训表中。 根据程序画出程序流程图。 将程序修改成对片内RAM从30H开始的三个单元置数操作,用单步执行命令仔细检查每步运行结果,各寄存器及地址变化情况。 将程序还原,用连续执行命令执行程序,检查结果。 (2)对于表3-7实训程序
给每条指令加注释,填入实训表中。 根据程序画出程序流程图。 用单步执行命令仔细检查每步运行结果,各寄存器及地址变化情况。填入表3-8中。 用连续执行命令执行程序,检查结果。 在50H~59H中任意给出一组数据,执行程序进行排序,并检查结果。
3.4.7 思考与讨论 1.编写将片外RAM 5000H开始的200个单元清零程序。 2.将上例数组排序程序改为从大到小排列。 提示: 通过对表3-6实训程序的学习可知,对于固定次数的循环,可以预先设置循环计数初始值,存放在一个工作寄存器中,作为计数器,然后用减1非零转移指令DJNZ实现循环。
对于表3-7实训程序,属于无固定次数的循环。这是一个双重循环,在内层循环中,虽然知道十个数要循环比较九次,但不知道所给数组的数据排列情况,外层循环预先不知道要循环多少遍。可采用设置标志位的办法。如本程序使用PSW的用户标志位F0,开始清“0”F0,若有数据互相换位,则置位F0,当最后数组顺序已排好后,重新执行一遍程序,则不会出现数据换位现象,F0仍然为0,序已排好,程序结束。对于表3-7实训程序,属于无固定次数的循环。这是一个双重循环,在内层循环中,虽然知道十个数要循环比较九次,但不知道所给数组的数据排列情况,外层循环预先不知道要循环多少遍。可采用设置标志位的办法。如本程序使用PSW的用户标志位F0,开始清“0”F0,若有数据互相换位,则置位F0,当最后数组顺序已排好后,重新执行一遍程序,则不会出现数据换位现象,F0仍然为0,序已排好,程序结束。
3 .5 实训12 子程序设计训练 3.5.1 实训目的 通过本节实训,主要学习下面内容: 子程序的结构。 子程序设计的编程方法。 子结构程序的调试方法。 主程序调用子程序及子程序返回主程序的过程。
3.5.2 实训要求 将片内RAM30H存放的压缩BCD码转换成ASCII码,存放到50H起始的内存单元(50H为高位)。试编程实现。 3.5.3 实训预习 子程序是程序设计的重要方法之一。在程序设计中经常遇到重复出现的程序段,如果每次都把这种程序段抄写一遍,不仅会使程序冗长,也不易阅读和调试。这时候可采用子程序的设计方法。