3MCS-51单片机指令系统及汇编语言程序设计_免费下载.ppt_第1页
3MCS-51单片机指令系统及汇编语言程序设计_免费下载.ppt_第2页
3MCS-51单片机指令系统及汇编语言程序设计_免费下载.ppt_第3页
3MCS-51单片机指令系统及汇编语言程序设计_免费下载.ppt_第4页
3MCS-51单片机指令系统及汇编语言程序设计_免费下载.ppt_第5页
已阅读5页,还剩144页未读 继续免费阅读

下载本文档

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

文档简介

1 第3章MCS 51单片机指令系统与汇编语言程序设计 主要内容 介绍MCS 51单片机的寻址方式 指令系统 基本程序结构及汇编语言的开发和调试 重点在于寻址方式 各种指令的应用 程序设计的规范 程序设计的思想及典型程序的理解和掌握 难点在于控制转移 位操作指令的理解及各种指令的灵活应用 以及程序设计的基本方法和针对具体的硬件设计出最合理的软件 2 3 1指令系统概述 3 1 1指令指令是指挥计算机工作的命令 一种计算机所能执行的指令集合称之为计算机指令系统 MCS 51单片机主要有两种指令形式 机器语言指令汇编语言指令 3 一 机器语言指令 用二进制代码表示的指令称为机器语言指令 也称机器码 例如 累加器A加1 指令用二进制数表示时 是 00000100 在程序存储器中占用一个字节单元 二 汇编语言指令 用容易记忆的缩写符号表示机器语言指令就是汇编语言指令 例如 A加B 用英语写出来是 AddBtoA 缩写成 ADDA B 这个 ADDA B 就是汇编语言指令 MCS 51单片机的开发商约定 ADDA B 与25F0H对应 我们将 ADD 缩写符号称为 助记符 编写机器语言程序实质上就是用汇编语言编写程序 汇编语言指令机器语言指令MOVA 0AH74H0AHADDA 14H24H14H 4 3 1 28051汇编语言指令 一 指令组成 操作码助记符操作数 括号内的部分是可选项 每个字段之间要用分隔符分隔 可以用作分隔符的符号有空格 冒号 逗号 分号等 二 指令格式 标号 操作码 目的操作数 源操作数 注释 LOOP MOVA 3AH A 3AH 5 1 标号 标号是语句地址的标志符号 代表该语句指令代码第一个字节的地址 1 标号由1 8个ASCII字符组成 且第一个字符必须是字母 其余字符可以是字母 数字或其他特定字符 2 不能使用该汇编语言已经定义了的符号作为标号 如指令助记符 寄存器符号名称等 3 标号后必须跟冒号 2 操作码操作码用于规定语句执行的操作 它是汇编语句中唯一不能空缺的部分 也是语句的核心 它用指令助记符表示 6 3 操作数 操作数用于给指令的操作提供数据或地址 在一条汇编语句中操作数可能是空缺的 也可能包括一项 还可能包括两项或三项 当有多个操作数时 各操作数间以逗号分隔 1 工作寄存器名 2 特殊功能寄存器名 3 标号名 4 常数 5 符号 表示程序计数器PC的当前值 6 表达式 4 注释 注释不属于汇编语句的功能部分 它只是对语句的说明 注释字段可以增加程序的可读性 有助于编程人员的阅读和维护 注释字段必须以分号 开头 长度不限 可以换行接着书写 但换行时应注意在开头使用分号 7 三 指令中的常用符号 Rn n 0 7 表示当前工作寄存器R0 R7中的任一个寄存器 Ri i 0或1 表示通用寄存器组中用于间接寻址的两个寄存器R0 R1 data 表示8位直接参与操作的立即数 data16 表示16位直接参与操作的立即数 direct 表示片内RAM的8位单元地址 addr11 表示11位目的地址 主要用于ACALL和AJMP指令中 addr16 表示16位目的地址 主要用于LCALL和LJMP指令中 rel 用补码形式表示的8位二进制地址偏移量 取值范围为 128 127 主要用于相对转移指令 以形成转移的目的地址 DPTR 数据指针 用于寄存器间接寻址方式和变址寻址方式 8 bit 表示片内RAM位寻址区或者是可以位寻址的SFR的位地址 A 或ACC B 表示累加器 B寄存器 C 表示PSW中的进位标志位Cy 在间接寻址方式中 表示间接寻址寄存器指针的前缀标志 表示当前的指令地址 位操作数的前缀 表示对该位取反 X 表示由X所指定的某寄存器或某单元中的内容 X 表示由X间接寻址单元中的内容 表示指令的操作结果是将箭头右边的内容传送到左边 表示指令的操作结果是将箭头左边的内容传送到右边 表示逻辑或 与 异或 表示数据交换 9 3 1 3MCS 51单片机指令系统的分类 111条 一 按指令所占存储器字节数分 1 单字节指令 49条 2 双字节指令 46条 3 三字节指令 16条 三 按指令功能分 1 数据传送指令 29条 2 算术运算指令 24条 3 逻辑运算指令 24条 4 控制转移类指令 17条 5 位操作指令 17条 二 按指令执行周期数分 1 单周期指令 64条 2 双周期指令 45条 3 四周期指令 2条 10 寻址方式 在计算机中 说明操作数所在地址的方法称为操作数的寻址方式 计算机执行程序实际上是在不断寻找操作数并进行操作的过程 每种计算机在设计时已决定了它具有哪些寻址方式 寻址方式越多 计算机的灵活性越强 指令系统也就越复杂 MCS 51单片机的指令系统提供了7种寻址方式 分别为立即寻址 直接寻址 寄存器寻址 寄存器间接寻址 变址寻址 相对寻址和位寻址 一条指令可能含多种寻址方式 3 2MCS 51单片机的寻址方式 11 寻址方式 我的信在她那 找信去 注 找信是寻找信的 地址 寻址方式 就是指如何找到存放被操作数据的位置 地址 的方法 12 1 立即寻址 定义 将立即参与操作的数据直接写在指令中 这种寻址方式称为立即寻址 特点 指令中直接含有所需的操作数 该操作数可以是8位的 也可以是16位的 常常处在指令的第二字节和第三字节的位置上 立即数通常使用 data或 data16表示 在立即数前面加 标志 用以和直接寻址中的直接地址 direc或bit 相区别 目的地 MOVA 30H 速递快信 13 这类指令大都是双字节指令 仅有指令 MOVDPTR DATA16是三字节指令 它提供两字节立即数 如 MOVDRTR 1600H 它的机器指令格式下所示 100100000001011000000000使用专用的汇编程序把编写的汇编语言源程序汇编成机器语言程序 对立即数的书写一般有要求 对于单字节立即数 若数值大于等于A0H 则要在其前面加一个0 如指令 MOVA 0A0H 该指令含义是把立即数A0H送累计器 对于双字节立即数 若数值大于等于A000H 则要在其前面加一个0 对于直接地址和偏移量也按相同方法书写 第一位数字是A F时请在其前加0 14 2 直接寻址 定义 将操作数的地址直接存放在指令中 这种寻址方式称为直接寻址 特点 指令中含有操作数的地址 该地址指出了参与操作的数据所在的字节单元地址或位地址 计算机执行它们时便可根据直接地址找到所需要的操作数 寻址范围 ROM 片内RAM区 SFR和位地址空间 XXH 目的地 MOVA 3AH 15 例 MOVA 3AH 操作码 直接地址 10011111 A 16 3 寄存器寻址 定义 操作数存放在MCS 51内部的某个工作寄存器Rn R0 R7 或部分专用寄存器中 这种寻址方式称为寄存器寻址 特点 由指令指出某一个寄存器的内容作为操作数 存放操作数的寄存器在指令代码中不占据单独的一个字节 而是嵌入 隐含 到操作码字节中 寻址范围 四组通用寄存器组Rn R0 R7 部分专用寄存器 A B DPTR Cy 寄存器 目的地 MOVA R1 17 4 寄存器间接寻址 定义 指令给出的寄存器中存放的是操作数的地址 这种寻址方式称为寄存器间接寻址 简称为寄存器间址 特点 指令给出的寄存器中存放的是操作数地址 寄存器间接寻址是一种二次寻找操作数地址的寻址方式 寄存器前边必须加前缀符号 不能用于寻址特殊功能寄存器SFR 寻址范围 内部RAM低128B 只能使用R0或R1作间址寄存器 外部RAM 只能使用DPTR作间址寄存器 对于外部低256单元RAM的访问 除可以使用DPTR外 还可以使用R0或R1作间址寄存器 提供低8位地址 18 XXH 目的地 MOVA R1 信在XXH中 寄存器 可寻址内部RAM128B 外部RAM 寻址DPTR 19 MOVA R0 PC 操作码 20 5 变址寻址 基址 变址寄存器间接寻址 定义 操作数存放在变址寄存器 累加器A 和基址寄存器 DPTR或PC 相加形成的16位地址单元中 这种寻址方式称为基址加变址寄存器间接寻址 简称为变址寻址 基址寄存器1000H 变址寄存器 A 1000H 30H 1030H 30 65H MOVCA A PC A A PC 1MOVCA A DPTR A A DPTR 21 特点 指令操作码中隐含作为基址寄存器用的DPTR 或PC 和作为变址用的累加器A 在执行变址寻址指令时 MCS 51单片机先把基地址 DPTR或PC的内容 和地址偏移量 A的内容 相加 以形成操作数地址 再由操作数地址找到操作数 并完成相应的操作 变址寻址方式是单字节指令 寻址范围 只能对程序存储器ROM进行寻址 主要用于查表性质的访问 注意 累加器A中存放的操作数地址相对基地址的偏移量的范围为00H FFH 无符号数 MCS 51单片机共有以下三条变址寻址指令 MOVCA A PC A A PC 1MOVCA A DPTR A A DPTR JMP A DPTR PC A DPTR 22 6 相对寻址定义 将程序计数器PC的当前值 取出本条指令后的PC值 与指令第二个字节给出的偏移量 rel 相加 形成新的转移目标地址 称为相对寻址方式 特点 相对寻址方式是为实现程序的相对转移而设计的 为相对转移指令所使用 其指令码中含有相对地址偏移量 能生成浮动代码 如 SJMPrel PC PC 2 rel相对转移指令的目的地址 指令地址 指令字节数 偏移量寻址范围 只能对程序存储器ROM进行寻址 相对地址偏移量 rel 是一个带符号的8位二进制补码 其取值范围为 128 127 以PC为中间的256个字节范围 23 以当前的PC值加上指令中给出的相对偏移量rel而形成转移目的地址的寻址方式 2000H 02H 28H 源地址 目的地址 rel 转移指令本身字节数 rel是有符号的8位二进制数 用补码表示 相对偏移在 127 128字节单元之间 24 7 位寻址定义 指令中给出的操作数是一个可单独寻址的位地址 这种寻址方式称为位寻址方式 特点 位寻址是直接寻址方式的一种 其特点是对8位二进制数中的某一位的地址进行操作 寻址范围 片内RAM低128B中位寻址区 部分SFR 其中有83位可以位寻址 可位寻址的位地址的表示形式如下 1 直接使用位地址形式 如 MOV00H C 00H Cy 其中 00H是片内RAM中20H地址单元的第0位 25 2 字节地址加位序号的形式 如 MOV20H 0 C 20H 0 Cy 其中 20H 0是片内RAM中20H地址单元的第0位 3 位的符号地址 位名称 的形式 对于部分特殊功能寄存器 其各位均有一个特定的名字 所以可以用它们的位名称来访问该位 如 ANLC P C C P 其中 P是PSW的第0位 C是PSW的第7位 4 字节符号地址 字节名称 加位序号的形式 对于部分特殊功能寄存器 如状态标志寄存器PSW 还可以用其字节名称加位序号形式来访问某一位 如 CPLPSW 6 AC AC 其中 PSW 6表示该位是PSW的第6位 26 位寻址适用于可以进行单独位操作的指令 指令中直接给出位地址寻找位操作数 参与操作的数据是 bit而不是1B 位地址用bit表示 以区别字节地址direct PCPC 1 0 MOVC 37H 0 27 例3 1将D5H位的内容送入Cy 可用几种方式表达 解 有以下4种 1 MOVC 0D5H 2 MOVC 0D0H 5 3 MOVC F0 4 MOVC PSW 5 举例 28 例3 2判断下列指令各操作数的寻址方式 1 MOVA 65H 2 MOV R1 65H 3 MOV30H R2 4 MOVC 20H 5 DJNZR2 rel 6 MOV60H R1 7 MOVCA A PC 寄存器寻址变址寻址 直接寻址寄存器间接寻址 寄存器寻址相对寻址 位寻址位寻址 直接寻址寄存器寻址 寄存器间接寻址直接寻址 寄存器寻址立即寻址 解 29 3 3MCS 51单片机的指令系统 MCS 51指令系统使用44种助记符 它们代表着33种功能 可以实现51种操作 指令助记符与操作数的各种可能的寻址方式的结合一共可构造出111条指令 MCS 51单片机指令系统按其功能可分为数据传送类指令 算术运算类指令 逻辑运算和移位类指令 控制转移类指令和位操作类指令五大类 30 学习指令系统时 应注意 1 指令的格式 功能 2 操作码的含义 操作数的表示方法 3 寻址方式 源 目的操作数的范围 4 对标志位的影响 5 指令的适用范围 6 正确估算指令的字节数 一般地 操作码占1字节 操作数中 直接地址derict占1字节 data占1字节 data16占两字节 操作数中的A B R0 R7 Ri DPTR A DPTR A PC等均隐含在操作码中 31 3 3 1数据传送指令 29条 CPU在进行算术和逻辑操作时 绝大多数指令都有操作数 所以数据传送是一种最基本 最主要的操作 数据传送指令共29条 可分为内部RAM数据传送 外部RAM数据传送 程序存储器数据传送 数据交换和堆栈操作等五类 寻址范围 累加器A 片内RAM SFR 片外RAM 功能 目的地址 源地址 源地址单元的内容不变 对标志位的影响 除以累加器A为目的操作数的数据传送指令对P标志位有影响外 其余均不影响标志位 32 目的地址源地址 数据 MOV MOVA 20H MOV 20H A 一 内部RAM数据传送指令 16条 MOVDPTR data16 33 二 外部数据传送指令 4条 MOVX MOVX CPU与外部数据存储器之间进行数据传送时 必须使用外部传送指令 只能通过累加器A 采用寄存器间接寻址 用R0 R1和DPTR三个间接寻址的寄存器 方式完成 其中 Ri R0 R1 只能访问片外RAM的低256个单元 DPTR可以访问片外RAM的全部64KB的空间 34 三 程序存储器数据传送指令 查表指令 2条 程序存储器的数据传送是单向的 并且只能读到累加器A中 这类指令专门用于查表 又称为查表指令 MOVCA A DPTP A A DPTR MOVCA A PC PC PC 1 A A PC 两条指令的异同 其功能完全相同 但使用中存在着差异 1 查表的位置要求不同采用DPTR作为基地址寄存器 表可以放在64KB程序存储器空间的任何地址 使用方便 故称为远程查表 采用PC作为基地址寄存器 具体的表在程序存储器中只能在查表指令后的256B的地址空间中 使用有限制 故称为近程查表 35 2 偏移量的计算方法不同采用DPTR作为基地址寄存器 查表地址为 A DPTR 采用PC作为基地址寄存器 查表地址为 A PC 1 因此偏移量的计算方法不同 采用DPTR作为基地址寄存器 A为欲查数值距离表首地址的值 采用PC作为基地址寄存器 A的值必须预先设置为 A的值 表首地址 当前指令的PC值 1 36 四 堆栈操作指令 2条 PUSHdirect SP SP 1 SP direct POPdirect direct SP SP SP 1 SP PUSHACC ACC SP POPACC 堆栈操作指令是一种特殊的数据传送指令 是根据栈指针SP中的栈顶地址进行数据操作 堆栈操作指令的实质是以栈指针SP为间址寄存器的间址寻址方式 堆栈区应避开使用工作寄存器区和其他需要使用的数据区 系统复位后 SP的初始值为07H 为了避免重叠 一般初始化时要重新设置SP 37 功能 实现RAM单元数据送入栈顶或由栈顶取出数据送至RAM单元 适用场合 用于执行中断 子程序调用 参数传递等程序的断点保护和现场保护 书写方式 堆栈操作指令是直接寻址指令 直接地址不能是寄存器名 因此应注意指令的书写格式 例如 PUSHACC 不能写成PUSHA POP00H 不能写成POPR0 38 五 数据交换指令 5条 XCHA R7 SWAPA XCHDA Ri 39 3 3 2算术运算指令 24条 一 加法指令 条 算术运算指令的两个参与运算的操作数 一个存放在累加器A中 此操作数也为目的操作数 另一个存放在R0 R7或 Ri 片内RAM 中 或是 data 立即数 算术运算指令可以分为加法指令 带进位的加法指令 带借位的减法指令 十进制调整指令 加1指令 减1指令 乘除指令 注 ADD对PSW中的所有标志位均产生影响 40 二 带进位的加法指令 条 注 ADDC对PSW中的所有标志位均产生影响 41 三 带借位的减法指令 条 此位相减需借位时 值CY位为 1 此位相减需借位时 值AC位为 1 注意 SUBB对PSW中的所有标志位均产生影响 MCS 51指令系统中没有不带借位的减法指令 欲实现不带借位的减法计算 应预先置Cy 0 利用CLRC指令 然后利用带借位的减法指令SUBB实现计算 42 四 加1指令 5条 又称增量指令 五 减 指令 4条 又称减量指令 注 以上两条指令只是对累加器A操作时影响P标志位 43 六 乘法指令 1条 MULAB DIVAB 七 除法指令 1条 注 累加器 和寄存器 中的 位无符号整数相乘 其 位积的低位字节放 中 高位字节放 中 如积大于 则置 为 总为 注 累加器 和寄存器 中的 位无符号整数相除 其所得的商的整数部分放 中 余数放 中 乘除指令执行时间最长 均为四周期指令 乘除指令影响PSW中的Cy OV P标志位 其中 Cy位总是被清0的 P是由累加器A中1的个数的奇偶性决定的 乘法运算中 若乘积大于FFH 则OV标志位置1 否则清0 除法运算中 若除数为0 则OV标志位置1 否则清0 注 44 八 十进制调整指令 1条 DAA 十进制调整指令也称为BCD码修正指令 这是一条对运算结果的十进制数进行BCD码修正的专用指令 两个压缩的BCD码按二进制数相加后必须经本指令调整才能得到压缩的BCD码的和 以完成十进制加法运算功能 跟在加法指令ADD或ADDC后面 源操作数只能在累加器A中 结果存入A中 注意 十进制调整指令不能对减法指令进行修正 BCD码减法必须采用BCD补码运算法则 变减法为补码加法 被减数 减数的补码 减数的补码 9AH 减数 然后对其进行十进制调整来实现 45 一 累加器A清0和取反指令 条 3 3 3逻辑运算和移位指令 24条 CLRA 00000000 CPLA 两条指令都不影响CY OV AC等标志 特点 可以节省存储空间 提高程序执行效率 对标志位的影响 CLRA指令只影响PSW的P标志位 CPLA指令不影响PSW各标志位 46 二 逻辑与指令 6条 47 三 逻辑或指令 6条 48 四 逻辑异或指令 6条 49 五 循环移位指令 4条 RLARLCARRARRCA A 7 A 6 A 5 A 4 A 3 A 2 A 1 A 0 CY CY 50 注 逻辑运算和移位指令中除了两条带进位的循环移位指令外 其余均不影响PSW中的各标志位 但当目的操作数是累加器A时 影响PSW中的奇偶校验位P 逻辑运算都是按位进行的 除用于逻辑运算外 还可用于模拟各种数字逻辑电路的功能 进行逻辑电路的设计 只能对累加器A进行循环移位 且累加器A中的数据逐位左移一位相当于原内容乘2 而逐位右移一位相当于原内容除以2 51 一 无条件转移指令 4条 3 3 4控制转移指令 17条 1 绝对转移指令 AJMPaddr11 PC 2 PC addr11 PC 10 PC 0 PC PC 1 PC PC PC 2 PC 注意 目标地址必须与它下面的指令存放地址在同一个2K字节区域内 2 基寄存器加变址寄存器间接转移指令 散转指令 JMP A DPTR A DPTR PC 功能 改变程序计数器PC中的内容 控制程序执行的流向 实现程序分支转向 除了CJNE影响PSW的进位标志位Cy外 其余均不影响PSW的各标志位 52 3 短 相对 转移指令 SJMPrel PC 2 PC rel PC PC PC PC 1 PC PC PC 2 PC PC PC 2 relPC 4 长转移指令 LJMPaddr16 addr16 PC0 PC15 注意 转向的目标地址只能在下条指令前128字节到后127字节 注意 该指令可以转移到64KB程序存储器中的任意位置 53 注意 1 使用转移指令时 指令中的地址或偏移量均可采用标号 只有在执行前才被汇编成实际的二进制地址 2 指令的转移范围 在执行当前转移指令后的PC值的基础上 长转移指令LJMP 64KB绝对转移指令AJMP 2KB相对 短 转移指令SJMP 128 127 用补码表示 间接 散 转移指令JMP 64KB 3 相对 短 转移指令SJMPrel中地址偏移量的计算 rel 转移目标地址 转移指令地址 当前PC值 2 54 4 原地踏步 暂停当前的程序 并不是真的停机 的实现SJMP 或HERE SJMPHERE 5 间接 散 转移指令 JMP A DPTR常用于实现程序的分支转移 散转 DPTR为转移目的的起始地址 A为转移目的的偏移量 6 在编程中 经常使用短转移指令SJMP和绝对转移指令AJMP 以便生成浮动代码 并不经常使用长转移指令LJMP 55 二 条件转移指令 8条 1 累加器为零 非零转移指令 2条 2 减1非零转移指令 2条 在规定的条件满足时进行程序转移 否则程序往下顺序执行 56 3 比较转移指令 4条 57 功能 把两个操作数进行比较 以比较的结果作为条件来控制程序的转移 若 目的操作数 源操作数 则程序继续执行 PC PC 3若 目的操作数 源操作数 则程序转移 PC PC rel 3 Cy 0注意 比较转移指令的比较是通过两操作数的减法实现的 影响Cy标志位 不保存最后的差值 两个操作数的内容不变 条件转移指令均为相对转移指令 因此指令的转移范围十分有限 若要实现64KB范围内的转移 则可以借助于一条长转移指令的过渡来实现 58 三 子程序调用与返回指令 4条 具有完整功能的程序段定义为子程序 供主程序调用 功能 供主程序在需要时调用 子程序可以在程序中反复多次使用 以简化源程序的书写 特点 子程序可以嵌套 有利于模块化程序设计 59 主程序与子程序之间的调用关系如下左图所示 两级子程序嵌套的示意图如下右图所示 60 为了实现主程序对子程序的一次完整调用 必须有子程序调用指令和子程序返回指令 子程序调用指令在主程序中使用 而子程序返回指令则是子程序的最后一条指令 调用与返回指令是成对使用的 子程序调用指令 必须具有自动把程序计数器PC中的断点地址保护到堆栈中 且将子程序入口地址自动送入程序计数器PC中的功能 子程序返回指令 必须具有自动把堆栈中的断点地址恢复到程序计数器PC中的功能 注意 子程序调用时应注意入口参数设置 子程序返回时应注意出口参数的传递 61 1 绝对短调用指令ACALLaddr11 PC PC 2 SP SP 1 SP PC 7 0 SP SP 1 SP PC 15 8 PC 10 0 addr11其中 addr11为11位地址 实际编程时可以用符号地址 并且只能在2KB范围以内调用子程序 2 绝对长调用指令LCALLaddr16 PC PC 3 SP SP 1 SP PC 7 0 SP SP 1 SP PC 15 8 PC 15 0 addr16其中 addr16为16位地址 实际编程时可以用符号地址 可以在64KB范围以内调用子程序 62 3 子程序返回指令RET PC 15 8 SP SP SP 1 PC 7 0 SP SP SP 14 中断返回指令RETI PC 15 8 SP SP SP 1 PC 7 0 SP SP SP 1注 中断服务程序是一种特殊的子程序 它是在计算机响应中断时 由硬件完成调用而进入相应的中断服务程序 RETI指令与RET指令相仿 区别在于RET是从子程序返回 RETI是从中断服务程序返回 无论是RET还是RETI都是子程序执行的最后一条指令 63 四 空操作指令NOP 1条 NOP PC PC 1功能 不执行任何操作 消耗了一个机器周期 常用于软件延时或在程序可靠性设计中用来稳定程序 特点 NOP占据一个单元的存储空间 除了使PC的内容加1外 CPU不产生任何操作结果 只是消耗了一个机器周期 64 3 3 5位操作指令 17条 位操作 布尔变量操作 操作数不是字节 而是字节中的某个位 每位的取值只能取0或1 指令的寻址范围 片内RAM位寻址区20H 2FH SFR中的11个可位寻址特殊寄存器中的83个可寻址位 特点 以进位标志Cy作为位累加器 可以实现布尔变量的传送 运算和控制转移等功能 指令中的位地址的表达方式 直接地址方式 如0AFH 特殊功能寄存器名 位序号 如PSW 3 字节地址 位序号 如0D0H 0 位名称方式 如F0 和用户定义名称等几种方式 65 RAM位寻址区位地址映象 66 特殊功能寄存器位地址映象 67 一 位变量传送指令 2条 0E 21H 6CY 68 二 位变量修改指令 6条 69 三 位变量逻辑操作指令 4条 例1 MOVC 00HANLC P1 1 20H 0CY C P1 1 CY 例2 MOVC 6EHORLC P1 1 2DH 6CY 70 四 位条件 控制 转移指令 5条 特点 以位的状态作为实现程序转移的判断条件 1 以进位标志位Cy内容为条件的转移指令JCrel 若 Cy 1 则转移 PC PC 2 rel 否则顺序执行JNCrel 若 Cy 0 则转移 PC PC 2 rel 否则顺序执行2 以位地址bit内容为条件的转移指令JBbit rel 若 bit 1 则转移 PC PC 3 rel 否则顺序执行JNBbit rel 若 bit 0 则转移 PC PC 3 rel 否则顺序执行JBCbit rel 若 bit 1 则转移 PC PC 3 rel 且 bit 0 否则顺序执行 71 3 4MCS 51单片机汇编语言程序设计基础 程序设计 就是编制计算机的程序 即应用计算机所能识别的 接受的语言把要解决的问题的步骤有序地描述出来 一 程序设计语言的种类 1 机器语言 机器语言是用二进制代码表示的计算机唯一能识别和执行的最原始的程序设计语言 2 汇编语言 利用指令助记符来描述的程序设计语言 3 高级语言 接近于人的自然语言 是面向过程而独立于机器的通用语言 二 汇编语言的指令类型 MCS 51单片机汇编语言 包含两类不同性质的指令 1 基本指令 即指令系统中的指令 它们都是机器能够执行的指令 每一条指令都有对应的机器码 2 伪指令 汇编时用于控制汇编的指令 它们都是机器不执行的指令 无机器码 3 4 1汇编语言程序设计概述 72 三 汇编语言的语句格式 汇编语言源程序是由汇编语句 即指令 组成的 典型的汇编语句格式如下 标号 操作码 操作数 操作数 注释 四 数据的表示方法 1 二进制数 由0 1组成 逢2进1 的数制 如 01011110B 0 1后缀 B b 2 十六进制数 便于读写记忆的二进制数的简写形式 0 9 A F后缀 H h 3 十进制数 可用二进制数表示 也称为BCD码 0 9表示为 0000 1001B 也可用十进制数表示 后缀 D d或无后缀 73 五 汇编语言程序设计 根据任务要求 采用汇编语言编制程序的过程称为汇编语言程序设计 六 汇编语言程序设计的步骤 1 拟订设计任务书 2 建立数学模型 3 确定算法 4 分配内存单元 编制程序流程图 5 编制源程序进一步合理分配存储器单元和了解I O接口地址 按功能设计程序 明确各程序之间的相互关系 用注释行说明程序 便于阅读和修改调试和修改 6 上机调试 7 程序优化 74 七 编制程序流程图 是指用各种图形 符号 指向线等来说明程序设计的过程 国际通用的图形和符号说明如下 椭圆框 开始和结束框 在程序的开始和结束时使用 矩形框 处理框 表示要进行的各种操作 菱形框 判断框 表示条件判断 以决定程序的流向 流向线 流程线 表示程序执行的流向 圆圈 连接符 表示不同页之间的流程连接 各种几何图形符号如下图所示 75 八 伪指令伪指令不要求计算机做任何操作 也没有对应的机器码 不产生目标程序 不影响程序的执行 仅仅是能够帮助进行汇编的一些指令 它主要用来指定程序或数据的起始位置 给出一些连续存放数据的地址或为中间运算结果保留一部分存储空间以及表示源程序结束等等 不同版本的汇编语言 伪指令的符号和含义可能有所不同 但基本用法是相似的 下面介绍几种常用的伪指令 76 1 设置目标程序起始地址伪指令ORG格式 符号 ORG地址 十六进制表示 该伪指令的功能是规定其后面的目标程序或数据块的起始地址 它放在一段源程序 主程序 子程序 或数据块的前面 说明紧跟在其后的程序段或数据块的起始地址就是ORG后面给出的地址 例如 ORG2000HSTART MOVA 7FH 77 2 结束汇编伪指令END格式 符号 ENDEND是汇编语言源程序的结束标志 表示汇编结束 在END以后所写的指令 汇编程序都不予处理 一个源程序只能有一个END命令 否则就有一部分指令不能被汇编 如果END前面加标号的话 则应与被结束程序段的起始点的标号一致 以表示结束的是哪一个程序段 78 3 定义字节伪指令DB格式 标号 DB项或项表其中项或项表指一个字节数据 用逗号分开的字节数据串 或以引号括起来的字符串 该伪指令的功能是把项或项表的数据 字符串按字符顺序以ASCII码 存入从标号地址开始的连续存储单元中 例如 ORG2000HTAB1 DB30H 8AH 7FH 73DB 5 A BCD 79 由于ORG2000H 所以TAB1的地址为2000H 因此 以上伪指令经汇编后 将对2000H开始的连续存储单元赋值 2000H 30H 2001H 8AH 2002H 7FH 2003H 49H 十进制数73以十六进制数存放 2004H 35H 35H是数字5的ASCII码 2005H 41H 41H是字母A的ASCII码 2006H 42H 42H是字符串 BCD 中B的ASCII码 2007H 43H 43H是字符串 BCD 中C的ASCII码 2008H 44H 44H是字符串 BCD 中D的ASCII码 80 4 定义字伪指令DW格式 标号 DW项或项表DW伪指令与DB相似 但用于定义字的内容 项或项表指所定义的一个字 两个字节 或用逗号分开的字串 汇编时 机器自动按高8位先存入 低8位在后的格式排列 例如 ORG1500HTAB2 DW1234H 80H汇编以后 1500H 12H 1501H 34H 1502H 00H 1503H 80H 81 5 预留存储空间伪指令DS格式 标号 DS表达式DS的功能是从标号地址开始 保留若干个字节的内存空间以备存放数据 保留的字节单元数由表达式的值决定 例如 ORG1000HDS20HDB30H 8FH汇编后从1000H开始 预留32 20H 个字节的内存单元 然后从1020H开始 按照下一条DB指令赋值 即 1020H 30H 1021H 8FH 82 6 等值伪指令EQU格式 标号 EQU项该伪指令的功能是将指令中的项的值赋予EQU前面的标号 项可以是常数 地址标号或表达式 例如 TAB1 EQU1000HTAB2 EQU2000H汇编后TAB1 TAB2分别具有值1000H 2000H 用EQU伪指令对某标号赋值后 该标号的值在整个程序中不能再改变 83 7 位地址定义伪指令BIT格式 标号 BIT位地址该伪指令的功能是将位地址赋予BIT前面的标号 经赋值后可用该标号代替BIT后面的位地址 例如 PLG BITF0AI BITP1 0经以上伪指令定义后 在程序中就可以把FLG和AI作为位地址来使用 84 九 汇编语言程序的基本结构 1 顺序结构 顺序结构是指程序按指令顺序逐条执行的一种结构 也是程序结构中最简单的一种结构 85 2 分支结构 指程序中具有转移指令 可根据转移条件决定是转移还是继续执行下一条指令 几种分支结构程序的框图 86 3 循环结构循环结构由四个环节组成 1 初始化部分 对循环体中参加操作的有关参数 地址等赋以初始值 并指定循环结束条件 2 循环体部分 指每次循环都需要重复执行的程序段 3 修改初始值 每次循环结束都要对初始值进行修改 特别是判断结束条件的参数 每经一次循环后都要作相应的修改 以便决定是否结束循环 4 结束判断部分 检查结束条件是否满足 若条件满足停止循环 否则返回继续执行循环体 87 循环结构框图图中每执行一次循环体后 都要检查结束条件是否满足 若条件满足停止循环 否则返回继续执行循环体 右边两图区别是先检查循环是否结束后修改初值 还是先修改初值后检查循环是否结束 88 3 4 2顺序程序设计 特点 顺序结构程序是最简单 最基本的程序 程序按编写的顺序依次往下执行每一条指令 直到最后一条 它能够解决某些实际问题 或成为复杂程序的子程序 例题1 将片内RAM30H单元中的两位压缩BCD码转换成二进制数送到片内RAM40H单元中 解 两位压缩BCD码转换成二进制数的算法为 a1a0 BCD 10 a1 a0程序流程图如右图所示 89 程序如下 ORG1000HSTART MOVA 30H 取两位BCD压缩码a1a0送AANLA 0F0H 取高4位BCD码a1SWAPA 高4位与低4位换位MOVB 0AH 将二进制数10送入BMULAB 将10 a1送入A中MOVR0 A 结果送入R0中保存MOVA 30H 再取两位BCD压缩码a1a0送AANLA 0FH 取低4位BCD码a0ADDA R0 求和10 a1 a0MOV40H A 结果送入40H保存SJMP 程序执行完 原地踏步 END 90 例题2 利用查表指令将内部RAM中20H单元的压缩BCD码拆开 转换成相应的ASCII码 存入21H 22H中 高位存在22H 解 BCD码的0 9对应的ASCII码为30H 39H 将30H 39H按大小顺序排列放入表TABLE中 先将BCD码拆分 将拆分后的BCD码送入A 表首址送入DPTR 然后应用查表指令MOVCA A DPTR 查表即得结果 然后存入21H 22H中 程序如下 ORG1000HSTART MOVDPTR TABLEMOVA 20HANLA 0FHMOVCA A DPTRMOV21H A 91 MOVA 20HANLA 0F0HSWAPAMOVCA A DPTRMOV22H ASJMP TABLE DB30H 31H 32H 33H 34HDB35H 36H 37H 38H 39HEND 92 3 4 3分支程序设计 特点 根据不同的条件 确定程序的走向 它主要靠条件转移指令 比较转移指令和位转移指令来实现 分支程序的结构如右图所示 分支程序的设计要点如下 1 先建立可供条件转移指令测试的条件 2 选用合适的条件转移指令 3 在转移的目的地址处设定标号 93 解 此题有三个条件 所以有三个分支程序 这是一个三分支归一的条件转移问题 X是有符号数 判断符号位是0还是1可利用JB或JNB指令 位寻址指令 判断X是否等于0则可以直接使用累加器A的判0指令 程序流程图如右图所示 例题3 求符号函数的值 已知片内RAM的40H单元内有一自变量X 编制程序按如下条件求函数Y的值 并将其存入片内RAM的41H单元中 1X 0Y 0X 0 1X 0 94 ORG1000HSTART MOVA 40H 将X送入A中JZCOMP 若A为0 转至COMP处JNBACC 7 POST 若A第7位不为1 X为正数 则程序转到POST处 否则 X为负数 程序往下执行MOVA 0FFH 将 1 补码 送入A中SJMPCOMP 程序转到COMP处POST MOVA 01H 将 1送入A中COMP MOV41H A 结果存入YSJMP 程序执行完 原地踏步 END 95 3 4 4循环程序设计 特点 程序中含有可以重复执行的程序段 循环体 采用循环程序可以有效地缩短程序 减少程序占用的内存空间 使程序的结构紧凑 可读性好 组成 循环程序一般由下面四部分组成 1 循环初始化 位于循环程序开头 用于完成循环前的准备工作 如设置各工作单元的初始值以及循环次数 2 循环体 循环程序的主体 位于循环体内 是循环程序的工作程序 在执行中会被多次重复使用 要求编写得尽可能简练 以提高程序的执行速度 3 循环控制 位于循环体内 一般由循环次数修改 循环修改和条件语句等组成 用于控制循环次数和修改每次循环时的参数 4 循环结束 用于存放执行循环程序所得的结果 以及恢复各工作单元的初值 96 循环程序的结构 1 先循环处理 后循环控制 即先处理后控制 如左下图所示 2 先循环控制 后循环处理 即先控制后处理 如右下图所示 97 循环程序按结构形式 有单重循环与多重循环 1 单重循环程序定义 循环体内部不包括其他循环的程序称为单重循环程序 例题4 已知片内RAM30H 3FH单元中存放了16个二进制无符号数 编制程序求它们的累加和 并将其和数存放在R4 R5中 解 每次求和的过程相同 可以用循环程序实现 16个二进制无符号数求和 循环程序的循环次数应为16次 存放在R2中 它们的和放在R4 R5中 R4存高8位 R5存低8位 程序流程图如右图所示 98 程序如下 ORG1000HSTART MOVR0 30HMOVR2 10H 设置循环次数 16 MOVR4 00H 和高位单元R4清0MOVR5 00H 和低位单元R5清0LOOP MOVA R5 和低8位的内容送AADDA R0 将 R0与R5的内容相加并产生进位CyMOVR5 A 低8位的结果送R5CLRA A清0ADDCA R4 将R4的内容和Cy相加MOVR4 A 高8位的结果送R4INCR0 地址递增 加1 DJNZR2 LOOP 若循环次数减1不为0 则转到LOOP处循环 否则 循环结束SJMP END 99 例题5 编制程序将片内RAM的30H 4FH单元中的内容传送至片外RAM的2000H开始的单元中 解 每次传送数据的的过程相同 可以用循环程序实现 30H 4FH共32个单元 循环次数应为32次 保存在R2中 为了方便每次传送数据时地址的修改 送片内RAM数据区首地址送R0 片外RAM数据区首地址送DPTR 程序流程图如右图所示 100 程序如下 ORG1000HSTART MOVR0 30HMOVDPTR 2000HMOVR2 20H 设置循环次数LOOP MOVA R0 将片内RAM数据区内容送AMOVX DPTR A 将A的内容送片外RAM数据区INCR0 源地址递增INCDPTR 目的地址递增DJNZR2 LOOP 若R2的不为0 则转到LOOP处继续循环 否则循环结束SJMP END 101 2 多重循环程序 定义 若循环中还包括有循环 称为多重循环 或循环嵌套 例题6 编制程序设计50ms延时程序 解 延时程序与MCS 51指令执行时间 机器周期数 和晶振频率fOSC有直接的关系 当fOSC 12MHz时 机器周期为1 s 执行一条DJNZ指令需要2个机器周期 时间为2 s 50ms 2 s 255 因此单重循环程序无法实现 可采用双重循环的方法编写50ms延时程序 102 程序如下 ORG1000HDELAY MOVR7 200 设置外循环次数 此条指令需要1个机器周期 DLY1 MOVR6 123 设置内循环次数 此条指令需要1个机器周期 DLY2 DJNZR6 DLY2 R6 1 0 则顺序执行 否则转回DLY2继续循环 延时时间为2 s 123 246 sNOP 延时时间为1 sDJNZR7 DLY1 R7 1 0 则顺序执行 否则转回DLY1继续循环 延时时间为 246 2 1 1 200 2 1 50 003msRET 子程序结束 此条指令需要2个机器周期 END 103 编制循环程序时应注意的问题 1 循环程序是一个有始有终的整体 它的执行是有条件的 所以要避免从循环体外直接转到循环体内部 2 多重循环程序是从外层向内层一层一层进入 循环结束时是由内层到外层一层一层退出的 在多重循环中 只允许外重循环嵌套内重循环 不允许循环相互交叉 也不允许从循环程序的外部跳入循环程序的内部 3 编写循环程序时 首先要确定程序结构 处理好逻辑关系 一般情况下 一个循环体的设计可以从第一次执行情况入手 先画出重复执行的程序框图 然后再加上循环控制和置循环初值部分 使其成为一个完整的循环程序 4 循环体是循环程序中重复执行的部分 应仔细推敲 合理安排 应从改进算法 选择合适的指令入手对其进行优化 以达到缩短程序执行时间的目的 104 3 4 5排序程序设计 冒泡法 例题7 设MCS 51单片机内部RAM起始地址为30H的数据块中共存有64个无符号数 编制程序使它们按从小到大的顺序排列 解 设64个无符号数在数据块中的顺序为 e64 e63 e2 e1 使他们从小到大顺序排列的方法很多 现以冒泡法为例进行介绍 冒泡法又称两两比较法 它先使e64和e63比较 若e64 e63 则两个存储单元中的内容交换 否则就不交换 然后使e63和e62比较 按同样的原则决定是否交换 一直比较下去 最后完成e2和e1的比较及交换 经过N 1 63次比较 常用内循环63次来实现 后 e1的位置上必然得到数组中的最大值 犹如一个气泡从水底冒出来一样 如下页图所示 图中只画出了6个数的比较过程 105 106 第二次冒泡过程和第一次完全相同 比较次数也可以是63次 其实只需要62次 因为e1的位置上是数据块中的最大数 不需要再比较 冒泡后在e2的位置上得到数组中的次大数 如上页图所示 如此冒泡 即大循环 共63次 内循环63 63次 便可完成64个数的排序 实际编程时 可通过设置 交换标志 用来控制是否再需要冒泡 若刚刚进行完的冒泡中发生过数据交换 即排序尚未完成 应继续进行冒泡 若进行完的冒泡中未发生过数据交换 即排序已经完成 冒泡应该停止 例如 对于一个已经排好序的数组 1 2 3 63 64 排序程序只要进行一次循环便可根据 交换标志 的状态而结束排序程序的再执行 这自然可以减少63 1 62次的冒泡时间 冒泡法程序流程图如下页图所示 107 108 程序如下 ORG1000HMOVR0 30H 数据区首地址送R0MOVR3 63H 设置外循环次数在R3中LP0 CLR7FH 交换标志位2FH 7清0MOVA R3 取外循环次数MOVR2 A 设置内循环次数MOVR0 30H 重新设置数据区首址LP1 MOV20H R0 数据区数据送20H单元中MOVA R0 20H内容送AINCR0 修改地址指针 R0 1 MOV21H R0 下一个地址的内容送21HCLRC Cy清0SUBBA 21H 前一个单元的内容与下一个单元的内容比较JCLP2 若有借位 Cy 1 前者小 程序转移到LP2处执行 若无借位 Cy 0 前者大 不转移 程序往下执行 109 MOV R0 20H 前 后内容交换DECR0MOV R0 21HINCR0 修改地址指针 R0 1 SETB7FH 置位交换标志位2FH 7为1LP2 DJNZR2 LP1 修改内循环次数R2

温馨提示

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

评论

0/150

提交评论