《机械设计》PPT课件.ppt_第1页
《机械设计》PPT课件.ppt_第2页
《机械设计》PPT课件.ppt_第3页
《机械设计》PPT课件.ppt_第4页
《机械设计》PPT课件.ppt_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

第4章MCS 51汇编语言程序设计 4 1汇编语言程序设计概述4 1 1机器语言 汇编语言和高级语言用于程序设计的语言基本上分为3种 机器语言 汇编语言和高级语言 1 机器语言二进制代码表示的指令 数字和符号简称为机器语言不易懂 难记忆 易出错 2 汇编语言英文助记符表示的指令称为符号语言或汇编语言汇编语言特点 面向机器的语言 程序设计员须对MCS 51的硬件有相当深入的了解 助记符指令和机器指令一一对应 用汇编语言编写的程序效率高 占用存储空间小 运行速度快 用汇编语言能编写出最优化的程序 能直接管理和控制硬件设备 功能部件 它能处理中断 也能直接访问存储器及I O接口电路 汇编语言和机器语言都脱离不开具体机器的硬件 均是面向 机器 的语言 缺乏通用性 3 高级语言不受具体机器的限制 使用了许多数学公式和数学计算上的习惯用语 非常擅长于科学计算 常用的如BASIC FORTRAN以及C语言等 高级语言优点 通用性强 直观 易懂 易学 可读性好 使用C语言 C51 PL M语言来进行MCS 51的应用程序设计 对于程序的空间和时间要求很高的场合 汇编语言仍是必不可缺的 C语言和汇编语言混合编程在很多需要直接控制硬件的应用场合 则更是非用汇编语言不可使用汇编语言编程 是单片机程序设计的基本功之一4 1 2汇编语言语句的种类和格式两种基本类型 指令语句和伪指令语句 1 指令语句已在第3章介绍每一条指令语句在汇编时都产生一个指令代码 机器代码 2 伪指令语句是为汇编服务的 在汇编时没有机器代码与之对应 MCS 51的汇编语言的四分段格式如下 标号字段操作码字段操作数字段注释字段例4 1下面是一段汇编语言程序的四分段书写格式基本语法规则 1 标号字段是语句所在地址的标志符号标号字段操作码字段操作数字段注释字段START MOVA 00H 0 AMOVR1 10 10 R1MOVR2 00000011B 3 R2LOOP ADDA R2 A R2 ADJNZR1 LOOP R1内容减1不为零 则循环NOPHERE SJMPHERE 2美元符号 的使用用于表示该转移指令操作码所在的地址 例如 如下指令 JNBF0 与如下指令是等价的 HERE JNBF0 HERE再如 HERE SJMPHERE可写为 SJMP 4 2汇编语言源程序的汇编汇编语言源程序 翻译 成机器代码 指令代码 的过程称为 汇编 汇编可分为手工汇编和机器汇编两类 4 2 1手工汇编人工查表翻译指令 但遇到的相对转移指令的偏移量的计算 要根据转移的目标地址计算偏移量 不但麻烦 且容易出错 4 2 2机器汇编用编辑软件进行源程序的编辑 编辑完成后 生成一个ASCII码文件 扩展名为 ASM 然后在微计算机上运行汇编程序 把汇编语言源程序翻译成机器代码 交叉汇编 汇编后的机器代码是在另一台计算机 这里是单片机 上运行 MCS 51单片机的应用程序的完成 应经过三个步骤 1 在微计算机上 运行编辑程序进行源程序的输入和编辑 2 对源程序进行交叉汇编得到机器代码 3 通过微计算机的串行口 或并行口 把机器代码传送到用户样机 或在线仿真器 进行程序的调试和运行 反汇编 分析现成产品的程序 要将二进制的机器代码语言程序翻译成汇编语言源程序 4 3汇编语言实用程序设计4 3 3查表程序设计数据补偿 修正 计算 转换等各种功能 具有程序简单 执行速度快等优点 查表就是根据自变量x 在表格中寻找y 使y f x 执行查表指令时 发出读程序存储器选通脉冲 PSEN 在MCS 51的指令系统中 给用户提供了两条极为有用的查表指令 MOVCA A DPTR MOVCA A PC指令 MOVCA A DPTR 完成把A中的内容作为一个无符号数与DPTR中的内容相加 所得结果为某一程序 指令执行完 PC的内容不发生变化 仍指向查表指令的下一条指令 优点在于预处理较少且不影响其它特殊功能寄存器的值 所以不必保护其它特殊功能寄存器的原先值 缺点在于该表格只能存放在这条指令的地址X3X2X1X0以下的00 FFH之中 表格所在的程序空间受到了限制 例4 1子程序的功能为 根据累加器A中的数x 0 9之间 查x的平方表y 根据x的值查出相应的平方y x和y均为单字节数 地址子程序Y3Y2Y1Y0ADDA 01HY3Y2Y1Y0 2MOVCA A PCY3Y2Y1Y0 3RETY3Y2Y1Y0 4DB00H 01H 04H 09H 10HDB19H 24H 31H 40H 51H第1条指令ADDA 01H的作用是加上偏移量 可以根据A的内容查出X对应的平方 MOVCA A DPTR这条指令的应用范围较为广泛 一般情况下 大多使用该指令 使用该指令时不必计算偏移量 使用该指令的优点是表格可以设在64K程序存储器空间内的任何地方 而不像MOVCA A PC那样只设在PC下面的256个单元中 使用较方便 上面的程序可改成如下形式 PUSHDPH 保存DPHPUSHDPL 保存DPLMOVDPTR TAB1MOVCA A DPTRPOPDPL 恢复DPLPOPDPH 恢复DPHRETTAB1 DB00H 01H 04H 09H 10HDB19H 24H 31H 40H 51H例4 2在一个以MCS 51为核心的温度控制器中 温度传感器输出的电压与温度为非线性关系 传感器输出的电压已由A D转换为10位二进制数 根据测得的不同温度下的电压值数据构成一个表 表中放温度 值y x为电压值数据 设测得的电压值x放入R2R3中 根据电压值x 查找对应的温度值y 仍放入R2R3中 本例的x和y均为双字节无符号数 程序如下 LTB2 MOVDPTR TAB2MOVA R3CLRCRLCAMOVR3 AXCHA R2RLCAXCHR2 AADDA DPL R2R3 DPTR DPTR MOVDPL AMOVA DPHADDCA R2MOVDPH ACLRAMOVCA A DPTR 查第一字节MOVR2 A 第一字节存入R2中CLRAINCDPTRMOVCA A DPTR 查第二字节MOVR3 A 第二字节存入R3中RETTAB2 DW 温度值表 例4 3设有一个巡回检测报警装置 需对16路输入进行检测 每路有一最大允许值 为双字节数 运行时 需根据测量的路数 找出每路的最大允许值 看输入值是否大于最大允许值 如大于就报警 根据上述要求 编一个查表程序 取路数为x 0 x15 y为最大允许值 放在表格中 设进入查表程序前 路数x已放于R2中 查表后最大值y放于R3R4中 本例中的x为单字节数 y为双字节数 查表程序如下 TB3 MOVA R2ADDA R2 R2 2 A MOVR3 A 保存指针ADDA 6 加偏移量 MOVCA A PC 查第一字节XCHA R3ADDA 3MOVCA A PC 查第二字节MOVR4 ARETTAB3 DW1520 3721 42645 7580 最大值 表DW3483 32657 883 9943DW10000 40511 6758 8931DW4468 5871 13284 27808 表格长度不能超过256个字节 且表格只能存放于MOVCA A PC指令以下的256个单元中 查表指令 MOVCA A PC MOVCA A DPTR 的区别1 MOVCA A PC表格长度不能超过256个字节 且表格只能存放于MOVCA A PC指令以下的256个单元中 MOVCA A DPTR表格可以设在64K程序存储器空间内的任何地方2 MOVCA A PCPC是执行完本条指令后 指向下一条指令的地址 需加上偏移量MOVCA A DPTR不需要加偏移量 3 根据表中指令的字节数不同 A分别乘以1 2或3 从表中取指令时 也要分1 2或3次进行 单字节指令A A 1 双字节指令A A 2 基址 0 基址 1 基址 2 A 0对应的一条指令 A 1对应的一条指令 三字节指令A A 3 基址 3 基址 4 基址 5 4 3 5数据极值查找程序设计在指定的数据区中找出最大值 或最小值 进行数值大小的比较 从这批数据中找出最大值 或最小值 并存于某一单元中 例4 9已知内部RAMADDR为起始的数据块内数据是无符号数 块长在LEN单元内 找出数据块中最大值并存入MAX单元 程序如下 ORG2000HLENDATA20HMAXDATA22HMOVMAX 00H MAX单元清零MOVR0 ADDR ADDR送R0LOOP MOVA R0 数块中某数送ACJNEA MAX NEXT1 A和 MAX 比较NEXT1 JCNEXT 若A MAX 则NEXTMOVMAX A 若A MAX 则大数送MAXNEXT INCR0 修改数据块指针0DJNZLEN LOOP 若未完 则转LOOPHERE SJMPHEREEND 4 3 6数据排序程序设计升序排 降序排 仅介绍无符号数据升序排 冒泡法 相邻数互换的排序方法 类似水中气泡上浮 排序时从前向后进行相邻两个数的比较 次序与要求的顺序不符时 就将两个数互换 顺序符合要求不互换 假设有7个原始数据的排列顺序为 6 4 1 2 5 7 3 第一次冒泡的过程是 6 4 1 2 5 7 3 原始数据的排列4 6 1 2 5 7 3 逆序 互换4 1 6 2 5 7 3 逆序 互换4 1 2 6 5 7 3 逆序 互换4 1 2 5 6 7 3 逆序 互换 4 1 2 5 6 7 3 正序 不互换4 1 2 5 6 3 7 逆序 互换 第一次冒泡结束如此进行 各次冒泡的结果如下 第1次冒泡结果 4 1 2 5 6 3 7第2次冒泡结果 1 2 4 5 3 6 7第3次冒泡结果 1 2 4 3 5 6 7第4次冒泡结果 1 2 3 4 5 6 7 已完成排序第5次冒泡结果 1 2 3 4 5 6 7第6次冒泡结果 1 2 3 4 5 6 7对于n个数 理论上应进行 n 1 次冒泡 有时不到 n 1 次就已完成排序 如何判定排序是否已完成 看各次冒泡中是否有互换发生 如果有数据互换 则排序还没完成 在程序设计中 常使用设置互换标志的方法 该标志的状态表示在一次冒泡中是否有互换进行 例4 10假设8个数连续存放在20H为首地址的内部RAM单元中 使冒泡法进行升序排序编程 设R7为比较次数计数器 初值为07H TR0为冒泡过程中是否有数据互换的状态标志 TR0 0表示无互换发生 TR 1表明有互换发生 按前述冒泡序算法 程序如下 SORT MOVR0 20H 数据存储区首单元地址MOVR7 07H 各次冒泡比较次数CLRTR0 互换标志清 0 LOOP MOVA R0 取前数MOV2BH A 存前数INCR0MOV2AH R0 取后数CLRCSUBBA R0 前数减后数JCNEXT 前数小于后数 不互换MOV R0 2BHDECR0MOV R0 2AH 两个数交换位置INCR0 准备下一次比较SETBTR0 置互换标志NEXT DJNZR7 LOOP 返回 进行下一次比较JBTR0 SORT 返回 进行下一次冒泡HERE SJMPHERE 排序结束 4 3 7散转移程序设计一 使用转移指令的散转程序JMP A DPTR需根据某一单元的内容是0 1 n 来分别转向处理程序0 处理程序1 处理程序n 一个典型的例子就是当单片机系统中的键盘按下时 就会得到一个键值 根据不同的键值 跳向不同的键处理程序入口 对于这种情况 可用直接转移指令 LJMP或AJMP指令 组成一个转移表 利用间接转移指令实现分支转移 例4 12根据寄存器R2的内容 转向各个处理程序PRGX X 0 n R2 0 转PRG0 R2 1 转PRG1 R2 n 转PRGn JMP1 MOVDPTR TBJ1MOVA R2ADDA R2 R2 2 A JNCNADDINCDPH R2 2 256NADD JMP A DPTRTBJ1 AJMPPRG0AJMPPRG1 AJMPPRGn 二 使用地址偏移量的散转程序例按R2的内容转向6个处理程序JMP3 MOVA R2MOVDPTR TBJ3MOVCA A DPTR 从表中读取变址JMP A DPTRTBJ3 DBPRG0 TBJ3DBPRG1 TBJ3 DBPRG5 TBJ3PRG0 处理程序0PRG1 处理程序1PRG2 处理程序2PRG3 处理程序3PRG4 处理程序4PRG5 处理程序5 4 3 8循环程序设计计数循环结构DJNZRn rel 工作寄存器作控制计数器1 单循环定时程序例MOVR5 TIMELOOP NOP1TNOP1TDJNZR5 LOOP2T循环体为4T 若晶振为6MHz 则T 12 fosc 2 s一次循环延迟时间 4 T 8 s程序的延迟时间 8 TIME s 该程序最大延迟时间 256 8 2048 s 2 多重循环定时例4 1650ms延时程序 延时程序与MCS 51指令执行时间有很大的关系 在使用12MHz晶振时 一个机器周期为1 s 执行一条DJNZ指令的时间为2 s 这时 可用双重循环方法写出下面如下的延时50ms的程序 DEL MOVR7 200DEL1 MOVR6 125DEL2 DJNZR6 DEL2 125 2 250 sDJNZR7 DEL1 0 25ms 200 50msRET 以上延时程序不太精确 它没有考虑到除 DJNZR6 DEL2 指令外的其它指令的执行时间 如把其它指令的执行时间计算在内 它的延时时间为 DEL MOVR7 2001TDEL1 MOVR6 1251TDEL2 DJNZR6 DEL2 125 2 250 s2TDJNZR7 DEL12T 250 1 2 200 1 50 301ms如果要求比较精确的延时 可按如下修改 DEL MOVR7 2001TDEL1 MOVR6 1231TNOP1TDEL2 DJNZR6 DEL2 123 2TDJNZR7 DEL1 1 1 123 2 2 200 1 50001T 500001 s 50 001ms实际延迟时间为50 001ms 注意 软件延时程序 不允许有中断 否则将严重影响定时的准确性 采用增减指令对定时程序进行微调MOVR0 TIME1TLOOP ADDA R11TINCDPTR2TDJNZR0 LOOP2T在6MHz晶振下 机器周期T 12 fosc 2 s定时时间为 5 2 TIME s 假设定时时间要求为24 s 可以调整循环体的机器周期 MOVR0 TIME1TLOOP ADDA R11TINCDPTR2TNOP1TDJNZR0 LOOP2T使TIME 2定时时间 6 2 s 2 24 s 4 3 8定点数运算程序设计 1 定点数的表示法1 原码 符号位 0正数符号位 1负数加减运算时 必须按符号位的不同执行不同的运算 正数 N补 N原2 补码 N补 数值位取反 1负数 2n 数值n是整数的位数补码可直接带符号位进行运算 用OV位表示溢出与否 补码表示法的优点是加减运算方便 83 10 4 10 01010011 2 11111100 2 01001111 2 79 10补码表示的数在执行乘除运算时 先转换成原码 在执行原码乘除 最后把积转换成补码 例双字节数取补子程序 R4R5 取补 R4R5 CMPT MOVA R5CPLAADDA 1MOVR5 AMOVA R4CPLAADDCA 0MOVR4 ARET 2 带符号数的移位带符号数进行算数移位时 必须保持最高位不变 1 正数 左移右移都移入0 2 负数 原码表示 符号位不变 左移右移都移入0补码表示 符号位不变 右移移入1 左移移入0例双字节原码左移一位子程序 R2R3 左移一位 R2R3 MOVA R3CLRC 保证让左移移入0RLCAMOVR3 AMOVA R2RLCAMOVA 7 C 恢复符号位MOVR2 A R2 R3 C 0 符号位不变 例双字节原码右移一位子程序 R2R3 右移一位 R2R3 0MOVA R2MOVC A 7 保护符号位CLRA 7 移入0RRCAMOVR2 AMOVA R3RRCAMOVR3 A R2 R3 C C 符号位不变 A R2 C 符号位 0 例双字节补码右移一位子程序功能 R2R3 右移一位 R2R3 MOVA R2MOVC A 7 保护符号位RRCA 移入符号位MOVR2 AMOVA R3RRCAMOVR3 A R2 R3 C 符号位不变 1 C A R2 C 符号位 1 三 定点数加减运算原码的加减运算需根据符号位和不同的运算进行分类操作 补码加减运算非常方便 一般采用补码进行加减运算 例双字节补码加法子程序 R2R3 R6R7 R4R5 MOVA R3ADDA R7MOVR5 AMOVA R2ADDCA R6MOVR4 A 四 定点数乘法运算1 无符号数二进制乘法A 1011B 100110111001101100000000 10111100011乘积A B 乘数左移与部分积相加 部分积右移 被乘数 算法 从低位开始检查各个乘数的位数 乘数右移 若乘数位数为1 部分积右移 被乘数 部分积 若乘数位数为0 部分积右移 部分积 2 MCS 51快速乘法把MCS51的单字节运算扩展为双字节的乘法计算原理R2R3R6R7 R3R7 H R3R7 L R2R7 H R2R7 L R3R6 H R3R6 L R2R6 H R2R6 L R4 R5 R6 R7 例无符号双字节快速乘法 R2R3 R6R7 R4R5R6R7 MOVA R3MOVB R7MULAB R3R7 BAXCHA R7R7 R3R7 LMOVR5 B B R5 R3R7 HMOVB R2MULABR2R7 BAADDA R5A R2R7 L R3R7 HMOVR4 AR4 R2R7 L R3R7 HCLRAADDCA BMOVR5 A R5 R2R7 H 4 3 9码制转换程序设计在单片机应用程序的设计中 经常涉及到各种码制的转换问题 在单片机系统内部经常采用二进制码 在输入 输出中 按照人的习惯均采用代表十进制数的BCD码表示 此外 打印机要打印某数字字符 则需要将该数字的二进制码转换为该字符的ASCII码 转换类型包括 二进制码与ASCII码之间的转换二进制与BCD码之间的转换一 二进制码与ASCII码之间的转换由ASCII码字符表可知 0 9的ASCII码为30H 39H A F的ASCII码为41H 46H 例R0的低4位是一个二进制数 表示 0 F 把它数码转换为ASCII代码并存入R0说明 二进制 30H 其ASCII代码二进制 9 二进制 40H 其ASCII代码二进制 9 三种方法 1 若R0 9R0 30H R0 若R0 9R0 37H R0 2 利用DAA指令 3 查表 方法一 ORG0400HMOVA R0 取转换值送AANLA 0FH 屏蔽高四位ADDA 90H A中内容 90HDAA 十进制调整ADDCA 40H A中内容 40HDAA 十进制调整MOVR0 A 存转换结果SJMP 结束END 方法二 利用DAA指令 方法三 查表ORG0400HMOVA R0ANLA 0FH 屏蔽高4位ADDA 03H 地址调整MOVCA A PC 查表MOVR0 A 存结果SJMP ASCTAB DB 0 1 2 3 4 DB 5 6 7 8 9 DB A B C D E F END 多位十六进制数转换成ASCII码思路 低四位转换成ASCII高四位转换成ASCII 循环体完成一个字节十六进制数的转换 字节 1不为0转移 结束 例多位十六进制数转换为ASCII码入口 R0 十六进制数低位地址指针 R2 字节数出口 R1 ASCII码地址指针 二 二进制码到BCD码的转换二进制 1111001B 121D BCD码 一个字节表示一个BCD码 00000001 00000010 1 2 00000001 1 压缩BCD码 一个字节表示2个BCD码 方法一 通过除以1000 100 10等10的次幂 获得千 百 十位数 例8位二进制数转换成BCD数 A 为二进制数 R0为十位数和个位数地址指针 压缩的BCD码 MOVB 100DIVAB A 百位数MOV R0 A 存入RAMINCR0 MOVA 10XCHA BDIVA B A 十位数 B 个位数SWAPAADDA B 合成到 A MOV R0 A存入RAM 该方法的缺点 被转换数较大时 需进行多字节除法运算 运算速度较慢 程序缺乏通用性 方法二 Y an 2n an 1 2n 1 an 2 2n 2 a0 an 2 an 1 2 an 2 2 2 a0 每次相加时进行BCD码调整 例双字节二进制数转换为BCD数入口 R2R3 为双字节16位二进制数出口 R4R5R6为转换完的压缩BCD码 Y a7 27 a6 26 a5 25 a0 a7 2 a6 2 a5 2 2 a0 每次相加时进行BCD码调整 计算结果 2 R2R3的次高位 计算结果 R2R3 C 二进制位数 1 0 结束 R4R5R6清零 N Y Y a7 27 a6 26 a5 25 a0 a7 2 a6 2 a5 2 2 a0 DAA调整 例双字节二进制数转换为BCD数入口 R2R3 为双字节16位二进制数出口 R4R5R6为转换完的压缩BCD码 R2R3 C LOOP

温馨提示

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

评论

0/150

提交评论